diff --git a/.circleci/config.yml b/.circleci/config.yml index ac71ee446c..0b021d8b94 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,272 +1,146 @@ -version: 2 +version: 2.1 -dependencies: - pre: - - curl -L -o google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - - sudo dpkg -i google-chrome.deb - - sudo sed -i 's|HERE/chrome\"|HERE/chrome\" --disable-setuid-sandbox|g' /opt/google/chrome/google-chrome - - rm google-chrome.deb jobs: build: - docker: - - image: cimg/php:8.1.12-node - name: restarters.test - environment: - - DB_CONNECTION: mysql - - DB_HOST: 127.0.0.1 - - DB_PORT: 3306 - - DB_DATABASE: restarters_db - - DB_USERNAME: restarters - - DB_PASSWORD: s3cr3t - - TZ: "UTC" - - image: cimg/mysql:8.0 - environment: - # You can connect once ssh'd in using mysql -u root -p -h 127.0.0.1 - - MYSQL_ROOT_PASSWORD: s3cr3t - - MYSQL_DATABASE: restarters_db - - MYSQL_USER: restarters - - MYSQL_PASSWORD: s3cr3t - - image: mcr.microsoft.com/playwright:focal - environment: - NODE_ENV: development - TZ: "UTC" - - image: 'bitnami/mariadb:latest' - name: mariadb - environment: - - ALLOW_EMPTY_PASSWORD=yes - - MARIADB_PORT_NUMBER=3307 - - MARIADB_USER=bn_mediawiki - - MARIADB_DATABASE=bitnami_mediawiki - - image: 'bitnami/mediawiki-archived:1' - name: mediawiki - labels: - kompose.service.type: nodeport - environment: - - MEDIAWIKI_DATABASE_HOST=mariadb - - MEDIAWIKI_DATABASE_PORT_NUMBER=3307 - - MEDIAWIKI_DATABASE_USER=bn_mediawiki - - MEDIAWIKI_DATABASE_NAME=bitnami_mediawiki - - ALLOW_EMPTY_PASSWORD=yes - - MEDIAWIKI_EXTERNAL_HTTP_PORT_NUMBER=8080 - - MEDIAWIKI_HOST=mediawiki - - TZ: "UTC" - depends_on: - - mariadb - entrypoint: - - /bin/bash - - -c - - sleep 60; /opt/bitnami/scripts/mediawiki/entrypoint.sh "/opt/bitnami/scripts/apache/run.sh" - - image: 'docker.io/bitnami/postgresql:11' - name: postgresql -# No volumes on CircleCI -# volumes: -# - 'postgresql_data:/bitnami/postgresql' - environment: - - ALLOW_EMPTY_PASSWORD=yes - - POSTGRESQL_USERNAME=bn_discourse - - POSTGRESQL_DATABASE=bitnami_discourse -# No networks on CircleCI -# networks: -# - app-network - - - image: docker.io/bitnami/redis:6.0 - name: restarters_discourse_redis - environment: - - ALLOW_EMPTY_PASSWORD=yes -# volumes: -# - 'redis_data:/bitnami/discourse' -# networks: -# - app-network - - - image: docker.io/bitnami/discourse:2 - name: restarters_discourse -# No ports on CircleCI -# ports: -# - '8003:80' -# volumes: -# - 'discourse_data:/bitnami/discourse' - depends_on: - - postgresql - - restarters_discourse_redis - environment: - - ALLOW_EMPTY_PASSWORD=yes - - DISCOURSE_USERNAME=someuser - - DISCOURSE_PASSWORD=mustbetencharacters - - DISCOURSE_HOST=www.example.com:8003 - - DISCOURSE_PORT_NUMBER=80 - - DISCOURSE_DATABASE_HOST=postgresql - - DISCOURSE_DATABASE_PORT_NUMBER=5432 - - DISCOURSE_DATABASE_USER=bn_discourse - - DISCOURSE_DATABASE_NAME=bitnami_discourse - - DISCOURSE_REDIS_HOST=restarters_discourse_redis - - DISCOURSE_REDIS_PORT_NUMBER=6379 - - POSTGRESQL_CLIENT_POSTGRES_USER=postgres - - POSTGRESQL_CLIENT_CREATE_DATABASE_NAME=bitnami_discourse - - POSTGRESQL_CLIENT_CREATE_DATABASE_EXTENSIONS=hstore,pg_trgm - - DISCOURSE_EXTRA_CONF_CONTENT=personal_message_enabled_groups \= 10 -# networks: -# - app-network - - - image: docker.io/bitnami/discourse:latest - name: restarters_discourse_sidekiq - depends_on: - - restarters_discourse -# volumes: -# - 'sidekiq_data:/bitnami/discourse' - command: /opt/bitnami/scripts/discourse-sidekiq/run.sh - environment: - - ALLOW_EMPTY_PASSWORD=yes - - DISCOURSE_HOST=www.example.com - - DISCOURSE_DATABASE_HOST=postgresql - - DISCOURSE_DATABASE_PORT_NUMBER=5432 - - DISCOURSE_DATABASE_USER=bn_discourse - - DISCOURSE_DATABASE_NAME=bitnami_discourse - - DISCOURSE_REDIS_HOST=restarters_discourse_redis - - DISCOURSE_REDIS_PORT_NUMBER=6379 -# networks: -# - app-network + machine: + image: ubuntu-2204:current + resource_class: large + environment: + - TZ: "UTC" steps: - checkout - - run: sudo bash -c "echo 'Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries" - - run: sudo apt update - - run: sudo apt install dnsutils openssl zip unzip git libxml2-dev libzip-dev zlib1g-dev libcurl4-openssl-dev iputils-ping default-mysql-client vim libpng-dev libgmp-dev libjpeg-turbo8-dev - - run: sudo apt-get install php-xmlrpc php8.1-intl php8.1-xdebug php8.1-mbstring php8.1-simplexml php8.1-curl php8.1-zip postgresql-client php8.1-gd php8.1-xmlrpc php8.1-mysql php-mysql - - run: sudo pecl install xdebug - - # We now need Node 18 for Playwright. - - run: sudo curl -sL https://deb.nodesource.com/setup_18.x | sudo bash - - - run: sudo apt update - - run: sudo apt -y install nodejs - - run: sudo rm /usr/local/bin/node - - - run: cp .env.example .env - - # Need access to timezones. - - run: mysql --host="127.0.0.1" -u root -ps3cr3t -e "GRANT SELECT ON mysql.time_zone_name TO 'restarters'@'%';" - - # We have Discourse on CircleCI. The API key is inserted using psql below. - - run: sed -i 's/FEATURE__DISCOURSE_INTEGRATION=.*$/FEATURE__DISCOURSE_INTEGRATION=true/g' .env - - run: sed -i 's/DISCOURSE_URL=.*$/DISCOURSE_URL=http:\/\/restarters_discourse/g' .env - - run: sed -i 's/DISCOURSE_APIKEY=.*$/DISCOURSE_APIKEY=fb71f38ca2b8b7cd6a041e57fd8202c9937088f0ecae7db40722bd758dda92fc/g' .env - - run: sed -i 's/DISCOURSE_APIUSER=.*$/DISCOURSE_APIUSER=someuser/g' .env + + # Install Task + - run: + name: Install Task + command: | + sudo sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin + task --version - # ...and Mediawiki. - # Disable wiki as problems getting that running. - # - run: sed -i 's/FEATURE__WIKI_INTEGRATION=.*$/FEATURE__WIKI_INTEGRATION=true/g' .env - - run: sed -i 's/WIKI_URL=.*$/WIKI_URL=http:\/\/mediawiki:8080/g' .env - - run: sed -i 's/WIKI_DB=.*$/WIKI_DB=bitnami_mediawiki/g' .env - - run: sed -i 's/WIKI_USER=.*$/WIKI_USER=user/g' .env - - run: sed -i 's/WIKI_PASSWORD=.*$/WIKI_PASSWORD=bitnami123/g' .env - - run: sed -i 's/WIKI_APIUSER=.*$/WIKI_APIUSER=user/g' .env - - run: sed -i 's/WIKI_APIPASSWORD=.*$/WIKI_APIPASSWORD=bitnami123/g' .env + # Set up environment file + - run: + name: Setup environment + command: | + cp .env.example .env + + # Configure for Docker Compose setup + sed -i 's/DB_HOST=.*$/DB_HOST=restarters_db/g' .env + sed -i 's/DB_DATABASE=.*$/DB_DATABASE=restarters_db_test/g' .env + sed -i 's/DB_USERNAME=.*$/DB_USERNAME=restarters/g' .env + sed -i 's/DB_PASSWORD=.*$/DB_PASSWORD=s3cr3t/g' .env + + # Configure Discourse integration + sed -i 's/FEATURE__DISCOURSE_INTEGRATION=.*$/FEATURE__DISCOURSE_INTEGRATION=true/g' .env + sed -i 's/DISCOURSE_URL=.*$/DISCOURSE_URL=http:\/\/restarters_discourse/g' .env + sed -i 's/DISCOURSE_APIKEY=.*$/DISCOURSE_APIKEY=fb71f38ca2b8b7cd6a041e57fd8202c9937088f0ecae7db40722bd758dda92fc/g' .env + sed -i 's/DISCOURSE_APIUSER=.*$/DISCOURSE_APIUSER=someuser/g' .env + + # Configure for testing + sed -i 's/APP_DEBUG=.*$/APP_DEBUG=false/g' .env + sed -i 's/SESSION_DOMAIN=.*$/SESSION_DOMAIN=localhost/g' .env + sed -i 's/HONEYPOT_DISABLE=.*$/HONEYPOT_DISABLE=TRUE/g' .env + sed -i 's/APP_URL=.*$/APP_URL=http:\/\/localhost:8001/g' .env + + # Add environment variables from CircleCI + echo "" >> .env + echo "GOOGLE_API_CONSOLE_KEY=$GOOGLE_API_CONSOLE_KEY" >> .env + echo "MAPBOX_TOKEN=$MAPBOX_TOKEN" >> .env + + # Start Docker services using Task + - run: + name: Start Docker services + command: | + # Set environment variable for CircleCI detection + export CIRCLECI=true + # Enable Docker Compose bake for build optimization + export COMPOSE_BAKE=true + # Start all services using Task + task docker:up-all + no_output_timeout: 10m - # Playwright needs the debug bar not to appear - - run: sed -i 's/APP_DEBUG=.*$/APP_DEBUG=FALSE/g' .env + # Wait for services to be ready (includes build completion and restart detection) + - run: + name: Wait for services + command: | + task docker:wait-for-services-all - # ...and runs on localhost. - - run: sed -i 's/SESSION_DOMAIN=.*$/SESSION_DOMAIN=localhost/g' .env + # Setup database and application + - run: + name: Setup application + command: | + # Grant timezone access - run directly on MySQL container + docker exec restarters_db mysql -u root -ps3cr3t -e "GRANT SELECT ON mysql.time_zone_name TO 'restarters'@'%';" - # ...and needs honeypot rate-limiting needs to be turned off. - - run: sed -i 's/HONEYPOT_DISABLE=.*$/HONEYPOT_DISABLE=TRUE/g' .env + # Setup additional configuration needed for CI (most setup already done by docker_run.sh) + # Set MySQL function creators using session variable (compatible with MySQL 5.7) + docker exec restarters_db mysql -u root -ps3cr3t -e "SET GLOBAL log_bin_trust_function_creators = 1;" - - run: wget https://getcomposer.org/composer-2.phar -O composer.phar; rm -rf vendor; echo Y | php8.1 composer.phar install - - run: npm install - - run: php artisan lang:js --no-lib resources/js/translations.js - - run: npx playwright install - - run: npx playwright install-deps - - run: npm install -D @playwright/test + # Disable ONLY_FULL_GROUP_BY for compatibility with getItemTypes() query + docker exec restarters_db mysql -u root -ps3cr3t -e "SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));" - - run: php artisan key:generate - - run: mysql --host="127.0.0.1" -u root -ps3cr3t -e "SET PERSIST log_bin_trust_function_creators = 1;" - - run: php artisan migrate - - run: php artisan l5-swagger:generate + # Generate additional Laravel artifacts for testing + docker exec restarters php artisan l5-swagger:generate - - run: wget -O phpunit https://phar.phpunit.de/phpunit-9.phar ; chmod +x phpunit + # Setup Discourse API + - run: + name: Setup Discourse + command: | + # Add API key to Discourse - run directly on PostgreSQL container + docker exec postgresql psql -U postgres -c "INSERT INTO api_keys (id, user_id, created_by_id, created_at, updated_at, allowed_ips, hidden, last_used_at, revoked_at, description, key_hash, truncated_key) VALUES (1, NULL, 1, '2021-10-25 13:56:20.033338', '2021-10-25 13:56:20.033338', NULL, false, NULL, NULL, 'Restarters', 'd89e9dfacfb611fbaf004807648187ce7ed474df44dcb0ada230fab5c8dd6a5b', '9fd7');" bitnami_discourse + + # Configure Discourse settings + docker exec restarters php artisan discourse:setting personal_message_enabled_groups 10 - # The phpunit and playwright tests require an uploads directory in a slightly different place. Not really - # worth fixing. - - run: mkdir uploads - - run: mkdir public/uploads + # Run PHPUnit tests + - run: + name: Run PHPUnit tests + command: | + # Run PHPUnit tests using Task for consistency with local development + task docker:test:phpunit + # Copy test results to host + docker cp restarters:/tmp/phpunit-results.xml /tmp/test-results/phpunit/results.xml + no_output_timeout: 45m - # Wait for Discourse to finish initialising. - - run: while ! nc -z restarters_discourse 80; do sleep 1 ; done + # Run Jest tests + - run: + name: Run Jest tests + command: | + # Run Jest tests using Task for consistency with local development + task docker:test:jest + # Copy test results to host if they exist + docker cp restarters:/tmp/test-results/junit.xml /tmp/test-results/jest/junit.xml || echo "Jest results not found, skipping" - # Add the config we need. - - run: psql -h postgresql -U postgres -c "INSERT INTO api_keys (id, user_id, created_by_id, created_at, updated_at, allowed_ips, hidden, last_used_at, revoked_at, description, key_hash, truncated_key) VALUES (1, NULL, 1, '2021-10-25 13:56:20.033338', '2021-10-25 13:56:20.033338', NULL, false, NULL, NULL, 'Restarters', 'd89e9dfacfb611fbaf004807648187ce7ed474df44dcb0ada230fab5c8dd6a5b', '9fd7');" bitnami_discourse - - run: php artisan discourse:setting personal_message_enabled_groups 10 + # Run main Playwright tests (excluding autocomplete) + - run: + name: Run main Playwright tests + command: | + # Run Playwright tests using Task for consistency with local development + task docker:test:playwright + no_output_timeout: 10m - # Run phpunit. Discourse makes things slow, so up the timeout. + # Copy test results and artifacts - run: - command: export XDEBUG_MODE=coverage;./phpunit -d memory_limit=1024M --bootstrap vendor/autoload.php --coverage-clover tests/clover.xml --configuration ./phpunit.xml - no_output_timeout: 45m + name: Copy Playwright artifacts + command: | + # Create test results directory on host + mkdir -p /tmp/test-results/playwright + mkdir -p /tmp/test-results/logs - # Coveralls is pernickety about the location it uploads from existing. - - run: mkdir build; mkdir build/logs; php vendor/bin/php-coveralls -v -x tests/clover.xml + # List what's available in the playwright container + docker exec restarters_playwright bash -c "ls -la /tmp/test-results/* || echo 'No playwright directories found'" - # Run the Jest tests. - - run: npm run jest + # Copy test results and artifacts from playwright container to host + docker cp restarters_playwright:/tmp/test-results/. /tmp/test-results/playwright/ || echo "Playwright HTML report not found" - # Run the Playwright tests. - # - # Zap groups set up by the UT; this can confuse Playwright tests. - - run: mysql --host="127.0.0.1" -u root -ps3cr3t -e "use restarters_db;SET foreign_key_checks=0;DELETE FROM \`groups\` WHERE location IS NULL;SET foreign_key_checks=1;" - - run: php artisan cache:clear - # Ignore the return code from the tinker; the user might exist from the phpunit tests. If it doesn't and - # the create fails, the tests will fail too. - - run: echo "App\User::create(['name'=>'Jane Bloggs','email'=>'jane@bloggs.net','password'=>Hash::make('passw0rd'),'role'=>2,'consent_past_data'=>'2021-01-01','consent_future_data'=>'2021-01-01','consent_gdpr'=>'2021-01-01']);" | php artisan tinker || true - # Build the web app. - - run: export NODE_OPTIONS=--max-old-space-size=8192; npm rebuild node-sass; npm run prod - - run: npx playwright install - # Set up a real nginx/fpm server. This improves the speed of the tests enormously as artisan serve uses the - # single-threaded php built-in web server. - - run: sudo apt-get install nginx php8.1-fpm php8.1-mysql php8.1-pdo - - run: sudo cp /home/circleci/project/.circleci/nginx.conf /etc/nginx/sites-available/default - - run: sudo sed -i 's/www-data/circleci/g' /etc/php/8.1/fpm/pool.d/www.conf - - run: sudo /etc/init.d/php8.1-fpm start - - run: sudo sed -i 's/user .*;/user circleci;/g' /etc/nginx/nginx.conf - - run: sudo /etc/init.d/nginx start - # We're running against localhost. - - run: sudo sed -i 's/APP_URL=.*$/APP_URL=http:\/\/localhost/g' /home/circleci/project/.env - # Fix up Google key from CircleCI config. - - run: cp .env /tmp/.env - - run: echo "" >> /tmp/.env - - run: echo GOOGLE_API_CONSOLE_KEY=$GOOGLE_API_CONSOLE_KEY >> /tmp/.env - - run: echo MAPBOX_TOKEN=$MAPBOX_TOKEN >> /tmp/.env - - run: sudo cp /tmp/.env /home/circleci/project/.env - # Comment out throttle:api in App/Http/Kernel.php otherwise it kicks in during Playwright tests. - - run: sudo sed -i 's/.throttle:api.,//g' /home/circleci/project/app/Http/Kernel.php + # Copy Vite log from restarters container for debugging + docker cp restarters:/tmp/vite.log /tmp/test-results/logs/vite.log || echo "Vite log not found" + when: always - # Determine which port to use for Playwright tests - - run: - name: Check if port 8000 is available - command: | - if nc -z localhost 8000; then - echo "export PLAYWRIGHT_BASE_URL=http://localhost:8000" >> $BASH_ENV - echo "Port 8000 is open, using localhost:8000" - else - echo "export PLAYWRIGHT_BASE_URL=http://localhost" >> $BASH_ENV - echo "Port 8000 not available, using localhost" - fi - - # Now run the tests. - - run: - name: Playwright Tests - no_output_timeout: 10m - command: | - source $BASH_ENV - # Enable debug logging for Playwright tests in CI - export PLAYWRIGHT_DEBUG=true - export DEBUG=playwright - npx playwright test --reporter=list - - # Store test artifacts (screenshots, videos, traces, test reports) + # Store artifacts - store_artifacts: path: /tmp/test-results destination: playwright-test-results - # Store test results for CircleCI UI - store_test_results: path: /tmp/test-results - - diff --git a/.gitignore b/.gitignore index 6bb8e49eef..384e0a4971 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,8 @@ restarters-anonymised.sql /public/css/app.css /public/css/wiki.css /.claude/settings.local.json +/public/build/ +/public/hot +/storage/api-docs/api-docs.json +/.phpunit.result.cache +/playwright-report/ diff --git a/CLAUDE.md b/CLAUDE.md index 6d24af4689..a6a613463a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,7 +44,7 @@ php artisan migrate # Run database migrations php artisan migrate:fresh # Fresh migration (drops all tables) php artisan seed # Run database seeders php artisan tinker # Laravel REPL -php artisan lang:js # Generate JavaScript translation files +# JavaScript translation files are now auto-generated by Vite laravel-translator plugin php artisan translations:check # Check translation completeness # Generate application key (for new installs) @@ -147,4 +147,7 @@ npm test - Only translate fr and fr-BE ## Development Warnings -- Don't try to test changes when you're running on Windows. \ No newline at end of file +- Don't try to test changes when you're running on Windows. + +## Workflow Guidelines +- When you create files, add them to git \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 886d43baa8..dae378e0f8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,11 +9,19 @@ RUN apt-get update && \ unzip \ npm \ vim \ + netcat-openbsd \ default-mysql-client \ postgresql-client && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* +# Install Playwright system dependencies +# We need to install @playwright/test first to get the install-deps command +RUN npm install -g @playwright/test && \ + npm install -g jest-junit && \ + npx playwright install-deps && \ + npm uninstall -g @playwright/test + ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/download/2.7.31/install-php-extensions /usr/local/bin/ RUN install-php-extensions \ @@ -23,6 +31,9 @@ RUN install-php-extensions \ xmlrpc \ xdebug \ intl \ + exif \ + pcntl \ + curl \ gd # Install composer. Don't run composer install yet - see docker_run.sh @@ -46,9 +57,10 @@ RUN if getent group ${GID}; then \ useradd -m -u ${UID} -g restarter -s /bin/bash restarter; \ fi -# Dynamically update php-fpm to use the new user and group +# Dynamically update php-fpm to use the new user and group, and listen on all interfaces RUN sed -i "s/user = www-data/user = restarter/g" /usr/local/etc/php-fpm.d/www.conf && \ - sed -i "s/group = www-data/group = restarter/g" /usr/local/etc/php-fpm.d/www.conf + sed -i "s/group = www-data/group = restarter/g" /usr/local/etc/php-fpm.d/www.conf && \ + sed -i "s/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/g" /usr/local/etc/php-fpm.d/www.conf # Copy the code (this will be overridden by the volume mount in docker-compose) COPY --chown=${UID}:${GID} . ./ diff --git a/Features.md b/Features.md new file mode 100644 index 0000000000..20673e19e9 --- /dev/null +++ b/Features.md @@ -0,0 +1,762 @@ +# Restarters.net Features + +This document provides a comprehensive overview of all features in the Restarters.net platform - a community repair event management and impact tracking system. + +## Overview + +Restarters.net (The Fixometer) is a data collection and visualization tool for community repair organizations. It helps repair groups organize events, track repairs, measure environmental impact, and engage volunteers. + +**Core Entities:** +- **Users** - Volunteers, hosts, and administrators +- **Groups** - Community repair organizations +- **Events (Parties)** - Community repair events +- **Devices** - Items brought for repair at events +- **Networks** - Regional networks of repair groups +- **Categories** - Device classification for impact calculation + +--- + +## User Roles + +- **Restarter** - Volunteer who attends repair events +- **Host** - Organizes and manages groups and events +- **Network Coordinator** - Regional oversight of multiple groups +- **Administrator** - Full platform access and configuration +- **Root** - Super administrator with all permissions + +--- + +## 1. Authentication & User Management + +
+User Registration & Onboarding + +### Registration Flow +- Multi-step registration process +- Email and password with validation (min 6 chars, matching confirmation) +- Password requirements: minimum length, case-sensitive +- Age verification (must be 18+) +- Profile information: name, age, gender, location, bio +- Optional skill selection during registration +- Email notification preferences opt-in +- GDPR/privacy consent tracking (past data, future data, cookies) +- Automatic Wiki and Discourse account creation on registration + +### Profile Management +- View and edit user profiles +- Upload profile images +- Update biographical information +- Manage location and contact details +- Language preference selection (EN, FR, FR-BE) +- Edit email notification preferences +- Skill management (add/remove repair skills) + +### Authentication +- Email/password login (case-insensitive emails) +- Password reset via email +- Remember me functionality +- Single Sign-On (SSO) with Discourse (Talk) +- Single Sign-On with MediaWiki +- Soft-delete user accounts with anonymization + +
+ +
+User Dashboard + +### Personalized Dashboard Views +- **Restarter Dashboard** - View followed groups, nearby events, impact stats +- **Host Dashboard** - Manage groups and events, view host-specific stats +- **Admin Dashboard** - Platform-wide statistics and moderation queue + +### Dashboard Components +- Getting started guide for new users +- Latest Discourse discussion topics +- Followed groups with upcoming events +- Quick "Add Data" section for recording repairs +- New groups nearby notifications +- Upcoming events in user's area +- Personal impact statistics + +
+ +--- + +## 2. Groups (Community Repair Organizations) + +
+Group Management + +### Creating Groups +- Create new community repair groups +- Group details: name, website, description, location +- Group images/logos +- Geocoded location with lat/long +- Network affiliation (for admins/network coordinators) +- Group area/region assignment +- Text cleaning and sanitization +- Approval workflow for new groups + +### Editing Groups +- Modify all group details +- Update images and descriptions +- Change location and contact information +- Manage network associations +- Set group tags for categorization +- Configure auto-approval settings for events + +### Group Membership +- Join and leave groups +- Invite users to groups via email +- Shareable invitation links (hash-based) +- View all group members +- Track hosts vs restarters +- Member activity tracking +- Remove members from groups + +### Group Roles & Permissions +- Promote restarters to hosts +- Multiple hosts per group +- Host permissions for event management +- Network coordinator oversight + +
+ +
+Browsing & Discovery + +### Finding Groups +- View all groups +- Search groups by name, location, tags +- Filter by network +- Find groups nearby using location +- View group statistics and impact +- Follow/unfollow groups + +### Group Information +- View group profile and description +- See upcoming and past events +- Group statistics dashboard: + - Total events held + - Total volunteers + - Participants count + - Devices repaired + - Waste prevented + - CO2 emissions diverted +- Embeddable statistics widget + +
+ +--- + +## 3. Events (Community Repair Events) + +
+Event Creation & Management + +### Creating Events +- Event name and description +- Associated group selection +- Date and time with timezone support +- Venue/location details (physical or online) +- Event images/photos +- Text cleaning and sanitization +- Geocoding for physical venues +- Calendar date picker +- Auto-calculated 3-hour duration +- Attendance capacity limits +- Online event support (no physical location required) + +### Editing Events +- Modify all event details +- Update date, time, and timezone +- Change venue information +- Add/remove event images +- Update description and notes +- Cancel events + +### Event Duplication +- Clone existing events to quickly create similar events +- Copy all event details with option to modify + +
+ +
+Event Invitations & Participation + +### Invitations +- Invite group volunteers to events +- Send invitations to specific email addresses +- Custom invitation messages +- Hash-based invitation links +- Email notifications for invitations +- Track invitation status (pending, accepted, declined) + +### RSVP & Attendance +- Accept/decline event invitations +- View list of invited volunteers +- View list of volunteers who attended +- Track volunteer attendance +- Record volunteer hours +- Add/remove volunteers from events + +
+ +
+Event Browsing & Filtering + +### Finding Events +- View upcoming events +- View past events +- Filter by group +- Filter by network +- Filter by date range +- Filter by tags +- Filter online vs in-person events +- Search events by name +- View events by geographic area + +### Event Views +- Event details page with full information +- Event statistics and impact +- List of attendees +- Devices repaired at event +- Event photos + +
+ +--- + +## 4. Devices & Repairs (The Fixometer) + +
+Device Recording + +### Adding Devices +- Quick data entry for devices repaired at events +- Device details: + - Category (electronics, textiles, furniture, etc.) + - Brand and model + - Age of device + - Problem description + - Repair status (Fixed, Repairable, End of Life) + - Spare parts required + - Assessment details +- Upload device images +- Link devices to specific events + +### Device Categories +- Powered devices (electronics with CO2 calculations) +- Unpowered devices (textiles, furniture, etc.) +- Category-specific properties: + - Average weight + - CO2 footprint per kg + - Reliability scores + - Cluster grouping + +### Repair Status Tracking +- **Fixed** - Successfully repaired +- **Repairable** - Could be fixed with more time/parts +- **End of Life** - Not economically repairable + +### Repair Barriers +- Track why repairs couldn't be completed: + - Spare parts unavailable + - Spare parts too expensive + - No repair information available + - Device cannot be opened + - Professional help required + +
+ +
+Device Management + +### Editing Devices +- Modify device details post-event +- Update repair status +- Add/remove device images +- Correct categorization +- Update problem descriptions +- Delete devices if needed + +### Device Search & Browse +- View all devices platform-wide +- Filter by category +- Filter by brand +- Filter by repair status +- Filter by event or group +- Search by model or description +- Sort by various criteria +- Pagination support + +### Device Images +- Upload multiple images per device +- Image resizing and optimization +- Delete unwanted images +- Link images to repair records + +
+ +--- + +## 5. Impact Tracking & Statistics + +
+Environmental Impact Calculations + +### Metrics Tracked +- **Waste Prevented** - Weight of devices kept out of landfill +- **CO2 Emissions Prevented** - Equivalent to manufacturing new devices +- **Devices Repaired** - Count by status (fixed, repairable, end of life) +- **Volunteer Hours** - Time contributed by volunteers +- **Participants** - Number of people attending events + +### Impact Visualization +- Global platform statistics +- Group-level statistics +- Event-level statistics +- Network-level statistics +- Comparison visualizations: + - CO2 as car driving distance + - CO2 as manufacturing equivalents + - Waste in meaningful units + +
+ +
+Reporting & Analytics + +### Available Reports +- Breakdown by country +- Breakdown by category +- Most commonly repaired devices +- Volunteer hour tracking +- Network performance reports +- Group performance reports +- Time-based trend analysis + +### Data Export +- CSV export capabilities: + - Devices by event + - Devices by group + - Devices globally + - Event statistics by group + - Event statistics by network +- Custom column selection +- Date range filtering + +### Embeddable Statistics +- JSON API for external embedding +- Mobile-optimized formats +- Share statistics on social media +- Downloadable statistics images + +
+ +--- + +## 6. Networks & Regional Coordination + +
+Network Management + +### Network Structure +- Regional networks organize groups +- Network-level coordination +- Network coordinators with oversight permissions +- Groups can belong to multiple networks + +### Network Features +- Associate groups to networks (admin only) +- View all groups in network +- View all events across network +- Network-wide statistics +- Network calendar feeds +- Network coordinators role with regional permissions + +### Network Coordination +- NetworkCoordinator role for regional oversight +- Permission to: + - View all groups in network + - View all events in network + - Edit groups in network (if affiliated) + - Moderate events in network + - View network statistics + +
+ +--- + +## 7. Administration + +
+User Administration + +### User Management +- View all users with search/pagination +- Create new users directly +- Edit any user profile +- Soft-delete users +- Manage user permissions granularly +- Assign repair directory roles +- Edit user email preferences +- Change user roles +- Track user activity via audit trail + +### Role Management +- View all roles and permissions +- Edit role definitions +- Configure permissions matrix +- Assign custom permissions beyond roles + +
+ +
+Content Management + +### Categories +- Create/edit/delete device categories +- Manage category properties: + - Name and description + - Average weight + - CO2 footprint per kg + - Reliability percentage + - Cluster assignment +- Life Cycle Assessment (LCA) data management + +### Brands +- Add device brands +- Edit brand names +- Delete brands +- Brand search and autocomplete + +### Skills +- Create volunteer skills +- Edit skill descriptions +- Delete skills +- Assign skills to categories + +### Group Tags +- Create group classification tags +- Edit tag names and descriptions +- Delete tags +- Assign tags to groups for organization + +
+ +
+Moderation + +### Approval Workflows +- Review new groups before approval +- Review new events before approval +- Moderate event photos +- Admin notifications for moderation queue + +### Platform Statistics +- View global impact metrics +- Monitor platform health +- Track user engagement +- View most active groups +- See trending device categories +- Abnormal device count alerts + +
+ +--- + +## 8. External Integrations + +
+Discourse Integration (Restarters Talk) + +### Features +- User account synchronization +- Single Sign-On (SSO) +- Auto-create Discourse groups for repair groups +- Fetch discussion topics by tag +- Display recent topics on dashboard +- Pull unread notifications +- Language preference sync +- Profile links + +
+ +
+MediaWiki Integration (Restarters Wiki) + +### Features +- User account sync tracking +- Wiki login credential management +- SSO integration + +
+ +
+WordPress Integration + +### Features +- Publish approved events to WordPress +- Publish group information +- XML-RPC API integration +- Automated content syndication + +
+ +
+Calendar Integration + +### Features +- iCalendar (.ics) export +- Personal calendar feeds (hash-authenticated) +- Group calendar feeds +- Network calendar feeds +- Geographic area calendar feeds +- Master platform calendar (secured) +- Event status tracking (confirmed/tentative/cancelled) +- Timezone support in calendar feeds + +
+ +
+Other Integrations + +### Geocoding +- Convert addresses to coordinates +- Display group locations on maps +- Find nearby groups by radius + +### Drip Email Marketing +- Subscriber management +- Campaign integration +- Track Drip subscriber IDs + +### Zapier +- Push audit data to Zapier +- Track changes to users, groups, events +- Webhook support for automation + +
+ +--- + +## 9. API + +
+Public API (No Authentication) + +### Endpoints +- `GET /api/homepage_data` - Global platform statistics +- `GET /api/party/{id}/stats` - Event statistics +- `GET /api/group/{id}/stats` - Group statistics +- `GET /api/outbound/info/{type}/{id}/{format}` - Impact visualizations +- `GET /api/devices/{page}/{size}` - Paginated device list +- `GET /api/talk/topics/{tag}` - Discourse topics +- `GET /api/timezones` - Available timezones + +
+ +
+Authenticated API (API Token Required) + +### User Endpoints +- `GET /api/users/me` - Current user info +- `GET /api/users` - List all users +- `GET /api/users/changes` - Track user changes (Zapier) +- `GET /api/users/{id}/notifications` - User notifications + +### Group Endpoints +- `GET /api/groups` - List groups +- `GET /api/groups/changes` - Track group changes (Zapier) +- `GET /api/groups/network` - Groups by user's networks + +### Event Endpoints +- `GET /api/events/network/{date_from}/{date_to}` - Events by network and date +- `GET /api/events/{id}/volunteers` - Event volunteers +- `PUT /api/events/{id}/volunteers` - Add volunteer to event + +### Network Endpoints +- `GET /api/networks/{network}/stats` - Network statistics + +### Membership Endpoints +- `GET /api/usersgroups/changes` - Track membership changes (Zapier) +- `DELETE /api/usersgroups/{id}` - Remove user from group + +
+ +
+API v2 (RESTful) + +### Groups +- `GET /api/v2/groups/names` - Group names list +- `GET /api/v2/groups/tags` - All group tags +- `GET /api/v2/groups/{id}` - Group details +- `GET /api/v2/groups/{id}/events` - Group events +- `GET /api/v2/groups/{id}/volunteers` - Group volunteers +- `POST /api/v2/groups` - Create group +- `PATCH /api/v2/groups/{id}` - Update group +- `PATCH /api/v2/groups/{id}/volunteers/{iduser}` - Update volunteer +- `DELETE /api/v2/groups/{id}/volunteers/{iduser}` - Remove volunteer + +### Events +- `GET /api/v2/events/{id}` - Event details +- `POST /api/v2/events` - Create event +- `PATCH /api/v2/events/{id}` - Update event + +### Devices +- `GET /api/v2/devices/{id}` - Device details +- `POST /api/v2/devices` - Create device +- `PATCH /api/v2/devices/{id}` - Update device +- `DELETE /api/v2/devices/{id}` - Delete device + +### Networks +- `GET /api/v2/networks` - List networks +- `GET /api/v2/networks/{id}` - Network details +- `GET /api/v2/networks/{id}/groups` - Network groups +- `GET /api/v2/networks/{id}/events` - Network events + +### Moderation +- `GET /api/v2/moderate/groups` - Groups pending moderation +- `GET /api/v2/moderate/events` - Events pending moderation + +### Items +- `GET /api/v2/items` - Device categories + +### Alerts +- `GET /api/v2/alerts` - List alerts +- `PUT /api/v2/alerts` - Create alert +- `PATCH /api/v2/alerts/{id}` - Update alert + +### Documentation +- Full OpenAPI/Swagger documentation available +- Consistent JSON response structure +- Pagination support +- Date range filtering +- Token-based and session-based authentication + +
+ +--- + +## 10. Notifications & Communication + +
+Email Notifications + +### Automated Emails +- Post-event reminder to add data +- Password reset emails +- Group invitation emails +- Event invitation emails +- Event moderation notifications (admins) +- Volunteer attendance notifications +- Account setup confirmation +- Wiki submission alerts +- New group nearby notifications +- User deletion notifications + +### Notification Preferences +- Opt-in/opt-out per notification type +- User-configurable preferences +- Email frequency settings + +
+ +
+In-App Notifications + +### Features +- Mark notifications as read +- Notification count badges +- Discourse notification integration +- Real-time notification updates + +
+ +--- + +## 11. Additional Features + +
+Multi-Language Support + +### Supported Languages +- English (EN) +- French (FR) +- French (Belgium) (FR-BE) + +### Translation Features +- User language preference +- On-the-fly language switching +- Translation management commands +- Automatic JavaScript translation generation +- Translation completeness checking +- Regional locale support (Discourse doesn't support regional variants) + +
+ +
+File & Image Management + +### Features +- Image upload for groups, events, devices +- Multiple images per entity +- Image resizing and optimization +- Image deletion +- File type validation +- Storage management + +
+ +
+Search Functionality + +### Search Capabilities +- User search (name, email, location) +- Group search (name, location, tags, network) +- Device search (category, brand, status) +- Event search (name, date, location) +- Brand autocomplete +- Category filtering + +
+ +
+Privacy & Compliance + +### Features +- Cookie consent tracking +- Cookie policy display +- GDPR data consent management +- Information alerts with dismissal +- Soft-delete for data preservation +- User data anonymization +- Audit trail for compliance + +
+ +
+Security Features + +### Security Measures +- CSRF protection on forms +- Authentication middleware +- Authorization policies for resources +- Secure password hashing (bcrypt) +- API token authentication +- Email verification +- Hash-based secure invitation links +- Role-based access control +- Granular permission system + +
+ +--- + +## Related Documentation + +- **[Tech Documentation](Tech.md)** - Technical architecture, testing, and development details +- **[Local Development Setup](docs/local-development.md)** - Getting started guide for developers +- **[CLAUDE.md](CLAUDE.md)** - AI assistant guidelines and project overview +- **[API Documentation](https://restarters.net/api/documentation)** - OpenAPI/Swagger interactive docs diff --git a/README.md b/README.md index 0f90548fb8..1229cba8db 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,15 @@ Development category. (However, if you would prefer to create an issue in Github, please go ahead - we'll make sure it ends up in the right place.) +## Features + +For a comprehensive overview of all platform features, see [Features.md](Features.md). + ## Tech -More details on the tech side of things in the [dev wiki](https://github.com/therestartproject/restarters.net/wiki). +For technical details, architecture, and development information, see [Tech.md](Tech.md). + +Additional details in the [dev wiki](https://github.com/therestartproject/restarters.net/wiki). ## Methodology diff --git a/Taskfile.yml b/Taskfile.yml index fb7754c566..2d2baf6c0a 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -8,9 +8,19 @@ dotenv: env: UID: - sh: id -u + sh: | + if command -v id >/dev/null 2>&1; then + id -u + else + echo "1000" + fi GID: - sh: id -g + sh: | + if command -v id >/dev/null 2>&1; then + id -g + else + echo "1000" + fi vars: DOCKER_CMD: @@ -159,4 +169,206 @@ tasks: task docker:run:artisan -- migrate cmds: - - docker exec -it restarters php artisan "{{ .CLI_ARGS }}" \ No newline at end of file + - docker exec -it restarters php artisan "{{ .CLI_ARGS }}" + + docker:test:phpunit: + desc: Run PHPUnit tests in the core application container. + summary: | + Run PHPUnit tests with the same configuration used in CircleCI. + This ensures consistency between local development and CI environments. + + The command includes: + - Database reset and migrations (fresh test database state) + - Memory limit set to 1024M + - Coverage reporting (clover.xml) + - JUnit XML output for CI integration + - TeamCity output format for better test reporting + - Coverage upload to Coveralls if COVERALLS_REPO_TOKEN is set + - Support for additional PHPUnit options via CLI_ARGS + + Use this task instead of running phpunit directly to maintain consistency. + + Examples: + - task docker:test:phpunit -- --stop-on-failure + - task docker:test:phpunit -- --filter=UserTest + + cmds: + - mkdir -p /tmp/test-results/phpunit + - | + if [ -z "$CIRCLECI" ]; then + echo "Resetting test database and running migrations..." + docker exec restarters bash -c "php artisan migrate:fresh --seed --database=mysql_testing --force" + else + echo "Running on CircleCI - skipping database reset (handled by CI setup)" + fi + - docker exec -e COVERALLS_REPO_TOKEN="$COVERALLS_REPO_TOKEN" restarters bash -c "export XDEBUG_MODE=coverage; ./vendor/bin/phpunit -d memory_limit=1024M --bootstrap vendor/autoload.php --coverage-clover tests/clover.xml --log-junit /tmp/phpunit-results.xml --configuration ./phpunit.xml --teamcity {{ .CLI_ARGS }}" + - | + if [ ! -z "$COVERALLS_REPO_TOKEN" ]; then + echo "Uploading coverage to Coveralls..." + docker exec -e COVERALLS_REPO_TOKEN="$COVERALLS_REPO_TOKEN" restarters bash -c "./upload-coverage.sh tests/clover.xml" + else + echo "COVERALLS_REPO_TOKEN not set, skipping coverage upload" + fi + + docker:test:jest: + desc: Run Jest tests in the core application container. + summary: | + Run Jest tests with JUnit output for CI integration. + This ensures consistency between local development and CI environments. + + cmds: + - mkdir -p /tmp/test-results/jest + - docker exec restarters bash -c "npm i jest-junit; JEST_JUNIT_OUTPUT_DIR=/tmp/test-results npm run jest -- --testResultsProcessor=jest-junit" + + docker:test:playwright: + desc: Run Playwright tests in dedicated playwright container. + summary: | + Run Playwright end-to-end tests using a dedicated playwright container. + This ensures proper isolation and reliable network access to the application. + + The command includes: + - Environment variables for test configuration + - HTML report generation + - Proper test isolation + + cmds: + - mkdir -p /tmp/test-results/playwright + - docker exec restarters bash -c "php artisan cache:clear" + - docker exec restarters bash -c "echo \"DB::statement('SET foreign_key_checks=0'); App\\\\Device::truncate(); DB::statement('SET foreign_key_checks=1');\" | php artisan tinker" || true + - docker exec restarters bash -c "echo \"App\\\\User::firstOrCreate(['email'=>'jane@bloggs.net'], ['name'=>'Jane Bloggs','password'=>Hash::make('passw0rd'),'role'=>2,'consent_past_data'=>'2021-01-01','consent_future_data'=>'2021-01-01','consent_gdpr'=>'2021-01-01']);\" | php artisan tinker" || true + - docker exec restarters bash -c "sed -i 's/.throttle:api.,//g' /var/www/app/Http/Kernel.php" + - docker exec restarters bash -c "sed -i 's/APP_DEBUG=.*$/APP_DEBUG=false/g' /var/www/.env" + - | + # Stop Vite dev server and build assets for production + echo "Stopping Vite dev server and building assets..." + docker exec restarters bash -c "ps aux | grep 'node.*vite' | grep -v grep | awk '{print \$2}' | xargs -r kill || true" + docker exec restarters bash -c "rm -f /var/www/public/hot && npm run build" + - | + # Ensure Playwright browsers are installed (handles version mismatches) + echo "Installing Playwright browsers..." + docker exec restarters_playwright bash -c "npx playwright install chromium" + - | + docker exec restarters_playwright bash -c " + export PLAYWRIGHT_TEST=true + export PLAYWRIGHT_DEBUG=true + export PWTEST_SKIP_TEST_OUTPUT=0 + export DEBUG=playwright + export PLAYWRIGHT_BASE_URL=http://restarters_nginx + export PW_TEST_HTML_REPORT_OPEN=never + export FORCE_COLOR=1 + stdbuf -oL -eL npx playwright test --reporter=html + " + + docker:wait-for-services-*: + desc: Wait for Docker services to be ready and responding for a given profile (Usage - task docker:wait-for-services-[core|debug|discourse|all]) + summary: | + Wait for Docker services to be ready by checking their health endpoints. + This task will check that services are listening on their ports and returning + plausible responses before proceeding, but only for the services in the specified profile. + + For just the core services, use: + task docker:wait-for-services-core + + To include debug tools (phpMyAdmin, Mailhog), use: + task docker:wait-for-services-debug + + To include Discourse services, use: + task docker:wait-for-services-discourse + + To wait for all services, use: + task docker:wait-for-services-all + + The task checks: + - Core profile: MySQL database, Restarters web app + - Debug profile: Core + phpMyAdmin, Mailhog + - Discourse profile: Core + Discourse, PostgreSQL, Redis, Sidekiq + - All profile: All services + + requires: *PROFILE_REQUIRES + + vars: *PROFILE_VARS + + silent: true + + cmds: + - | + # Cross-platform sleep function + cross_platform_sleep() { + if command -v sleep >/dev/null 2>&1; then + sleep "$1" + elif command -v powershell >/dev/null 2>&1; then + powershell -Command "Start-Sleep -Seconds $1" + else + # Fallback using ping (works on most systems) + ping -n $(($1 + 1)) 127.0.0.1 >/dev/null 2>&1 || ping -c $1 127.0.0.1 >/dev/null 2>&1 + fi + } + + # Generic wait function that takes: service_name, container_name, check_command, max_attempts, sleep_interval + wait_for_service() { + local service_name="$1" + local container_name="$2" + local check_command="$3" + local max_attempts="$4" + local sleep_interval="$5" + + echo "Waiting for $service_name..." + local attempt=0 + local initial_restart_count=0 + + # Get initial restart count if container exists + if docker ps -a --format "table {{.Names}}" | grep -q "^${container_name}$"; then + initial_restart_count=$(docker inspect --format='{{.RestartCount}}' "$container_name" 2>/dev/null || echo "0") + fi + + while [ $attempt -lt $max_attempts ]; do + # Check if container has restarted since we started monitoring + if docker ps -a --format "table {{.Names}}" | grep -q "^${container_name}$"; then + current_restart_count=$(docker inspect --format='{{.RestartCount}}' "$container_name" 2>/dev/null || echo "0") + if [ "$current_restart_count" -gt "$initial_restart_count" ]; then + echo "❌ $service_name container ($container_name) has restarted during health check!" + echo " Initial restart count: $initial_restart_count" + echo " Current restart count: $current_restart_count" + echo " Container logs:" + docker logs --tail=50 "$container_name" 2>&1 || echo " Could not retrieve logs" + exit 1 + fi + fi + + if eval "$check_command" >/dev/null 2>&1; then + echo "✓ $service_name is ready" + return 0 + fi + echo " $service_name not ready, waiting... (attempt $((attempt + 1))/$max_attempts)" + cross_platform_sleep "$sleep_interval" + attempt=$((attempt + 1)) + done + echo "❌ $service_name failed to start after $max_attempts attempts" + exit 1 + } + + echo "Waiting for services in profile: {{.PROFILE}}" + echo "" + + # Wait for core services (always needed) + wait_for_service "MySQL database" "restarters_db" "docker exec restarters_db mysqladmin ping -h localhost -u root -ps3cr3t --silent" 60 5 + wait_for_service "Restarters web application" "restarters" "curl -f -s http://localhost:8001" 120 5 + + # Wait for debug services (if in debug or all profile) + {{- if or (eq .PROFILE "debug") (eq .PROFILE "all") }} + wait_for_service "phpMyAdmin" "phpmyadmin" "curl -f -s http://localhost:8002" 60 5 + wait_for_service "Mailhog" "mailhog" "curl -f -s http://localhost:8025" 60 5 + {{- else }} + echo "✓ phpMyAdmin not in profile {{.PROFILE}}, skipping" + echo "✓ Mailhog not in profile {{.PROFILE}}, skipping" + {{- end }} + + # Wait for discourse services (if in discourse or all profile) + {{- if or (eq .PROFILE "discourse") (eq .PROFILE "all") }} + wait_for_service "PostgreSQL" "postgresql" "docker exec postgresql pg_isready -U postgres" 60 5 + wait_for_service "Discourse" "restarters_discourse" "curl -f -s http://localhost:8003" 120 10 + {{- else }} + echo "✓ PostgreSQL not in profile {{.PROFILE}}, skipping" + echo "✓ Discourse not in profile {{.PROFILE}}, skipping" + {{- end }} + - echo "🎉 All services in profile {{.PROFILE}} are ready!" \ No newline at end of file diff --git a/Tech.md b/Tech.md new file mode 100644 index 0000000000..93796a6df3 --- /dev/null +++ b/Tech.md @@ -0,0 +1,236 @@ +# Restarters.net Technical Documentation + +This document provides technical details about the Restarters.net platform architecture, technologies, and testing. + +## Architecture + +### Backend +- **Framework**: Laravel 10 with PHP 8+ +- **Database**: MySQL 8.0 +- **Caching**: Redis for performance optimization +- **Queue**: Background job processing for integrations +- **ORM**: Laravel Eloquent + +### Frontend +- **JavaScript Framework**: Vue.js 2 components +- **Templates**: Blade templates (gradual migration to full SPA - see [Migration Strategy](docs/migration-to-vue.md)) +- **State Management**: Vuex stores +- **Asset Bundling**: Vite for modern build pipeline +- **UI Framework**: Bootstrap 4 + +### Development & Build +- **Package Manager**: Composer (PHP), npm (JavaScript) +- **Asset Compilation**: Vite +- **Code Style**: PHP CS Fixer +- **Testing**: PHPUnit, Jest, Playwright + +## Key Technologies + +### PHP Libraries +- **Laravel Eloquent ORM** - Database interactions and relationships +- **Laravel Auditing** - Change tracking and audit trails +- **Intervention Image** - Image processing and optimization +- **GuzzleHTTP** - HTTP client for API integrations +- **Laravel Sanctum** - API authentication (planned) + +### JavaScript Libraries +- **Vue.js 2** - Component-based UI development +- **Vuex** - State management +- **Vuelidate** - Form validation +- **Bootstrap Vue** - Vue-compatible Bootstrap components +- **Axios** - HTTP client for API calls + +### External Service Integrations +- **Discourse API** - Forum integration (Restarters Talk) +- **MediaWiki API** - Wiki integration (Restarters Wiki) +- **WordPress XML-RPC** - Content publishing +- **Geocoding Service** - Location lookup +- **Drip** - Email marketing +- **Zapier Webhooks** - Workflow automation + +### Documentation & Standards +- **OpenAPI/Swagger** - API documentation (available at `/api/documentation`) +- **RESTful API** - v2 API follows REST principles +- **JSON** - Standard data interchange format + +## Performance Features + +### Caching Strategy +- **Database Query Caching** - Reduces database load for frequently accessed data +- **API Response Caching** - Homepage data cached with 12-hour TTL +- **Notification Caching** - Discourse notifications cached with 60-second TTL +- **Redis** - In-memory data store for cache + +### Optimization Techniques +- **Image Optimization** - Automatic resizing and compression +- **Lazy Loading** - Components loaded on demand +- **Pagination** - Large datasets split across multiple pages +- **Code Splitting** - JavaScript bundles split for faster initial load +- **Database Indexing** - Optimized queries with proper indexes + +### Background Processing +- **Queue System** - Laravel queues for long-running tasks +- **Job Processing** - Discourse syncs, WordPress publishing, email sending +- **Event-Driven Architecture** - Laravel events and listeners + +## Testing Coverage + +The application has comprehensive test coverage across multiple levels: + +### PHPUnit Tests (95 test files) + +**Feature Tests** - End-to-end testing of major features: +- User registration and authentication +- Group management (create, edit, delete, join, invite) +- Event management (create, edit, delete, RSVP, moderation) +- Device recording and repair tracking +- API endpoints (v1 and v2) +- Network coordination +- Statistics calculation and impact metrics +- External integrations (Discourse, WordPress, Wiki) +- Email notifications +- Admin functionality +- Role and permission system + +**Unit Tests** - Component-level testing: +- Model relationships and scopes +- Business logic in services +- Helper functions +- Calculation algorithms (CO2, waste prevented) + +**Test Organization**: +- `/tests/Feature/` - Feature tests organized by domain +- `/tests/Unit/` - Unit tests for isolated components +- `/tests/Integration/` - Playwright E2E tests + +### Playwright Tests (4 E2E tests) + +End-to-end browser testing: +- Landing page functionality +- Device recording workflow +- Group creation and management +- Event creation and management + +**Configuration**: +- Browser: Chromium (Firefox and Safari support commented out) +- Workers: 1 (to avoid CSRF issues) +- Screenshots and videos on failure +- Trace capture for debugging + +### Test Commands + +```bash +# PHPUnit tests +./vendor/bin/phpunit # Run all tests +./vendor/bin/phpunit --filter TestName # Run specific test + +# Playwright tests +npm test # Run Playwright tests + +# JavaScript unit tests +npm run jest # Run Jest tests +``` + +## Database Design + +### Core Tables +- **users** - User accounts and profiles +- **groups** - Community repair groups +- **events** (parties) - Repair events +- **devices** - Repaired items with impact data +- **networks** - Regional networks +- **categories** - Device categories with LCA data + +### Key Features +- **Soft Deletes** - Enabled for users, events, groups +- **Audit Trail** - All changes tracked via Laravel Auditing +- **Timestamps** - Created/updated timestamps on all tables +- **JSON Columns** - Flexible network_data storage +- **Pivot Tables** - Many-to-many relationships (user-groups, group-networks) +- **Foreign Keys** - Referential integrity maintained + +### Timezone Handling +- **UTC Storage** - Events stored as UTC timestamps +- **Timezone Awareness** - Groups and events have timezone fields +- **Virtual Columns** - Event date/time calculated from UTC + timezone +- **Network Inheritance** - Groups inherit timezone from networks if not set + +## Security + +### Authentication & Authorization +- **CSRF Protection** - Laravel middleware on all forms +- **Password Hashing** - Bcrypt with configurable rounds +- **Session Management** - Secure session handling +- **Role-Based Access Control** - 5 user roles with granular permissions +- **Authorization Policies** - Eloquent policies for resource access +- **API Token Authentication** - Secure API access via tokens + +### Data Protection +- **Soft Deletes** - Data preservation for compliance +- **User Anonymization** - GDPR-compliant deletion +- **Email Verification** - Required for registration +- **Consent Tracking** - GDPR consent records (cookies, data usage) +- **Audit Trail** - Complete change history + +### API Security +- **Rate Limiting** - Throttling on API endpoints +- **Input Validation** - Laravel validation on all inputs +- **SQL Injection Prevention** - Eloquent ORM prevents SQL injection +- **XSS Prevention** - Blade template escaping +- **Hash-Based Links** - Secure invitation and calendar links + +## Deployment + +### Production Requirements +- PHP 8.0+ +- MySQL 8.0+ +- Redis (recommended for caching) +- Composer +- Node.js 16+ & npm + +### Environment Configuration +- `.env` file for environment-specific settings +- Database credentials +- External API keys (Discourse, WordPress, Drip, Geocoding) +- Mail server configuration +- Cache driver configuration (Redis recommended) + +### Build Process +```bash +composer install --no-dev # Install PHP dependencies +npm install # Install JavaScript dependencies +npm run build # Build production assets +php artisan migrate # Run database migrations +php artisan config:cache # Cache configuration +php artisan route:cache # Cache routes +php artisan view:cache # Cache Blade templates +``` + +### CI/CD +- **CircleCI** - Continuous integration +- **Automated Testing** - PHPUnit runs on every commit +- **Code Coverage** - Coveralls integration +- **Branch Protection** - Develop and production branches protected + +## Summary Statistics + +- **Total Routes**: 150+ endpoints (web + API) +- **Core Entities**: 6 main models (Users, Groups, Events, Devices, Networks, Categories) +- **Controllers**: 35+ (including API v1 and v2) +- **User Roles**: 5 distinct roles with granular permissions +- **External Integrations**: 6+ external services +- **Supported Languages**: 3 language variants (EN, FR, FR-BE) +- **API Versions**: Legacy v1 + RESTful v2 +- **Test Coverage**: 95 PHPUnit tests + 4 Playwright E2E tests +- **Database Tables**: 30+ tables +- **Vue Components**: 40+ reusable components +- **Vuex Store Modules**: Multiple domain-specific stores + +## Related Documentation + +- **[Migration to Vue Strategy](docs/migration-to-vue.md)** - Frontend architecture evolution plan +- **[Features Documentation](Features.md)** - Complete feature list and user capabilities +- **[Local Development Setup](docs/local-development.md)** - Getting started guide for developers +- **[CLAUDE.md](CLAUDE.md)** - AI assistant guidelines and project overview +- **[API Documentation](https://restarters.net/api/documentation)** - OpenAPI/Swagger interactive docs +- **[GitHub Wiki](https://github.com/TheRestartProject/restarters.net/wiki)** - Additional developer resources diff --git a/app/Barrier.php b/app/Barrier.php index 0e1d5a9f97..d90829c677 100644 --- a/app/Barrier.php +++ b/app/Barrier.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Model; class Barrier extends Model @@ -11,7 +12,7 @@ class Barrier extends Model protected $hidden = []; public $timestamps = false; - public function barriers() + public function barriers(): BelongsToMany { return $this->belongsToMany(\App\Device::class, 'devices_barriers', 'barrier_id', 'device_id'); } diff --git a/app/Category.php b/app/Category.php index e681d44394..c49e50d18d 100644 --- a/app/Category.php +++ b/app/Category.php @@ -37,7 +37,7 @@ class Category extends Model public function findAll() { try { - return DB::select(DB::raw('SELECT * FROM `'.$this->table.'` WHERE `revision` = :rev'), ['rev' => $this->revision]); + return DB::select("SELECT * FROM `{$this->table}` WHERE `revision` = :rev", ['rev' => $this->revision]); } catch (\Illuminate\Database\QueryException $e) { return false; } @@ -45,12 +45,12 @@ public function findAll() public function listed() { - $clusters = DB::select(DB::raw('SELECT * FROM clusters ORDER BY idclusters ASC')); + $clusters = DB::select('SELECT * FROM clusters ORDER BY idclusters ASC'); - $sql = 'SELECT * FROM `'.$this->table.'` WHERE `revision` = :rev AND `cluster` = :cluster ORDER BY `idcategories` ASC'; + $sql = "SELECT * FROM `{$this->table}` WHERE `revision` = :rev AND `cluster` = :cluster ORDER BY `idcategories` ASC"; foreach ($clusters as $k => $cluster) { - $clusters[$k]->categories = DB::select(DB::raw($sql), ['rev' => $this->revision, 'cluster' => $cluster->idclusters]); + $clusters[$k]->categories = DB::select($sql, ['rev' => $this->revision, 'cluster' => $cluster->idclusters]); } return $clusters; @@ -59,7 +59,7 @@ public function listed() public function findAllByRevision($rev) { try { - DB::select(DB::raw('SELECT * FROM `'.$this->table.'` WHERE `revision` = :rev'), ['rev' => $rev]); + return DB::select("SELECT * FROM `{$this->table}` WHERE `revision` = :rev", ['rev' => $rev]); } catch (\Illuminate\Database\QueryException $e) { return false; } diff --git a/app/Cluster.php b/app/Cluster.php index 5c1fcae448..b599d07182 100644 --- a/app/Cluster.php +++ b/app/Cluster.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Model; class Cluster extends Model @@ -23,7 +24,7 @@ class Cluster extends Model */ protected $hidden = []; - public function categories() + public function categories(): HasMany { return $this->hasMany(\App\Category::class, 'cluster', 'idclusters'); } diff --git a/app/Console/Commands/AlertCreate.php b/app/Console/Commands/AlertCreate.php index 8d56290f68..cf9b10a631 100644 --- a/app/Console/Commands/AlertCreate.php +++ b/app/Console/Commands/AlertCreate.php @@ -37,10 +37,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $title = trim($this->argument('title')); $html = trim($this->argument('html')); diff --git a/app/Console/Commands/AnonymiseUsersForTest.php b/app/Console/Commands/AnonymiseUsersForTest.php index cedd287be5..9ff4da3736 100644 --- a/app/Console/Commands/AnonymiseUsersForTest.php +++ b/app/Console/Commands/AnonymiseUsersForTest.php @@ -24,10 +24,8 @@ class AnonymiseUsersForTest extends Command /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { if (env('APP_ENV') !== 'local') { $this->error('This command is only designed to be run during local development.'); @@ -55,8 +53,6 @@ public function handle() $user->password = Hash::make('secret'); $user->save(); - - // TODO: anonymise photos. } } } diff --git a/app/Console/Commands/CheckGroupLocations.php b/app/Console/Commands/CheckGroupLocations.php index 7a44642e22..4866b50fcf 100644 --- a/app/Console/Commands/CheckGroupLocations.php +++ b/app/Console/Commands/CheckGroupLocations.php @@ -33,10 +33,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $groups = Group::where('approved', true)->get(); $geocoder = new \App\Helpers\Geocoder(); diff --git a/app/Console/Commands/CheckTranslations.php b/app/Console/Commands/CheckTranslations.php index 7c1418294a..e6a75518cc 100644 --- a/app/Console/Commands/CheckTranslations.php +++ b/app/Console/Commands/CheckTranslations.php @@ -32,10 +32,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): int { // We want to scan all English translations. $files = scandir(base_path() . '/lang/en'); diff --git a/app/Console/Commands/CreateDiscourseGroups.php b/app/Console/Commands/CreateDiscourseGroups.php index 2c284d6dd5..2adde2a3ed 100644 --- a/app/Console/Commands/CreateDiscourseGroups.php +++ b/app/Console/Commands/CreateDiscourseGroups.php @@ -33,10 +33,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $groups = Group::where('approved', true)->whereNull('discourse_group')->get(); diff --git a/app/Console/Commands/CrystalliseEventTimezone.php b/app/Console/Commands/CrystalliseEventTimezone.php index 02082a9366..d4961e103b 100644 --- a/app/Console/Commands/CrystalliseEventTimezone.php +++ b/app/Console/Commands/CrystalliseEventTimezone.php @@ -36,10 +36,8 @@ public function __construct(DiscourseService $discourseService) /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $events = Party::past()->where('timezone', null)->get(); diff --git a/app/Console/Commands/DiscourseAnonymiseUser.php b/app/Console/Commands/DiscourseAnonymiseUser.php index 68a094d795..4ee677243e 100644 --- a/app/Console/Commands/DiscourseAnonymiseUser.php +++ b/app/Console/Commands/DiscourseAnonymiseUser.php @@ -57,10 +57,8 @@ public function __construct(DiscourseService $discourseService) /** * Execute the console command. - * - * @return mixed */ - public function handle(DiscourseService $discourseService) + public function handle(DiscourseService $discourseService): void { $id = $this->argument('id'); $user = User::findOrFail($id); diff --git a/app/Console/Commands/DiscourseChangeSetting.php b/app/Console/Commands/DiscourseChangeSetting.php index 066163e0d1..e0c09807cd 100644 --- a/app/Console/Commands/DiscourseChangeSetting.php +++ b/app/Console/Commands/DiscourseChangeSetting.php @@ -56,10 +56,8 @@ public function __construct(DiscourseService $discourseService) /** * Execute the console command. - * - * @return mixed */ - public function handle(DiscourseService $discourseService) + public function handle(DiscourseService $discourseService): void { $setting = $this->argument('setting'); $value = $this->argument('value'); diff --git a/app/Console/Commands/DiscourseCreateThread.php b/app/Console/Commands/DiscourseCreateThread.php index f99251ef81..b08d953476 100644 --- a/app/Console/Commands/DiscourseCreateThread.php +++ b/app/Console/Commands/DiscourseCreateThread.php @@ -39,10 +39,8 @@ public function __construct(DiscourseService $discourseService) /** * Execute the console command. - * - * @return mixed */ - public function handle(DiscourseService $discourseService) + public function handle(DiscourseService $discourseService): void { $id = $this->argument('partyid'); diff --git a/app/Console/Commands/FixViews.php b/app/Console/Commands/FixViews.php index 1e76c43d3f..f3602f2491 100644 --- a/app/Console/Commands/FixViews.php +++ b/app/Console/Commands/FixViews.php @@ -23,10 +23,8 @@ class FixViews extends Command /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { if (env('APP_ENV') !== 'local') { $this->error('This command is only designed to be run during local development.'); @@ -34,13 +32,13 @@ public function handle() return; } - $results = DB::select(DB::raw(' + $results = DB::select(' SELECT table_name as viewName, CONCAT("ALTER DEFINER=`'.env('DB_USERNAME').'`@`'.env('DB_HOST').'` VIEW `",table_name,"` AS ", view_definition,";") as alter_statement FROM information_schema.views -WHERE table_schema="'.env('DB_DATABASE').'"')); +WHERE table_schema="'.env('DB_DATABASE').'"'); foreach ($results as $result) { - DB::unprepared(DB::raw($result->alter_statement)); + DB::unprepared($result->alter_statement); $this->info('Fixed '.$result->viewName); } } diff --git a/app/Console/Commands/FixVolunteerCount.php b/app/Console/Commands/FixVolunteerCount.php index 1ff50f3e3b..f5d517cfb3 100644 --- a/app/Console/Commands/FixVolunteerCount.php +++ b/app/Console/Commands/FixVolunteerCount.php @@ -24,10 +24,8 @@ class FixVolunteerCount extends Command /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $events = Party::all(); diff --git a/app/Console/Commands/GroupCountryField.php b/app/Console/Commands/GroupCountryField.php index fe5f8c8883..97a044518d 100644 --- a/app/Console/Commands/GroupCountryField.php +++ b/app/Console/Commands/GroupCountryField.php @@ -24,10 +24,8 @@ class GroupCountryField extends Command /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $groups = Group::all(); diff --git a/app/Console/Commands/ImportGroups.php b/app/Console/Commands/ImportGroups.php index bf4aa49532..0dbe49b3c1 100644 --- a/app/Console/Commands/ImportGroups.php +++ b/app/Console/Commands/ImportGroups.php @@ -35,10 +35,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $input = $this->argument('input'); $inputFile = fopen($input, 'r'); diff --git a/app/Console/Commands/ImportMRES.php b/app/Console/Commands/ImportMRES.php index 193ca3c284..55c18d851f 100644 --- a/app/Console/Commands/ImportMRES.php +++ b/app/Console/Commands/ImportMRES.php @@ -37,10 +37,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $input = $this->argument('input'); diff --git a/app/Console/Commands/LanguageSync.php b/app/Console/Commands/LanguageSync.php index a99a6a0aa0..efdde941b6 100644 --- a/app/Console/Commands/LanguageSync.php +++ b/app/Console/Commands/LanguageSync.php @@ -33,10 +33,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { // We want to sync the language preference from restarters to mediawiki. // diff --git a/app/Console/Commands/MigrateWikiPasswords.php b/app/Console/Commands/MigrateWikiPasswords.php index c21f38b3ec..7782d47e4b 100644 --- a/app/Console/Commands/MigrateWikiPasswords.php +++ b/app/Console/Commands/MigrateWikiPasswords.php @@ -33,10 +33,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $users = User::whereNotNull('mediawiki')->whereNull('deleted_at')->get(); diff --git a/app/Console/Commands/NetworkCoordinator.php b/app/Console/Commands/NetworkCoordinator.php index d37bdef7a4..953a69ce10 100644 --- a/app/Console/Commands/NetworkCoordinator.php +++ b/app/Console/Commands/NetworkCoordinator.php @@ -35,10 +35,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $networkname = $this->argument('networkname'); diff --git a/app/Console/Commands/NetworkCreate.php b/app/Console/Commands/NetworkCreate.php index 48f5a1b757..867a2155f9 100644 --- a/app/Console/Commands/NetworkCreate.php +++ b/app/Console/Commands/NetworkCreate.php @@ -34,10 +34,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $name = $this->argument('name'); $shortname = $this->argument('shortname'); diff --git a/app/Console/Commands/NetworkGroup.php b/app/Console/Commands/NetworkGroup.php index 4df46a4a51..69628c18ac 100644 --- a/app/Console/Commands/NetworkGroup.php +++ b/app/Console/Commands/NetworkGroup.php @@ -35,10 +35,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $networkname = $this->argument('networkname'); $groupname = $this->argument('groupname'); diff --git a/app/Console/Commands/PopulateUniqueCodeToEventsAndGroups.php b/app/Console/Commands/PopulateUniqueCodeToEventsAndGroups.php index 8bf63d5a57..5da704fc80 100644 --- a/app/Console/Commands/PopulateUniqueCodeToEventsAndGroups.php +++ b/app/Console/Commands/PopulateUniqueCodeToEventsAndGroups.php @@ -25,10 +25,8 @@ class PopulateUniqueCodeToEventsAndGroups extends Command /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $groups = Group::whereNull('shareable_code') ->get(); diff --git a/app/Console/Commands/SetPlaceNetworkData.php b/app/Console/Commands/SetPlaceNetworkData.php index 23194d97d2..0eafc6b475 100644 --- a/app/Console/Commands/SetPlaceNetworkData.php +++ b/app/Console/Commands/SetPlaceNetworkData.php @@ -37,10 +37,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $networkname = $this->argument('networkname'); diff --git a/app/Console/Commands/SetRepairTogetherPasswords.php b/app/Console/Commands/SetRepairTogetherPasswords.php index 74cd3acd3f..3b980ea375 100644 --- a/app/Console/Commands/SetRepairTogetherPasswords.php +++ b/app/Console/Commands/SetRepairTogetherPasswords.php @@ -26,10 +26,8 @@ class SetRepairTogetherPasswords extends Command /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $users = User::where('repair_network', 3) ->where('password', '') diff --git a/app/Console/Commands/SyncDiscourseGroups.php b/app/Console/Commands/SyncDiscourseGroups.php index 19d09683d0..ca36a7efe0 100644 --- a/app/Console/Commands/SyncDiscourseGroups.php +++ b/app/Console/Commands/SyncDiscourseGroups.php @@ -35,10 +35,8 @@ public function __construct(DiscourseService $discourseService) /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $this->discourseService->syncGroups(); } diff --git a/app/Console/Commands/SyncDiscourseUsernames.php b/app/Console/Commands/SyncDiscourseUsernames.php index 67a550e8ae..001b82ce24 100644 --- a/app/Console/Commands/SyncDiscourseUsernames.php +++ b/app/Console/Commands/SyncDiscourseUsernames.php @@ -55,10 +55,8 @@ public function __construct(DiscourseService $discourseService) /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $usersFoundInRestarters = 0; $updatedUsers = 0; diff --git a/app/Console/Commands/SyncEvents.php b/app/Console/Commands/SyncEvents.php index 9e6d3600a8..04425d897b 100644 --- a/app/Console/Commands/SyncEvents.php +++ b/app/Console/Commands/SyncEvents.php @@ -46,10 +46,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $eventsQuery = Party::whereNotNull('wordpress_post_id')->where('approved', true); if (! is_null($this->option('datefrom'))) { diff --git a/app/Console/Commands/SyncGroups.php b/app/Console/Commands/SyncGroups.php index 051f7b4f9c..098c054468 100644 --- a/app/Console/Commands/SyncGroups.php +++ b/app/Console/Commands/SyncGroups.php @@ -44,10 +44,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $groups = Group::where('approved', true)->whereNotNull('wordpress_post_id')->get(); diff --git a/app/Console/Commands/SyncNetworkUsersToDiscourseGroup.php b/app/Console/Commands/SyncNetworkUsersToDiscourseGroup.php index a02ab4aa2e..77e2b056b4 100644 --- a/app/Console/Commands/SyncNetworkUsersToDiscourseGroup.php +++ b/app/Console/Commands/SyncNetworkUsersToDiscourseGroup.php @@ -42,10 +42,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { if (! config('restarters.features.discourse_integration')) { return; diff --git a/app/Console/Commands/UserCreate.php b/app/Console/Commands/UserCreate.php index 4e2c5897b4..02c5307713 100644 --- a/app/Console/Commands/UserCreate.php +++ b/app/Console/Commands/UserCreate.php @@ -39,10 +39,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle(DiscourseService $discourseService) + public function handle(DiscourseService $discourseService): void { $name = $this->argument('name'); $email = $this->argument('email'); diff --git a/app/Console/Commands/UserMakeHost.php b/app/Console/Commands/UserMakeHost.php index eadf82d771..4db77898ec 100644 --- a/app/Console/Commands/UserMakeHost.php +++ b/app/Console/Commands/UserMakeHost.php @@ -38,10 +38,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $email = $this->argument('email'); $groupname = $this->argument('groupname'); diff --git a/app/Console/Commands/WordpressCreateEvent.php b/app/Console/Commands/WordpressCreateEvent.php index da4fba53ee..8f966b3fa7 100644 --- a/app/Console/Commands/WordpressCreateEvent.php +++ b/app/Console/Commands/WordpressCreateEvent.php @@ -34,10 +34,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $id = $this->argument('id'); $event = Party::findOrFail($id); diff --git a/app/Console/Commands/WordpressCreateEventFailed.php b/app/Console/Commands/WordpressCreateEventFailed.php index 584c2973f0..0131c3c0fc 100644 --- a/app/Console/Commands/WordpressCreateEventFailed.php +++ b/app/Console/Commands/WordpressCreateEventFailed.php @@ -35,10 +35,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $wordpressClient = new \HieuLe\WordpressXmlrpcClient\WordpressClient(); $wordpressClient->setCredentials(env('WP_XMLRPC_ENDPOINT'), env('WP_XMLRPC_USER'), env('WP_XMLRPC_PSWD')); diff --git a/app/Console/Commands/WordpressCreateEventMissing.php b/app/Console/Commands/WordpressCreateEventMissing.php index f8bac85185..857241b743 100644 --- a/app/Console/Commands/WordpressCreateEventMissing.php +++ b/app/Console/Commands/WordpressCreateEventMissing.php @@ -34,10 +34,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $events = Party::future()->where('approved', true)->where('wordpress_post_id', null)->get(); diff --git a/app/Console/Commands/WordpressCreateGroup.php b/app/Console/Commands/WordpressCreateGroup.php index 1bb2ccb81a..96850c163c 100644 --- a/app/Console/Commands/WordpressCreateGroup.php +++ b/app/Console/Commands/WordpressCreateGroup.php @@ -34,10 +34,8 @@ public function __construct() /** * Execute the console command. - * - * @return mixed */ - public function handle() + public function handle(): void { $id = $this->argument('id'); $group = Group::findOrFail($id); diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index af6e170b0c..a33477ed8d 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -16,11 +16,8 @@ class Kernel extends ConsoleKernel { /** * Define the application's command schedule. - * - * @param \Illuminate\Console\Scheduling\Schedule $schedule - * @return void */ - protected function schedule(Schedule $schedule) + protected function schedule(Schedule $schedule): void { $schedule->call(function () { $parties = Party::doesnthave('devices') @@ -51,10 +48,8 @@ protected function schedule(Schedule $schedule) /** * Register the commands for the application. - * - * @return void */ - protected function commands() + protected function commands(): void { $this->load(__DIR__.'/Commands'); diff --git a/app/Device.php b/app/Device.php index 8d71743555..c9ccff36cf 100644 --- a/app/Device.php +++ b/app/Device.php @@ -2,6 +2,8 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use App\Events\DeviceCreatedOrUpdated; use DB; @@ -50,6 +52,15 @@ class Device extends Model implements Auditable use \OwenIt\Auditing\Auditable; protected $table = 'devices'; + + /** + * Check if we're running in CircleCI environment + */ + private static function isCircleCI() + { + return env('CIRCLECI', false) || env('CI', false); + } + protected $primaryKey = 'iddevices'; /** * The attributes that are mass assignable. @@ -96,30 +107,30 @@ public static function getDisplacementFactor() public function ofThisEvent($event) { //Tested - return DB::select(DB::raw('SELECT * FROM `'.$this->table.'` AS `d` + return DB::select("SELECT * FROM `{$this->table}` AS `d` INNER JOIN `categories` AS `c` ON `c`.`idcategories` = `d`.`category` LEFT JOIN ( SELECT * FROM xref INNER JOIN images ON images.idimages = xref.object - WHERE object_type = '.env('TBL_IMAGES').' AND reference_type = '.env('TBL_DEVICES').' + WHERE object_type = ? AND reference_type = ? ) AS i ON i.reference = d.iddevices - WHERE `event` = :event'), ['event' => $event]); + WHERE `event` = ?", [env('TBL_IMAGES'), env('TBL_DEVICES'), $event]); } public function ofThisGroup($group) { //Tested - return DB::select(DB::raw('SELECT * FROM `'.$this->table.'` AS `d` + return DB::select("SELECT * FROM `{$this->table}` AS `d` INNER JOIN `categories` AS `c` ON `c`.`idcategories` = `d`.`category` INNER JOIN `events` AS `e` ON `e`.`idevents` = `d`.`event` - WHERE `group` = :group'), ['group' => $group]); + WHERE `group` = :group", ['group' => $group]); } public function statusCount($g = null, $year = null) { - $sql = 'SELECT COUNT(*) AS `counter`, `d`.`repair_status` AS `status`, `d`.`event` - FROM `'.$this->table.'` AS `d`'; + $sql = "SELECT COUNT(*) AS `counter`, `d`.`repair_status` AS `status`, `d`.`event` + FROM `{$this->table}` AS `d`"; $sql .= ' INNER JOIN `events` AS `e` ON `e`.`idevents` = `d`.`event` '; $sql .= ' WHERE `repair_status` > 0 '; @@ -141,14 +152,14 @@ public function statusCount($g = null, $year = null) } if (! is_null($g) && is_numeric($g) && is_null($year)) { - return DB::select(DB::raw($sql), ['g' => $g]); + return DB::select($sql, ['g' => $g]); } elseif (! is_null($year) && is_numeric($year) && is_null($g)) { - return DB::select(DB::raw($sql), ['year' => $year]); + return DB::select($sql, ['year' => $year]); } elseif (! is_null($year) && is_numeric($year) && ! is_null($g) && is_numeric($g)) { - return DB::select(DB::raw($sql), ['year' => $year, 'g' => $g]); + return DB::select($sql, ['year' => $year, 'g' => $g]); } - return DB::select(DB::raw($sql)); + return DB::select($sql); } public function countByCluster($cluster, $group = null, $year = null) @@ -172,14 +183,14 @@ public function countByCluster($cluster, $group = null, $year = null) '; if (! is_null($group) && is_numeric($group) && is_null($year)) { - return DB::select(DB::raw($sql), ['group' => $group, 'cluster' => $cluster]); + return DB::select($sql, ['group' => $group, 'cluster' => $cluster]); } elseif (! is_null($year) && is_numeric($year) && is_null($group)) { - return DB::select(DB::raw($sql), ['year' => $year, 'cluster' => $cluster]); + return DB::select($sql, ['year' => $year, 'cluster' => $cluster]); } elseif (! is_null($year) && is_numeric($year) && ! is_null($group) && is_numeric($group)) { - return DB::select(DB::raw($sql), ['year' => $year, 'group' => $group, 'cluster' => $cluster]); + return DB::select($sql, ['year' => $year, 'group' => $group, 'cluster' => $cluster]); } - return DB::select(DB::raw($sql), ['cluster' => $cluster]); + return DB::select($sql, ['cluster' => $cluster]); } public function countByClustersYearStatus($group) @@ -193,7 +204,7 @@ public function countByClustersYearStatus($group) GROUP BY `cluster`, YEAR(`event_start_utc`) , `repair_status` ORDER BY `year` ASC, `repair_status` ASC;"; - return DB::select(DB::raw($sql), ['group' => $group]); + return DB::select($sql, ['group' => $group]); } public function findMostSeen($status = null, $cluster = null, $group = null) @@ -222,38 +233,38 @@ public function findMostSeen($status = null, $cluster = null, $group = null) if (! is_null($cluster) && is_numeric($cluster)) { if (! is_null($group) && is_numeric($group) && is_null($status)) { - return DB::select(DB::raw($sql), ['group' => $group, 'cluster' => $cluster]); + return DB::select($sql, ['group' => $group, 'cluster' => $cluster]); } elseif (! is_null($status) && is_numeric($status) && is_null($group)) { - return DB::select(DB::raw($sql), ['status' => $status, 'cluster' => $cluster]); + return DB::select($sql, ['status' => $status, 'cluster' => $cluster]); } elseif (! is_null($status) && is_numeric($status) && ! is_null($group) && is_numeric($group)) { - return DB::select(DB::raw($sql), ['status' => $status, 'group' => $group, 'cluster' => $cluster]); + return DB::select($sql, ['status' => $status, 'group' => $group, 'cluster' => $cluster]); } - return DB::select(DB::raw($sql), ['cluster' => $cluster]); + return DB::select($sql, ['cluster' => $cluster]); } else { if (! is_null($group) && is_numeric($group) && is_null($status)) { - return DB::select(DB::raw($sql), ['group' => $group]); + return DB::select($sql, ['group' => $group]); } elseif (! is_null($status) && is_numeric($status) && is_null($group)) { - return DB::select(DB::raw($sql), ['status' => $status]); + return DB::select($sql, ['status' => $status]); } elseif (! is_null($status) && is_numeric($status) && ! is_null($group) && is_numeric($group)) { - return DB::select(DB::raw($sql), ['status' => $status, 'group' => $group]); + return DB::select($sql, ['status' => $status, 'group' => $group]); } - return DB::select(DB::raw($sql)); + return DB::select($sql); } } - public function deviceCategory() + public function deviceCategory(): HasOne { return $this->hasOne(\App\Category::class, 'idcategories', 'category'); } - public function deviceEvent() + public function deviceEvent(): HasOne { return $this->hasOne(\App\Party::class, 'idevents', 'event'); } - public function barriers() + public function barriers(): BelongsToMany { return $this->belongsToMany(\App\Barrier::class, 'devices_barriers', 'device_id', 'barrier_id'); } @@ -269,9 +280,13 @@ public function eCo2Diverted($emissionRatio, $displacementFactor) if ($this->category == env('MISC_CATEGORY_ID_POWERED') && $this->estimate > 0) { $footprint = $this->estimate * $emissionRatio; } else { - $footprint = \Cache::remember('category-' . $this->category, 15, function() { - return $this->deviceCategory; - })->footprint; + if (self::isCircleCI()) { + $footprint = $this->deviceCategory->footprint; + } else { + $footprint = \Cache::remember('category-' . $this->category, 15, function() { + return $this->deviceCategory; + })->footprint; + } } } @@ -305,17 +320,25 @@ public function eWasteDiverted() { $ewasteDiverted = 0; - $powered = \Cache::remember('category-powered-' . $this->category, 15, function() { - return $this->deviceCategory->powered; - }); + if (self::isCircleCI()) { + $powered = $this->deviceCategory->powered; + } else { + $powered = \Cache::remember('category-powered-' . $this->category, 15, function() { + return $this->deviceCategory->powered; + }); + } if ($this->isFixed() && $powered) { if ($this->category == env('MISC_CATEGORY_ID_POWERED') && $this->estimate > 0) { $ewasteDiverted = $this->estimate; } else { - $category = \Cache::remember('category-' . $this->category, 15, function() { - return $this->deviceCategory; - }); + if (self::isCircleCI()) { + $category = $this->deviceCategory; + } else { + $category = \Cache::remember('category-' . $this->category, 15, function() { + return $this->deviceCategory; + }); + } $ewasteDiverted = $category->weight; } @@ -454,10 +477,10 @@ public static function getItemTypes() // used by the item types. // // This is slow and the results don't change much, so we use a cache. - if (Cache::has('item_types')) { + if (!self::isCircleCI() && Cache::has('item_types')) { $types = Cache::get('item_types'); } else { - $types = DB::select(DB::raw(" + $types = DB::select(" SELECT item_type, powered, idcategories, @@ -484,8 +507,10 @@ public static function getItemTypes() WHERE t.count = t.max_count AND LENGTH(t.item_type) > 0 GROUP BY t.item_type, t.powered; -")); - \Cache::put('item_types', $types, 24 * 3600); +"); + if (!self::isCircleCI()) { + \Cache::put('item_types', $types, 24 * 3600); + } } return $types; diff --git a/app/DripEvent.php b/app/DripEvent.php index e94c731531..3b6af16d0e 100644 --- a/app/DripEvent.php +++ b/app/DripEvent.php @@ -22,7 +22,6 @@ class DripEvent extends Model * Create or Update a Subscriber * @author Christopher Kelker * @date 2019-05-29T15:55:02+010 - * @param User $user * @return [type] */ public static function createOrUpdateSubscriber(User $user, $opted_in = false, $old_email = false, $new_email = false) diff --git a/app/Events/DeviceCreatedOrUpdated.php b/app/Events/DeviceCreatedOrUpdated.php index 4734826f0e..74592d6800 100644 --- a/app/Events/DeviceCreatedOrUpdated.php +++ b/app/Events/DeviceCreatedOrUpdated.php @@ -13,8 +13,6 @@ class DeviceCreatedOrUpdated /** * Create a new event instance. - * - * @param \App\Device $device */ public function __construct(Device $device) { diff --git a/app/Events/EventDeleted.php b/app/Events/EventDeleted.php index c119ea2d51..ee35cccc1f 100644 --- a/app/Events/EventDeleted.php +++ b/app/Events/EventDeleted.php @@ -32,8 +32,10 @@ public function __construct(Party $repairEvent) * * @return \Illuminate\Broadcasting\Channel|array */ - public function broadcastOn() + public function broadcastOn(): array { - return new PrivateChannel('channel-name'); + return [ + new PrivateChannel('channel-name'), + ]; } } diff --git a/app/Events/EventImagesUploaded.php b/app/Events/EventImagesUploaded.php index 6c8d46b312..be84570081 100644 --- a/app/Events/EventImagesUploaded.php +++ b/app/Events/EventImagesUploaded.php @@ -19,11 +19,7 @@ class EventImagesUploaded */ public $auth_user_id; - /** - * @param Party $party - * @param int $auth_user_id - */ - public function __construct(Party $party, $auth_user_id) + public function __construct(Party $party, int $auth_user_id) { $this->party = $party; $this->auth_user_id = $auth_user_id; diff --git a/app/Events/UserDeleted.php b/app/Events/UserDeleted.php index d322b2dba6..4c9672e238 100644 --- a/app/Events/UserDeleted.php +++ b/app/Events/UserDeleted.php @@ -14,9 +14,6 @@ class UserDeleted */ public $user; - /** - * @param User $user - */ public function __construct(User $user) { $this->user = $user; diff --git a/app/Events/UserEmailUpdated.php b/app/Events/UserEmailUpdated.php index f711cb700a..3dc88b00d1 100644 --- a/app/Events/UserEmailUpdated.php +++ b/app/Events/UserEmailUpdated.php @@ -20,9 +20,6 @@ class UserEmailUpdated */ public $user; - /** - * @param User $user - */ public function __construct(User $user) { $this->user = $user; @@ -33,8 +30,10 @@ public function __construct(User $user) * * @return \Illuminate\Broadcasting\Channel|array */ - public function broadcastOn() + public function broadcastOn(): array { - return new PrivateChannel('channel-name'); + return [ + new PrivateChannel('channel-name'), + ]; } } diff --git a/app/Events/UserLanguageUpdated.php b/app/Events/UserLanguageUpdated.php index d8b03064ea..cf41999ccd 100644 --- a/app/Events/UserLanguageUpdated.php +++ b/app/Events/UserLanguageUpdated.php @@ -20,9 +20,6 @@ class UserLanguageUpdated */ public $user; - /** - * @param User $user - */ public function __construct(User $user) { $this->user = $user; @@ -33,8 +30,10 @@ public function __construct(User $user) * * @return \Illuminate\Broadcasting\Channel|array */ - public function broadcastOn() + public function broadcastOn(): array { - return new PrivateChannel('channel-name'); + return [ + new PrivateChannel('channel-name'), + ]; } } diff --git a/app/Events/UserRegistered.php b/app/Events/UserRegistered.php index 029b602afc..018aaa1ff6 100644 --- a/app/Events/UserRegistered.php +++ b/app/Events/UserRegistered.php @@ -20,9 +20,6 @@ class UserRegistered */ public $user; - /** - * @param User $user - */ public function __construct(User $user) { $this->user = $user; @@ -33,8 +30,10 @@ public function __construct(User $user) * * @return \Illuminate\Broadcasting\Channel|array */ - public function broadcastOn() + public function broadcastOn(): array { - return new PrivateChannel('channel-name'); + return [ + new PrivateChannel('channel-name'), + ]; } } diff --git a/app/Events/UserUpdated.php b/app/Events/UserUpdated.php index 86294c4860..e7972670bd 100644 --- a/app/Events/UserUpdated.php +++ b/app/Events/UserUpdated.php @@ -14,9 +14,6 @@ class UserUpdated */ public $user; - /** - * @param User $user - */ public function __construct(User $user) { $this->user = $user; diff --git a/app/EventsUsers.php b/app/EventsUsers.php index 23546bc0bd..0a094b6cd7 100644 --- a/app/EventsUsers.php +++ b/app/EventsUsers.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasOne; use DB; use Illuminate\Database\Eloquent\Model; @@ -27,18 +28,18 @@ class EventsUsers extends Model public $timestamps = false; //Table Relations - public function role() + public function role(): HasOne { return $this->hasOne(\App\Role::class, 'role', 'role'); } //Table Relations - public function volunteer() + public function volunteer(): HasOne { return $this->hasOne(\App\User::class, 'id', 'user'); } - public function event() + public function event(): HasOne { return $this->hasOne(\App\Party::class, 'id', 'event'); } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 576c74f831..f4ab2037c8 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -8,15 +8,6 @@ class Handler extends ExceptionHandler { - /** - * A list of the exception types that are not reported. - * - * @var array - */ - protected $dontReport = [ - - ]; - /** * A list of the inputs that are never flashed for validation exceptions. * @@ -32,7 +23,6 @@ class Handler extends ExceptionHandler * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request - * @param \Throwable $exception * @return \Illuminate\Http\Response */ public function render($request, Throwable $exception) diff --git a/app/Group.php b/app/Group.php index a00865ca1b..37b989a960 100644 --- a/app/Group.php +++ b/app/Group.php @@ -2,6 +2,10 @@ namespace App; +use App\User; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use DB; use Illuminate\Database\Eloquent\Model; @@ -95,7 +99,7 @@ public function addTag($tag) // NGM: when tests in place, this method name should be changed to just `tags`. // It's on a group, the group_ prefix is superfluous. - public function group_tags() + public function group_tags(): BelongsToMany { return $this->belongsToMany(\App\GroupTags::class, 'grouptags_groups', 'group', 'group_tag'); } @@ -106,7 +110,7 @@ public function group_tags() public function findAll() { try { - return DB::select(DB::raw('SELECT + return DB::select('SELECT `g`.`idgroups` AS `id`, `g`.`name` AS `name`, `g`.`location` AS `location`, @@ -121,7 +125,7 @@ public function findAll() LEFT JOIN `users_groups` AS `ug` ON `g`.`idgroups` = `ug`.`group` LEFT JOIN `users` AS `u` ON `ug`.`user` = `u`.`id` GROUP BY `g`.`idgroups` - ORDER BY `g`.`name` ASC')); + ORDER BY `g`.`name` ASC'); } catch (\Illuminate\Database\QueryException $e) { dd($e); } @@ -130,7 +134,7 @@ public function findAll() public function findList() { try { - return DB::select(DB::raw('SELECT + return DB::select('SELECT `g`.`idgroups` AS `id`, `g`.`name` AS `name`, `g`.`location` AS `location`, @@ -151,7 +155,7 @@ public function findList() GROUP BY `g`.`idgroups` - ORDER BY `g`.`name` ASC')); + ORDER BY `g`.`name` ASC'); } catch (\Illuminate\Database\QueryException $e) { dd($e); } @@ -159,7 +163,7 @@ public function findList() public function ofThisUser($id) { - return DB::select(DB::raw('SELECT * FROM `'.$this->table.'` AS `g` + return DB::select('SELECT * FROM `'.$this->table.'` AS `g` INNER JOIN `users_groups` AS `ug` ON `ug`.`group` = `g`.`idgroups` @@ -167,31 +171,31 @@ public function ofThisUser($id) SELECT * FROM `images` INNER JOIN `xref` ON `xref`.`object` = `images`.`idimages` WHERE `xref`.`object_type` = 5 - AND `xref`.`reference_type` = '.env('TBL_GROUPS').' + AND `xref`.`reference_type` = :tblGroups GROUP BY `images`.`path` ) AS `xi` ON `xi`.`reference` = `g`.`idgroups` WHERE `ug`.`user` = :id - ORDER BY `g`.`name` ASC'), ['id' => $id]); + ORDER BY `g`.`name` ASC', ['id' => $id, 'tblGroups' => env('TBL_GROUPS')]); } - public function groupImage() + public function groupImage(): HasOne { return $this->hasOne(\App\Xref::class, 'reference', 'idgroups')->where('reference_type', env('TBL_GROUPS'))->where('object_type', 5); } - public function allHosts() + public function allHosts(): HasMany { return $this->hasMany(\App\UserGroups::class, 'group', 'idgroups')->where('role', Role::HOST); } - public function allRestarters() + public function allRestarters(): HasMany { return $this->hasMany(\App\UserGroups::class, 'group', 'idgroups')->where('role', Role::RESTARTER); } - public function allVolunteers() + public function allVolunteers(): HasMany { return $this->hasMany(\App\UserGroups::class, 'group', 'idgroups')->orderBy('role', 'ASC'); } @@ -269,7 +273,7 @@ public function getGroupStats($eEmissionRatio = null, $uEmissionratio = null) * * @param \App\User $volunteer A registered user. */ - public function addVolunteer($volunteer) + public function addVolunteer(User $volunteer) { UserGroups::updateOrCreate([ 'user' => $volunteer->id, @@ -311,18 +315,14 @@ public function getShareableLinkAttribute() return ''; } - /** - * @param int|null $user_id - * @return bool - */ - public function isVolunteer($user_id = null) + public function isVolunteer(?int $user_id = null): bool { $attributes = ['user' => $user_id ?: auth()->id()]; return $this->allConfirmedVolunteers()->where($attributes)->exists(); } - public function parties() + public function parties(): HasMany { return $this->hasMany(Party::class, 'group', 'idgroups'); } @@ -379,7 +379,7 @@ public function getNextUpcomingEvent() return $event->first(); } - public function networks() + public function networks(): BelongsToMany { return $this->belongsToMany(Network::class, 'group_network', 'group_id', 'network_id'); } @@ -576,10 +576,9 @@ public function getTimezoneAttribute($value) if ($network->timezone) { if ($timezone) { if ($timezone != $network->timezone) { - // This should not occur if the networks are set up correctly. - \Sentry\captureMessage("Problem getting timezone for group {$this->idgroups} - networks conflict with $timezone and {$network->timezone}. Will use $timezone."); - // TODO Convert to exception once groups have timezones set by Neil. - // throw new \Exception("Group does not have own timezone and is in networks with conflicting timezones"); + // This indicates a data integrity problem - a group should not be in multiple networks with conflicting timezones. + \Sentry\captureMessage("Problem getting timezone for group {$this->idgroups} - networks conflict with $timezone and {$network->timezone}."); + throw new \Exception("Group does not have own timezone and is in networks with conflicting timezones"); } } else { // First timezone found. @@ -589,17 +588,14 @@ public function getTimezoneAttribute($value) } if (!$timezone) { - // This should not occur if the networks are set up correctly. - // TODO Later on we should throw an exception, but only once this code has gone live, as we rely on - // the default behaviour during migration. - //throw new \Exception("Group {$this->idgroups} cannot resolve timezone"); + // Extremely unlikely edge case - all networks have timezone defaults. + // Fallback to Europe/London which matches the network default. $timezone = 'Europe/London'; } return $timezone; } - // TODO We've started to refactor into scopes, but this isn't complete yet. public function scopeMembers() { return User::join('users_groups', 'users_groups.user', '=', 'users.id') ->where('users_groups.group', $this->idgroups) @@ -662,10 +658,8 @@ public function scopeUnapprovedVisibleTo($query, $user_id) { /** * Get a name for the Discourse group. - * - * @return string */ - public function getDiscourseGroupName($unique) + public function getDiscourseGroupName($unique): string { // Restricted characters allowed in name, and only 20 characters. // diff --git a/app/GroupTags.php b/app/GroupTags.php index 4c7a91e3ce..57bbddeb09 100644 --- a/app/GroupTags.php +++ b/app/GroupTags.php @@ -2,6 +2,8 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -27,13 +29,13 @@ class GroupTags extends Model protected $hidden = []; //Table Relations - public function group_tags() + public function group_tags(): BelongsToMany { return $this->belongsToMany(\App\GrouptagsGroups::class); } //Table Relations - public function groupTagGroups() + public function groupTagGroups(): HasMany { return $this->hasMany(GrouptagsGroups::class, 'group_tag', 'id'); } diff --git a/app/GrouptagsGroups.php b/app/GrouptagsGroups.php index 84e0fb3302..6603cc97f6 100644 --- a/app/GrouptagsGroups.php +++ b/app/GrouptagsGroups.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Model; class GrouptagsGroups extends Model @@ -33,7 +34,7 @@ class GrouptagsGroups extends Model * @version 1.0.0 * @return [type] */ - public function theGroup() + public function theGroup(): HasOne { return $this->hasOne(Group::class, 'idgroups', 'group'); } diff --git a/app/Helpers/Fixometer.php b/app/Helpers/Fixometer.php index 25b4caa80b..bd06a967cb 100644 --- a/app/Helpers/Fixometer.php +++ b/app/Helpers/Fixometer.php @@ -384,12 +384,12 @@ public static function hasImage($id, $table, $return_rows = false) try { if ($return_rows) { - return DB::select(DB::raw($sql), ['id' => $id, 'object' => $object]); + return DB::select($sql, ['id' => $id, 'object' => $object]); } - return count(DB::select(DB::raw($sql), ['id' => $id, 'object' => $object])) > 0 ? true : false; + return count(DB::select($sql, ['id' => $id, 'object' => $object])) > 0 ? true : false; } catch (\Illuminate\Database\QueryException $e) { - return db($e); + return $return_rows ? [] : false; } } } @@ -432,12 +432,12 @@ public static function removeImage($id, $table, $image) `xref`.`reference_type` = :object AND `xref`.`reference` = :id '; - DB::delete(DB::raw($sql), ['id' => $id, 'object' => $object]); + DB::delete($sql, ['id' => $id, 'object' => $object]); /** delete image from db **/ $sql = 'DELETE FROM `images` WHERE `images`.`idimages` = :image'; - DB::delete(DB::raw($sql), ['image' => $image->idimages]); + DB::delete($sql, ['image' => $image->idimages]); /** delete image from disk **/ unlink($_SERVER['DOCUMENT_ROOT'].'/uploads/'.$image->path); @@ -652,9 +652,8 @@ public static function hasPermission($slug) * Returns users who have a particular preference by slug * * @param $slug - * @return Collection */ - public static function usersWhoHavePreference($slug) + public static function usersWhoHavePreference($slug): Collection { return User::join('users_preferences', 'users_preferences.user_id', '=', 'users.id') ->join('preferences', 'preferences.id', '=', 'users_preferences.preference_id') diff --git a/app/Helpers/FixometerFile.php b/app/Helpers/FixometerFile.php index b88de61bcd..452fc9736c 100644 --- a/app/Helpers/FixometerFile.php +++ b/app/Helpers/FixometerFile.php @@ -56,11 +56,12 @@ public function upload($file, $type, $reference = null, $referenceType = null, $ ->forceDelete(); } - if ($ajax && gettype($user_file['tmp_name']) == 'array') { - $error = $user_file['error'][0]; + // Handle both array and non-array formats for $_FILES + if (gettype($user_file['tmp_name']) == 'array') { + $error = is_array($user_file['error']) ? $user_file['error'][0] : $user_file['error']; $tmp_name = $user_file['tmp_name'][0]; } else { - $error = $user_file['error']; + $error = is_array($user_file['error']) ? $user_file['error'][0] : $user_file['error']; $tmp_name = $user_file['tmp_name']; } @@ -180,14 +181,14 @@ public function findImages($of_ref_type, $ref_id) { $sql = 'SELECT * FROM `images` AS `i` INNER JOIN `xref` AS `x` ON `x`.`object` = `i`.`idimages` - WHERE `x`.`object_type` = '.env('TBL_IMAGES').' AND + WHERE `x`.`object_type` = :objectType AND `x`.`reference_type` = :refType AND `x`.`reference` = :refId'; try { - return DB::select(DB::raw($sql), ['refType' => $of_ref_type, 'refId' => $ref_id]); + return DB::select($sql, ['objectType' => env('TBL_IMAGES'), 'refType' => $of_ref_type, 'refId' => $ref_id]); } catch (\Illuminate\Database\QueryException $e) { - return db($e); + return []; } } @@ -195,7 +196,7 @@ public function deleteImage($idxref) { // Delete the xref. This is sufficient to stop the image being attached to the device. We leave the // file in existence in case we want it later for debugging/mining. - $sql = 'DELETE FROM `xref` WHERE `idxref` = :id AND `object_type` = '.env('TBL_IMAGES'); - DB::delete(DB::raw($sql), ['id' => $idxref]); + $sql = 'DELETE FROM `xref` WHERE `idxref` = :id AND `object_type` = :objectType'; + DB::delete($sql, ['id' => $idxref, 'objectType' => env('TBL_IMAGES')]); } } diff --git a/app/Helpers/LcaStats.php b/app/Helpers/LcaStats.php index f7c19cba22..cf7c26227c 100644 --- a/app/Helpers/LcaStats.php +++ b/app/Helpers/LcaStats.php @@ -54,6 +54,6 @@ public static function getWasteStats($group = null) FROM ($t1) t1 "; - return DB::select(DB::raw($sql)); + return DB::select($sql); } } diff --git a/app/Helpers/RepairNetworkService.php b/app/Helpers/RepairNetworkService.php index 96ce644c3e..71e9ccaa33 100644 --- a/app/Helpers/RepairNetworkService.php +++ b/app/Helpers/RepairNetworkService.php @@ -11,9 +11,9 @@ class RepairNetworkService { public function addGroupToNetwork($user, $group, $network) { - // TODO: Network leads will have permissions once this role is added. - if (! $user->hasRole('Administrator')) { - throw new \Exception('Only Adminstrators can add groups to networks'); + if (! $user->hasRole('Administrator') && + ! ($user->hasRole('NetworkCoordinator') && $user->networks->contains($network))) { + throw new \Exception('Only Administrators and Network Coordinators can add groups to networks'); } $network->addGroup($group); diff --git a/app/Helpers/RobustTranslator.php b/app/Helpers/RobustTranslator.php index 02a0e367a2..ae472dfc1f 100644 --- a/app/Helpers/RobustTranslator.php +++ b/app/Helpers/RobustTranslator.php @@ -8,10 +8,7 @@ class RobustTranslator extends BaseTranslator { /** - * @param string $key - * @param array $replace * @param null $locale - * @param bool $fallback * * @return array|null|string|void */ diff --git a/app/Http/Controllers/API/DeviceController.php b/app/Http/Controllers/API/DeviceController.php index 674899da57..2fed4219d8 100644 --- a/app/Http/Controllers/API/DeviceController.php +++ b/app/Http/Controllers/API/DeviceController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\API; +use Illuminate\Http\JsonResponse; use App\Barrier; use App\Device; use App\DeviceBarrier; @@ -344,7 +345,7 @@ public function createDevicev2(Request $request) * ) * ) */ - public function updateDevicev2(Request $request, $iddevices) + public function updateDevicev2(Request $request, $iddevices): JsonResponse { $user = $this->getUser(); @@ -440,7 +441,7 @@ public function updateDevicev2(Request $request, $iddevices) * ) */ - public function deleteDevicev2(Request $request, $iddevices) + public function deleteDevicev2(Request $request, $iddevices): JsonResponse { $user = $this->getUser(); diff --git a/app/Http/Controllers/API/DiscourseController.php b/app/Http/Controllers/API/DiscourseController.php index d8dee88ab2..8935171367 100644 --- a/app/Http/Controllers/API/DiscourseController.php +++ b/app/Http/Controllers/API/DiscourseController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\API; +use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; use App\Services\DiscourseService; use App\User; @@ -13,12 +14,8 @@ class DiscourseController extends Controller { /** * Get top Talk topics. - * - * @param \Illuminate\Http\Request $request - * @param string $tag - * @return \Illuminate\Http\Response */ - public function discussionTopics(Request $request, DiscourseService $discourseService, $tag = NULL) + public function discussionTopics(Request $request, DiscourseService $discourseService, string $tag = NULL): JsonResponse { $topics = []; diff --git a/app/Http/Controllers/API/EventController.php b/app/Http/Controllers/API/EventController.php index 38859a52d4..1b4c312d89 100644 --- a/app/Http/Controllers/API/EventController.php +++ b/app/Http/Controllers/API/EventController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\API; +use Illuminate\Http\JsonResponse; use App\Events\EditEvent; use App\EventsUsers; use App\Group; @@ -145,7 +146,7 @@ public function getEventsByUsersNetworks(Request $request, $date_from = null, $d return $collection; } - public function addVolunteer(Request $request, $idevents) + public function addVolunteer(Request $request, $idevents): JsonResponse { $request->validate([ 'volunteer_email_address' => ['nullable', 'email'], @@ -236,7 +237,7 @@ public function addVolunteer(Request $request, $idevents) } - public function listVolunteers(Request $request, $idevents) + public function listVolunteers(Request $request, $idevents): JsonResponse { $party = Party::findOrFail($idevents); @@ -455,7 +456,7 @@ public function moderateEventsv2(Request $request) * ) * ) */ - public function createEventv2(Request $request) + public function createEventv2(Request $request): JsonResponse { $user = $this->getUser(); @@ -471,7 +472,6 @@ public function createEventv2(Request $request) $autoapprove = $group->auto_approve; if (!Fixometer::userCanCreateEvents($user)) { - // TODO: This doesn't check that they are a host of this particular group. abort(403); } @@ -624,7 +624,7 @@ public function createEventv2(Request $request) * ) * ) */ - public function updateEventv2(Request $request, $idEvents) + public function updateEventv2(Request $request, $idEvents): JsonResponse { $user = $this->getUser(); @@ -740,7 +740,7 @@ function ($attribute, $value, $fail) use ($request) { $longitude = $geocoded['longitude']; } - return array( + return [ $groupid, $start, $end, @@ -753,6 +753,6 @@ function ($attribute, $value, $fail) use ($request) { $online, $link, $network_data - ); + ]; } } diff --git a/app/Http/Controllers/API/GroupController.php b/app/Http/Controllers/API/GroupController.php index 25076f9334..3a6b635d24 100644 --- a/app/Http/Controllers/API/GroupController.php +++ b/app/Http/Controllers/API/GroupController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\API; +use Illuminate\Http\JsonResponse; use App\Events\ApproveGroup; use App\Events\EditGroup; use App\Group; @@ -60,7 +61,7 @@ public static function getGroupChanges(Request $request) return response()->json($groupChanges); } - public static function getGroupsByUsersNetworks(Request $request) + public static function getGroupsByUsersNetworks(Request $request): JsonResponse { $authenticatedUser = Auth::user(); @@ -213,7 +214,7 @@ public static function mapDetailsAndAuditToChange($group, $groupAudit) return $groupChange; } - public static function getGroupList() + public static function getGroupList(): JsonResponse { $groups = Group::orderBy('created_at', 'desc'); @@ -644,7 +645,7 @@ private function getUser() { * ), * ) */ - public function moderateGroupsv2(Request $request) { + public function moderateGroupsv2(Request $request): JsonResponse { $user = $this->getUser(); $ret = \App\Http\Resources\GroupCollection::make(Group::unapprovedVisibleTo($user->id)); return response()->json($ret); @@ -726,7 +727,7 @@ public function moderateGroupsv2(Request $request) { * ) * ) */ - public function createGroupv2(Request $request) { + public function createGroupv2(Request $request): JsonResponse { $user = $this->getUser(); $user->convertToHost(); @@ -874,7 +875,7 @@ public function createGroupv2(Request $request) { * ) * ) */ - public function updateGroupv2(Request $request, $idGroup) { + public function updateGroupv2(Request $request, $idGroup): JsonResponse { $user = $this->getUser(); list($name, $area, $postcode, $location, $phone, $website, $description, $timezone, @@ -944,8 +945,6 @@ public function updateGroupv2(Request $request, $idGroup) { } // We can update the tags. The parameter is an array of ids. - // TODO The old code restricts updating tags to admins. But I wonder if it should include - // networks coordinators too. $tags = $request->tags; if ($tags) { @@ -1037,7 +1036,7 @@ private function validateGroupParams(Request $request, $create): array { } if (!empty($location)) { - $geocoder = new \App\Helpers\Geocoder(); + $geocoder = app(\App\Helpers\Geocoder::class); $geocoded = $geocoder->geocode($location); if (empty($geocoded)) @@ -1050,10 +1049,10 @@ private function validateGroupParams(Request $request, $create): array { // Note that the country returned by the geocoder is already in English, which is what we need for the // value in the database. - $country_code = $geocoded['country_code']; + $country_code = $geocoded['country_code'] ?? null; } - return array( + return [ $name, $area, $postcode, @@ -1068,6 +1067,6 @@ private function validateGroupParams(Request $request, $create): array { $network_data, $email, $archived_at - ); + ]; } } diff --git a/app/Http/Controllers/API/NetworkController.php b/app/Http/Controllers/API/NetworkController.php index d70a0b6b18..146cb8ce3f 100644 --- a/app/Http/Controllers/API/NetworkController.php +++ b/app/Http/Controllers/API/NetworkController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\API; +use Illuminate\Http\JsonResponse; use App\Group; use App\Http\Controllers\Controller; use App\Network; @@ -13,7 +14,7 @@ class NetworkController extends Controller { - public function stats(Network $network) + public function stats(Network $network): JsonResponse { if (! Auth::user()->can('view', $network)) { abort(403, 'You do not have access to this network'); diff --git a/app/Http/Controllers/API/UserController.php b/app/Http/Controllers/API/UserController.php index e27f32361c..54904b8993 100644 --- a/app/Http/Controllers/API/UserController.php +++ b/app/Http/Controllers/API/UserController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\API; +use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; use App\User; use Auth; @@ -91,12 +92,8 @@ protected static function mapUserAndAuditToUserChange($user, $audit) /** * Get notification counts for a user. - * - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response */ - public function notifications(Request $request, $id) + public function notifications(Request $request, int $id): JsonResponse { $user = User::findOrFail($id); $restartersNotifications = $user->unReadNotifications->count(); diff --git a/app/Http/Controllers/API/UserGroupsController.php b/app/Http/Controllers/API/UserGroupsController.php index b6194192dd..31806594f6 100644 --- a/app/Http/Controllers/API/UserGroupsController.php +++ b/app/Http/Controllers/API/UserGroupsController.php @@ -92,11 +92,9 @@ protected static function mapDetailsAndAuditToChange($userGroupAssociation, $aud /** * Leave the specified group. * - * @param \Illuminate\Http\Request $request - * @param int $id * @return \Illuminate\Http\Response */ - public function leave(Request $request, $id) + public function leave(Request $request, int $id) { $authenticatedUser = Auth::user(); if (! $authenticatedUser) { diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 9b581c099b..e23e0a3c54 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\View\View; use App\Device; use App\Party; @@ -10,7 +11,7 @@ */ class AdminController extends Controller { - public static function stats($section = 1, $paragraph_only = false) + public static function stats($section = 1, $paragraph_only = false): View { if ($section == 1) { $stats = self::getStats1(); diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php index 277105e504..edc8613fcd 100644 --- a/app/Http/Controllers/ApiController.php +++ b/app/Http/Controllers/ApiController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\Http\JsonResponse; use App\Device; use App\Group; use App\Party; @@ -46,7 +47,7 @@ class ApiController extends Controller /** * Embedded at https://therestartproject.org */ - public static function homepage_data() + public static function homepage_data(): JsonResponse { $result = []; @@ -98,7 +99,7 @@ public static function homepage_data() ->json($result, 200); } - public static function partyStats($partyId) + public static function partyStats($partyId): JsonResponse { $event = Party::where('idevents', $partyId)->first(); @@ -128,7 +129,7 @@ public static function partyStats($partyId) return response()->json($result, 200); } - public static function groupStats($groupId) + public static function groupStats($groupId): JsonResponse { $group = Group::where('idgroups', $groupId)->first(); @@ -159,7 +160,7 @@ public static function groupStats($groupId) return response()->json($result, 200); } - public static function getUserInfo() + public static function getUserInfo(): JsonResponse { $user = Auth::user(); @@ -184,11 +185,8 @@ public static function getUserList() /** * List/search devices. - * - * @param Request $request - * @return Response */ - public static function getDevices(Request $request, $page, $size) + public static function getDevices(Request $request, $page, $size): JsonResponse { $powered = $request->input('powered'); $sortBy = $request->input('sortBy'); @@ -275,7 +273,7 @@ public static function getDevices(Request $request, $page, $size) ]); } - public function timezones() { + public function timezones(): JsonResponse { $zones = \DateTimeZone::listIdentifiers(\DateTimeZone::ALL_WITH_BC); $ret = []; diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 05f53fe768..25f5a60abf 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Auth; +use Illuminate\View\View; use App\Device; use App\Helpers\Fixometer; use App\Http\Controllers\Controller; @@ -48,7 +49,6 @@ public function __construct() /** * Override login from AuthenticateUsers * - * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse * * @throws \Illuminate\Validation\ValidationException @@ -82,15 +82,11 @@ public function login(Request $request) /** * Override validateLogin from AuthenticateUsers - * - * @param \Illuminate\Http\Request $request - * @return void */ - protected function validateLogin(Request $request) + protected function validateLogin(Request $request): void { if (env('HONEYPOT_DISABLE', false)) { // This is used in Playwright testing where we get many requests in a short time. - // TODO There is probably a better place to put this code. app('honeypot')->disable(); } @@ -98,16 +94,14 @@ protected function validateLogin(Request $request) $this->username() => 'required|email', 'password' => 'required|string', 'my_name' => 'honeypot', - 'my_time' => 'required|honeytime:1', + 'my_time' => 'required|honeytime:0', ]); } /** * Override showLoginForm from AuthenticateUsers - * - * @return \Illuminate\Http\Response */ - public function showLoginForm() + public function showLoginForm(): View { $stats = Fixometer::loginRegisterStats(); diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index fa1217a820..cd9ab74050 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -42,11 +42,8 @@ public function __construct() /** * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator */ - protected function validator(array $data) + protected function validator(array $data): \Illuminate\Contracts\Validation\Validator { return Validator::make($data, [ 'name' => 'required|string|max:255', @@ -59,11 +56,8 @@ protected function validator(array $data) /** * Create a new user instance after a valid registration. - * - * @param array $data - * @return \App\User */ - protected function create(array $data) + protected function create(array $data): User { $user = User::create([ 'name' => $data['name'], diff --git a/app/Http/Controllers/BrandsController.php b/app/Http/Controllers/BrandsController.php index 52fb24807f..ebbf752ec1 100644 --- a/app/Http/Controllers/BrandsController.php +++ b/app/Http/Controllers/BrandsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\Http\RedirectResponse; use App\Brands; use App\Helpers\Fixometer; use Auth; @@ -24,7 +25,7 @@ public function index() ]); } - public function postCreateBrand(Request $request) + public function postCreateBrand(Request $request): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); @@ -51,7 +52,7 @@ public function getEditBrand($id) ]); } - public function postEditBrand($id, Request $request) + public function postEditBrand($id, Request $request): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); @@ -64,7 +65,7 @@ public function postEditBrand($id, Request $request) return Redirect::back()->with('success', __('brands.update_success')); } - public function getDeleteBrand($id) + public function getDeleteBrand($id): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index ee1bde1d20..336ca3c3c4 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use Illuminate\View\View; +use Illuminate\Http\RedirectResponse; use App\Category; use App\Helpers\Fixometer; use App\User; @@ -11,7 +13,7 @@ class CategoryController extends Controller { - public function index() + public function index(): View { $Category = new Category; @@ -39,7 +41,7 @@ public function getEditCategory($id) ]); } - public function postEditCategory($id, Request $request) + public function postEditCategory($id, Request $request): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 6c28bcb782..4c97f6f73e 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -3,12 +3,11 @@ namespace App\Http\Controllers; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; -use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; use Party; class Controller extends BaseController { - use AuthorizesRequests, DispatchesJobs, ValidatesRequests; + use AuthorizesRequests, ValidatesRequests; } diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index bf41ee9e39..34286640f0 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\View\View; use App\Group; use App\Party; use App\User; @@ -81,7 +82,7 @@ public function index() ); } - public function getHostDash() + public function getHostDash(): View { return view('dashboard.host'); } diff --git a/app/Http/Controllers/DeviceController.php b/app/Http/Controllers/DeviceController.php index ae8942b466..97801d9bf1 100644 --- a/app/Http/Controllers/DeviceController.php +++ b/app/Http/Controllers/DeviceController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\Http\RedirectResponse; use App\Brands; use App\Cluster; use App\Device; @@ -26,7 +27,7 @@ class DeviceController extends Controller { - public function index($search = null) + public function index($search = null): \Illuminate\View\View { $user = User::getProfile(Auth::id()); $clusters = Cluster::with(['categories'])->get()->all(); @@ -105,7 +106,7 @@ public function imageUpload(Request $request, $id) } } - public function deleteImage($device_id, $idxref) + public function deleteImage($device_id, $idxref): RedirectResponse { $user = Auth::user(); diff --git a/app/Http/Controllers/GroupController.php b/app/Http/Controllers/GroupController.php index 560def735e..e776661868 100644 --- a/app/Http/Controllers/GroupController.php +++ b/app/Http/Controllers/GroupController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\Http\RedirectResponse; use App\Device; use App\Events\ApproveGroup; use App\Events\EditGroup; @@ -287,7 +288,7 @@ public function view($groupid) ]); } - public function postSendInvite(Request $request) + public function postSendInvite(Request $request): RedirectResponse { $request->validate([ 'manual_invite_box' => [(new Delimited('email'))->min(1)], @@ -379,7 +380,7 @@ public function postSendInvite(Request $request) ])); } - public function confirmInvite($group_id, $hash) + public function confirmInvite($group_id, $hash): RedirectResponse { // Find user/group relationship based on the invitation hash. $user_group = UserGroups::where('status', $hash)->where('group', $group_id)->first(); @@ -435,7 +436,7 @@ public function edit(Request $request, $id, Geocoder $geocoder) ]); } - public function delete($id) + public function delete($id): RedirectResponse { $group = Group::where('idgroups', $id)->first(); @@ -541,7 +542,7 @@ public static function stats($id, $format = 'row') return view('group.stats', $groupStats); } - public function getJoinGroup($group_id) + public function getJoinGroup($group_id): RedirectResponse { $user_id = Auth::id(); $alreadyInGroup = UserGroups::where('group', $group_id) @@ -636,11 +637,10 @@ public function ajaxDeleteImage($group_id, $id, $path) * @author Christopher Kelker - @date 2019-03-25 * @editor Christopher Kelker * @version 1.0.0 - * @param Request $request * @param [type] $code * @return [type] */ - public function confirmCodeInvite(Request $request, $code) + public function confirmCodeInvite(Request $request, $code): RedirectResponse { // Variables $group = Group::where('shareable_code', $code)->first(); diff --git a/app/Http/Controllers/GroupTagsController.php b/app/Http/Controllers/GroupTagsController.php index bc52e4446c..9a616d6225 100644 --- a/app/Http/Controllers/GroupTagsController.php +++ b/app/Http/Controllers/GroupTagsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\Http\RedirectResponse; use App\GroupTags; use App\Helpers\Fixometer; use Auth; @@ -24,7 +25,7 @@ public function index() ]); } - public function postCreateTag(Request $request) + public function postCreateTag(Request $request): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); @@ -55,7 +56,7 @@ public function getEditTag($id) ]); } - public function postEditTag($id, Request $request) + public function postEditTag($id, Request $request): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); @@ -72,7 +73,7 @@ public function postEditTag($id, Request $request) return Redirect::back()->with('success', __('group-tags.update_success')); } - public function getDeleteTag($id) + public function getDeleteTag($id): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); diff --git a/app/Http/Controllers/InformationAlertCookieController.php b/app/Http/Controllers/InformationAlertCookieController.php index f0528c2fde..4aa4994c2d 100644 --- a/app/Http/Controllers/InformationAlertCookieController.php +++ b/app/Http/Controllers/InformationAlertCookieController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\Http\JsonResponse; use Cookie; use Illuminate\Http\Request; @@ -26,9 +27,8 @@ public function __construct() * Show the profile for the given user. * * @param int $id - * @return View */ - public function __invoke(Request $request) + public function __invoke(Request $request): JsonResponse { if (! $request->has('dismissable_id')) { return response()->json(false); diff --git a/app/Http/Controllers/NetworkController.php b/app/Http/Controllers/NetworkController.php index a605faa874..d41c26db0a 100644 --- a/app/Http/Controllers/NetworkController.php +++ b/app/Http/Controllers/NetworkController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use Illuminate\View\View; +use Illuminate\Http\RedirectResponse; use App\Group; use App\Network; use Auth; @@ -13,10 +15,8 @@ class NetworkController extends Controller { /** * Display a listing of the resource. - * - * @return \Illuminate\Http\Response */ - public function index() + public function index(): View { $user = Auth::user(); @@ -42,11 +42,8 @@ public function index() /** * Display the specified network. - * - * @param \App\Network $network - * @return \Illuminate\Http\Response */ - public function show(Network $network) + public function show(Network $network): View { $user = Auth::user(); @@ -66,11 +63,8 @@ public function show(Network $network) /** * Show the form for editing the specified resource. - * - * @param \App\Network $network - * @return \Illuminate\Http\Response */ - public function edit(Network $network) + public function edit(Network $network): View { $this->authorize('update', $network); @@ -81,12 +75,8 @@ public function edit(Network $network) /** * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param \App\Network $network - * @return \Illuminate\Http\Response */ - public function update(Request $request, Network $network) + public function update(Request $request, Network $network): RedirectResponse { $this->authorize('update', $network); @@ -110,11 +100,8 @@ public function update(Request $request, Network $network) /** * Associate groups to the specified network. - * - * @param \App\Network $network - * @return \Illuminate\Http\Response */ - public function associateGroup(Request $request, Network $network) + public function associateGroup(Request $request, Network $network): RedirectResponse { $this->authorize('associateGroups', $network); diff --git a/app/Http/Controllers/PartyController.php b/app/Http/Controllers/PartyController.php index bdcdbbb693..5f5b551325 100644 --- a/app/Http/Controllers/PartyController.php +++ b/app/Http/Controllers/PartyController.php @@ -2,6 +2,9 @@ namespace App\Http\Controllers; +use Illuminate\View\View; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\RedirectResponse; use App\Audits; use App\Brands; use App\Cluster; @@ -88,7 +91,6 @@ public static function expandEvent($event, $group = null, $countries = null, $at } } - // TODO LATER Consider whether these stats should be in the event or passed into the store. $thisone['stats'] = $event->getEventStats(); // These counts are separate from the list of participants - that list is of named individuals, but you @@ -117,7 +119,7 @@ public static function expandEvent($event, $group = null, $countries = null, $at return $thisone; } - public function index($group_id = null) + public function index($group_id = null): View { $events = []; @@ -187,7 +189,7 @@ public function index($group_id = null) ]); } - public function create(Request $request, $group_id = null) + public function create(Request $request, $group_id = null): View { $user = Auth::user(); $autoapprove = $group_id ? Group::where('idgroups', $group_id)->first()->auto_approve : false; @@ -308,7 +310,7 @@ public function duplicate($id, Request $request) ]); } - public function view($id) + public function view($id): View { $File = new FixometerFile; $Party = new Party; @@ -412,7 +414,7 @@ public function generateAddToCalendarLinks($event) } } - public function getJoinEvent($event_id) + public function getJoinEvent($event_id): RedirectResponse { $user_id = Auth::id(); $not_in_event = EventsUsers::where('event', $event_id) @@ -490,7 +492,7 @@ public function notifyHostsOfRsvp($user_event, $event_id) } } - public static function stats($id) + public static function stats($id): View { $event = Party::where('idevents', $id)->first(); @@ -509,9 +511,9 @@ public static function stats($id) * * @param int $event_id The event for which to find associated users. * - * @return Response json formatted array of relevant info on users in the group. + * @return JsonResponse json formatted array of relevant info on users in the group. */ - public function getGroupEmailsWithNames($event_id) + public function getGroupEmailsWithNames(int $event_id): JsonResponse { $group_user_ids = UserGroups::where('group', Party::find($event_id)->group) ->where('user', '!=', Auth::user()->id) @@ -534,7 +536,7 @@ public function getGroupEmailsWithNames($event_id) return response()->json($group_users); } - public function updateQuantity(Request $request) + public function updateQuantity(Request $request): JsonResponse { $event_id = $request->input('event_id'); $quantity = $request->input('quantity'); @@ -556,7 +558,7 @@ public function updateQuantity(Request $request) return response()->json($return); } - public function updateVolunteerQuantity(Request $request) + public function updateVolunteerQuantity(Request $request): JsonResponse { $event_id = $request->input('event_id'); $quantity = $request->input('quantity'); @@ -578,7 +580,7 @@ public function updateVolunteerQuantity(Request $request) return response()->json($return); } - public function removeVolunteer(Request $request) + public function removeVolunteer(Request $request): JsonResponse { // The id that's passed in is that of the events_users table, because the entry may refer to a user without // an id. @@ -609,7 +611,7 @@ public function removeVolunteer(Request $request) } } - public function postSendInvite(Request $request) + public function postSendInvite(Request $request): RedirectResponse { $from_id = Auth::id(); $request->validate([ @@ -708,7 +710,7 @@ public function postSendInvite(Request $request) return redirect()->back()->with('warning', __('events.invite_noemails')); } - public function confirmInvite($event_id, $hash) + public function confirmInvite($event_id, $hash): RedirectResponse { $user_event = EventsUsers::where('status', $hash)->where('event', $event_id)->first(); @@ -727,7 +729,7 @@ public function confirmInvite($event_id, $hash) return redirect('/party/view/'.intval($event_id))->with('warning', __('events.invite_invalid')); } - public function cancelInvite($event_id) + public function cancelInvite($event_id): RedirectResponse { // We have to do a loop to avoid the gotcha where bulk delete operations don't invoke observers. foreach (EventsUsers::where('user', Auth::user()->id)->where('event', $event_id)->get() as $delete) { @@ -767,7 +769,7 @@ public function imageUpload(Request $request, $id) } } - public function deleteImage($event_id, $id, $path) + public function deleteImage($event_id, $id, $path): RedirectResponse { $user = Auth::user(); @@ -788,7 +790,7 @@ public function deleteImage($event_id, $id, $path) * This sends an email to all user except the host logged in an email to ask for contributions * */ - public function getContributions($event_id) + public function getContributions($event_id): RedirectResponse { $event = Party::find($event_id); @@ -816,7 +818,7 @@ public function getContributions($event_id) * Called via AJAX. * @param id The event id. */ - public function deleteEvent($id) + public function deleteEvent($id): RedirectResponse { $event = Party::findOrFail($id); $user = Auth::user(); @@ -854,11 +856,10 @@ public function deleteEvent($id) * @author Christopher Kelker - @date 2019-03-25 * @editor Christopher Kelker * @version 1.0.0 - * @param Request $request * @param [type] $code * @return [type] */ - public function confirmCodeInvite(Request $request, $code) + public function confirmCodeInvite(Request $request, $code): RedirectResponse { // Variables $party = Party::where('shareable_code', $code)->first(); diff --git a/app/Http/Controllers/RoleController.php b/app/Http/Controllers/RoleController.php index d89aef3eec..278467af94 100644 --- a/app/Http/Controllers/RoleController.php +++ b/app/Http/Controllers/RoleController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\View\View; use App\Helpers\Fixometer; use App\Providers\RouteServiceProvider; use App\Role; @@ -33,7 +34,7 @@ public function index() return redirect(RouteServiceProvider::HOME); } - public function edit($id, Request $request) + public function edit($id, Request $request): View { $user = Auth::user(); diff --git a/app/Http/Controllers/SkillsController.php b/app/Http/Controllers/SkillsController.php index b9b63fbb0a..89331d84ff 100644 --- a/app/Http/Controllers/SkillsController.php +++ b/app/Http/Controllers/SkillsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Illuminate\Http\RedirectResponse; use App\Helpers\Fixometer; use App\Skills; use App\UsersSkills; @@ -25,7 +26,7 @@ public function index() ]); } - public function postCreateSkill(Request $request) + public function postCreateSkill(Request $request): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); @@ -53,7 +54,7 @@ public function getEditSkill($id) ]); } - public function postEditSkill($id, Request $request) + public function postEditSkill($id, Request $request): RedirectResponse { if (! Fixometer::hasRole(Auth::user(), 'Administrator')) { return redirect('/user/forbidden'); @@ -68,7 +69,7 @@ public function postEditSkill($id, Request $request) return Redirect::back()->with('success', __('skills.update_success')); } - public function getDeleteSkill($id) + public function getDeleteSkill($id): RedirectResponse { // Are you an admin? diff --git a/app/Http/Controllers/StyleController.php b/app/Http/Controllers/StyleController.php index 950948e174..44a949b859 100644 --- a/app/Http/Controllers/StyleController.php +++ b/app/Http/Controllers/StyleController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use Illuminate\Http\RedirectResponse; +use Illuminate\View\View; use Auth; use Illuminate\Http\Request; @@ -9,10 +11,8 @@ class StyleController extends Controller { /** * Nothing to see here. - * - * @return \Illuminate\Http\Response */ - public function index(Request $request) + public function index(Request $request): RedirectResponse { return redirect()->action([\App\Http\Controllers\HomeController::class, 'index']); } @@ -26,7 +26,7 @@ public function guide(Request $request) return view('test.styles', []); } - public function find(Request $request) + public function find(Request $request): View { $result = $this->findClassElements(); logger($result); diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index d1df28ea95..c10b393586 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers; +use Illuminate\View\View; +use Illuminate\Http\RedirectResponse; +use Illuminate\Http\JsonResponse; use App; use App\Device; -use App\DripEvent; use App\Events\PasswordChanged; use App\Events\UserLanguageUpdated; use App\Events\UserRegistered; @@ -47,10 +49,8 @@ class UserController extends Controller { /** * Show the application dashboard. - * - * @return \Illuminate\Http\Response */ - public function index($id = null) + public function index($id = null): View { if (is_null($id)) { $id = Auth::id(); @@ -67,7 +67,7 @@ public function index($id = null) ]); } - public function getProfileEdit($id = null) + public function getProfileEdit($id = null): View { if (is_null($id)) { $user = Auth::user(); @@ -122,7 +122,7 @@ public function getProfileEdit($id = null) ]); } - public function getNotifications() + public function getNotifications(): View { $user = Auth::user(); $notifications = $user->notifications()->paginate(10); @@ -133,7 +133,7 @@ public function getNotifications() ]); } - public function postProfileInfoEdit(Request $request, App\Helpers\Geocoder $geocoder) + public function postProfileInfoEdit(Request $request, App\Helpers\Geocoder $geocoder): RedirectResponse { $rules = [ 'name' => 'required|string|max:255', @@ -166,10 +166,6 @@ public function postProfileInfoEdit(Request $request, App\Helpers\Geocoder $geoc $user = User::find($id); - if ($user->isDripSubscriber()) { - DripEvent::createOrUpdateSubscriber($user, true, auth()->user()->email, request()->input('email')); - } - if (! empty($user->location)) { $geocoded = $geocoder->geocode("{$user->location}, " . Fixometer::getCountryFromCountryCode($user->country_code)); if (! empty($geocoded)) { @@ -189,7 +185,7 @@ public function postProfileInfoEdit(Request $request, App\Helpers\Geocoder $geoc return redirect()->back()->with('message', __('profile.profile_updated')); } - public function postProfilePasswordEdit(Request $request) + public function postProfilePasswordEdit(Request $request): RedirectResponse { if ($request->input('id') !== null) { $id = $request->input('id'); @@ -221,7 +217,7 @@ public function postProfilePasswordEdit(Request $request) return redirect()->back()->with('error', __('profile.password_old_mismatch')); } - public function postProfileRepairDirectory(Request $request) + public function postProfileRepairDirectory(Request $request): RedirectResponse { $rules = [ 'role' => 'required|digits_between:'.Role::REPAIR_DIRECTORY_SUPERADMIN.','.Role::REPAIR_DIRECTORY_EDITOR, @@ -238,7 +234,7 @@ public function postProfileRepairDirectory(Request $request) $user = User::find($id); // Check that we are allowed to change the role, based on our own role. - $this->authorize('changeRepairDirRole', [Auth::user(), $user, $role]); + $this->authorize('changeRepairDirRole', [$user, $role]); $user->update([ 'repairdir_role' => $role, @@ -249,7 +245,7 @@ public function postProfileRepairDirectory(Request $request) return redirect()->back()->with('message', __('profile.profile_updated')); } - public function storeLanguage(Request $request) + public function storeLanguage(Request $request): RedirectResponse { if ($request->input('id') !== null) { $userId = $request->input('id'); @@ -275,7 +271,7 @@ public function storeLanguage(Request $request) return redirect()->back()->with('message', Lang::get('profile.language_updated')); } - public function postSoftDeleteUser(Request $request) + public function postSoftDeleteUser(Request $request): RedirectResponse { if ($request->input('id') !== null) { $id = $request->input('id'); @@ -287,10 +283,6 @@ public function postSoftDeleteUser(Request $request) $old_user_name = $user->name; $user_id = $user->id; - if ($user->isDripSubscriber()) { - $user->drip_subscriber_id = null; - } - $user->delete(); // Will be anonymised automatically by event handlers if (Auth::id() !== $user_id) { @@ -302,7 +294,7 @@ public function postSoftDeleteUser(Request $request) } } - public function postProfilePreferencesEdit(Request $request) + public function postProfilePreferencesEdit(Request $request): RedirectResponse { if ($request->input('id') !== null) { $id = $request->input('id'); @@ -322,7 +314,7 @@ public function postProfilePreferencesEdit(Request $request) return redirect()->back()->with('message', Lang::get('profile.preferences_updated')); } - public function postProfileTagsEdit(Request $request) + public function postProfileTagsEdit(Request $request): RedirectResponse { if ($request->input('id') !== null) { $id = $request->input('id'); @@ -345,7 +337,7 @@ public function postProfileTagsEdit(Request $request) return redirect()->back()->with('message', Lang::get('profile.skills_updated')); } - public function postProfilePictureEdit(Request $request) + public function postProfilePictureEdit(Request $request): RedirectResponse { if ($request->input('id') !== null) { $id = $request->input('id'); @@ -363,7 +355,7 @@ public function postProfilePictureEdit(Request $request) return redirect()->back()->with('error', __('profile.picture_error')); } - public function postAdminEdit(Request $request) + public function postAdminEdit(Request $request): RedirectResponse { if ($request->input('id') !== null) { $user_id = $request->input('id'); @@ -407,7 +399,7 @@ public function postAdminEdit(Request $request) return redirect()->back()->with('message', __('profile.admin_success')); } - public function recover(Request $request) + public function recover(Request $request): View { $User = new User; @@ -499,7 +491,7 @@ public function reset(Request $request) $oldPassword = $user->password; $update = $user->update([ - 'password' => crypt($pwd, '$1$'.strrev(md5(env('APP_KEY')))), + 'password' => Hash::make($pwd), ]); if ($update) { @@ -679,7 +671,7 @@ public function create(Request $request) // No errors. We can proceed and create the User. $data = ['name' => $name, 'email' => $email, - 'password' => crypt($pwd, '$1$'.strrev(md5(env('APP_KEY')))), + 'password' => Hash::make($pwd), 'role' => $role, 'calendar_hash' => Str::random(15), //'group' => $group @@ -744,8 +736,8 @@ public function edit($id, Request $request) $user = Auth::user(); $User = new User; - // Administrators can edit users. - if (Fixometer::hasRole($user, 'Administrator') || Fixometer::hasRole($user, 'Host')) { + // Administrators and Hosts can edit users. Users can edit themselves. + if (Fixometer::hasRole($user, 'Administrator') || Fixometer::hasRole($user, 'Host') || $user->id == $id) { $Roles = new Role; $Roles = $Roles->findAll(); @@ -769,7 +761,7 @@ public function edit($id, Request $request) if ($data['new-password'] !== $data['password-confirm']) { $error['password'] = 'The passwords are not identical!'; } else { - $data['password'] = crypt($data['new-password'], '$1$'.strrev(md5(env('APP_KEY')))); + $data['password'] = Hash::make($data['new-password']); } } @@ -801,6 +793,9 @@ public function edit($id, Request $request) if (Fixometer::hasRole($user, 'Host')) { // Use @ for phpunit tests. @header('Location: /host?action=ue&code=200'); + } elseif ($user->id == $id && !Fixometer::hasRole($user, 'Administrator')) { + // Regular users editing themselves should return empty response + return response(''); } } @@ -847,9 +842,12 @@ public function edit($id, Request $request) ]); } } + + // Add a default return for when user doesn't have permissions + abort(403, 'Unauthorized'); } - public function logout() + public function logout(): RedirectResponse { Auth::logout(); @@ -863,6 +861,7 @@ public function getRegister($hash = null) } $stats = Fixometer::loginRegisterStats(); + $deviceCount = array_key_exists(0, $stats['device_count_status']) ? $stats['device_count_status'][0]->counter : 0; $activeRepairNetworkId = session()->get('repair_network'); $network = Network::find($activeRepairNetworkId); @@ -870,15 +869,15 @@ public function getRegister($hash = null) return view('auth.register-new', [ 'skills' => Fixometer::allSkills(), - 'co2Total' => $stats['co2Total'], - 'wasteTotal' => $stats['wasteTotal'], - 'partiesCount' => $stats['partiesCount'], - 'deviceCount' => $stats['deviceCount'], + 'co2Total' => $stats['waste_stats'][0]->powered_footprint + $stats['waste_stats'][0]->unpowered_footprint, + 'wasteTotal' => $stats['waste_stats'][0]->powered_waste + $stats['waste_stats'][0]->unpowered_waste, + 'partiesCount' => count($stats['allparties']), + 'deviceCount' => $deviceCount, 'showNewsletterSignup' => $showNewsletterSignup, ]); } - public function postRegister(Request $request, $hash = null) + public function postRegister(Request $request, $hash = null): RedirectResponse { $geocoder = new \App\Helpers\Geocoder(); @@ -957,15 +956,6 @@ public function postRegister(Request $request, $hash = null) $subscribed = false; } - if (env('DRIP_API_TOKEN') !== null && env('DRIP_API_TOKEN') !== '') { - $activeRepairNetworkId = session()->get('repair_network'); - $network = Network::find($activeRepairNetworkId); - if (! is_null($network) && $network->users_push_to_drip) { - $drip_subscribe_user = DripEvent::createOrUpdateSubscriber($user, $subscribed); - $user->drip_subscriber_id = $drip_subscribe_user->id; - } - } - // 'invites' refers to receiving notifications about groups or events near the user. if (! is_null($request->input('invites')) && $request->input('invites') == 1) { //Subscribe to invites $user->invites = 1; @@ -1056,14 +1046,16 @@ public function getOnboardingComplete() return 'true'; } - public function postEmail(Request $request) + public function postEmail(Request $request): JsonResponse { if (User::where('email', '=', $request->get('email'))->exists()) { return response()->json(['message' => __('auth.email_address_validation')]); } + + return response()->json(['message' => 'Email is available']); } - public static function getThumbnail(Request $request) + public static function getThumbnail(Request $request): JsonResponse { $user = User::where('mediawiki', $request->input('wiki_username'))->first(); @@ -1080,7 +1072,7 @@ public static function getThumbnail(Request $request) return response()->json($thumbnailPath); } - public function getUserMenus(Request $request) + public function getUserMenus(Request $request): JsonResponse { $user = User::where('mediawiki', $request->input('wiki_username'))->first(); @@ -1121,6 +1113,19 @@ public function getUserMenus(Request $request) $menus['Administrator'] = $adminMenu; } + if ($user->hasRole('Administrator') || $user->hasRole('NetworkCoordinator') || $user->hasRole('Host')) { + $items = []; + $items[Lang::get('general.party_reporting')] = url('/search'); + + $reportingMenu = [ + 'name' => Lang::get('general.reporting'), + 'items' => $items, + 'svg' => self::reportingMenuSvg, + ]; + + $menus['Reporting'] = $reportingMenu; + } + $generalMenu = [ 'name' => Lang::get('general.general'), 'items' => [ diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 7c1a359ba1..dcf15edb83 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -45,25 +45,26 @@ class Kernel extends HttpKernel \App\Http\Middleware\VerifyTranslationAccess::class, ], 'api' => [ - 'throttle:api', + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; /** - * The application's route middleware. + * The application's middleware aliases. * - * These middleware may be assigned to groups or used individually. + * Aliases may be used to conveniently assign middleware to routes and groups. * * @var array */ - protected $routeMiddleware = [ + protected $middlewareAliases = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verifyUserConsent' => \App\Http\Middleware\VerifyUserConsent::class, diff --git a/app/Http/Middleware/APISetLocale.php b/app/Http/Middleware/APISetLocale.php index ef3277c2e7..201fc1cef7 100644 --- a/app/Http/Middleware/APISetLocale.php +++ b/app/Http/Middleware/APISetLocale.php @@ -2,6 +2,7 @@ namespace App\Http\Middleware; +use Illuminate\Http\Request; use Closure; use Illuminate\Auth\Middleware\Authenticate; diff --git a/app/Http/Middleware/AcceptUserInvites.php b/app/Http/Middleware/AcceptUserInvites.php index 9747f527d5..cd700b6753 100644 --- a/app/Http/Middleware/AcceptUserInvites.php +++ b/app/Http/Middleware/AcceptUserInvites.php @@ -2,6 +2,8 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use App\EventsUsers; use App\Invite; use App\UserGroups; @@ -12,12 +14,8 @@ class AcceptUserInvites { /** * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { // Check if there are existing Groups/Events Shareable Invites for the // Current User diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index a4be5c587e..d4ef6447a9 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -3,19 +3,15 @@ namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; +use Illuminate\Http\Request; class Authenticate extends Middleware { /** * Get the path the user should be redirected to when they are not authenticated. - * - * @param \Illuminate\Http\Request $request - * @return string */ - protected function redirectTo($request) + protected function redirectTo(Request $request): ?string { - if (! $request->expectsJson()) { - return route('login'); - } + return $request->expectsJson() ? null : route('login'); } } diff --git a/app/Http/Middleware/CheckForRepairNetwork.php b/app/Http/Middleware/CheckForRepairNetwork.php index d14cd62ac9..0b39aebb4c 100644 --- a/app/Http/Middleware/CheckForRepairNetwork.php +++ b/app/Http/Middleware/CheckForRepairNetwork.php @@ -2,6 +2,8 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use App; use App\Network; use Auth; @@ -16,11 +18,8 @@ class CheckForRepairNetwork * on the website * @author Dean Appleton-Claydon * @date 2019-03-20 - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { $host = $request->getHost(); $update_user = []; @@ -40,7 +39,22 @@ public function handle($request, Closure $next) $network = $networkQuery->first(); if (empty($network)) { - throw new \Exception('Could not determine repair network from domain'); + // In testing environment, fall back to any available network or create one + if (app()->environment('testing')) { + $network = Network::first(); + if (empty($network)) { + // Create a default test network if none exists + $network = new Network(); + $network->name = 'Test Network'; + $network->shortname = 'restarters'; + $network->default_language = 'en'; + $network->save(); + } + } + + if (empty($network)) { + throw new \Exception('Could not determine repair network from domain'); + } } $locale = $network->default_language; $repair_network = $network->id; diff --git a/app/Http/Middleware/EnsureAPIToken.php b/app/Http/Middleware/EnsureAPIToken.php index 69924758a7..6be9294091 100644 --- a/app/Http/Middleware/EnsureAPIToken.php +++ b/app/Http/Middleware/EnsureAPIToken.php @@ -2,6 +2,8 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use App\User; use Auth; use Closure; @@ -10,12 +12,8 @@ class EnsureAPIToken { /** * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { if (Auth::check() && Auth::user()) { // We want to ensure that every user has an API token. This is because the Vue client's use of the API @@ -26,7 +24,7 @@ public function handle($request, Closure $next) $response = $next($request); if (method_exists($response, 'withCookie')) { - $response->withCookie(cookie()->forever('restarters_apitoken', $token, null, null, false, false)); + $response = $response->withCookie(cookie()->forever('restarters_apitoken', $token, null, null, false, false)); } return $response; diff --git a/app/Http/Middleware/HttpsProtocol.php b/app/Http/Middleware/HttpsProtocol.php index b7c100ebfc..045a8d2126 100644 --- a/app/Http/Middleware/HttpsProtocol.php +++ b/app/Http/Middleware/HttpsProtocol.php @@ -2,18 +2,16 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use Closure; class HttpsProtocol { /** * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { if (! $request->secure() && (env('APP_ENV') === 'development' || env('APP_ENV') === 'production')) { return redirect()->secure($request->getRequestUri(), 301); diff --git a/app/Http/Middleware/LanguageSwitcher.php b/app/Http/Middleware/LanguageSwitcher.php index a8c6fe8400..e395fb1ab3 100644 --- a/app/Http/Middleware/LanguageSwitcher.php +++ b/app/Http/Middleware/LanguageSwitcher.php @@ -2,6 +2,8 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use App; use Auth; use Closure; @@ -13,12 +15,8 @@ class LanguageSwitcher { /** * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { // A query string parameter of locale overrides all other places to attempt to determine the locale. if ($request->exists('locale')) { diff --git a/app/Http/Middleware/LogHTTPErrorsToSentry.php b/app/Http/Middleware/LogHTTPErrorsToSentry.php index 49834b97df..3bbb228653 100644 --- a/app/Http/Middleware/LogHTTPErrorsToSentry.php +++ b/app/Http/Middleware/LogHTTPErrorsToSentry.php @@ -2,17 +2,15 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use Closure; class LogHTTPErrorsToSentry { /** * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { $response = $next($request); diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index a2813a0648..4b2af74dfe 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -6,18 +6,16 @@ use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Symfony\Component\HttpFoundation\Response; class RedirectIfAuthenticated { /** * Handle an incoming request. * - * @param \Illuminate\Http\Request $request * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next - * @param string|null ...$guards - * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse */ - public function handle(Request $request, Closure $next, ...$guards) + public function handle(Request $request, Closure $next, string ...$guards): Response { $guards = empty($guards) ? [null] : $guards; diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php index 7186414c65..c9c58bddce 100644 --- a/app/Http/Middleware/TrustHosts.php +++ b/app/Http/Middleware/TrustHosts.php @@ -11,7 +11,7 @@ class TrustHosts extends Middleware * * @return array */ - public function hosts() + public function hosts(): array { return [ $this->allSubdomainsOfApplicationUrl(), diff --git a/app/Http/Middleware/VerifyTranslationAccess.php b/app/Http/Middleware/VerifyTranslationAccess.php index 1b1fe65e2c..7da689d1c7 100644 --- a/app/Http/Middleware/VerifyTranslationAccess.php +++ b/app/Http/Middleware/VerifyTranslationAccess.php @@ -2,6 +2,8 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use App\Helpers\Fixometer; use App\User; use Auth; @@ -11,12 +13,8 @@ class VerifyTranslationAccess { /** * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { $has_permission = User::join('users_permissions', 'users_permissions.user_id', '=', 'users.id') ->join('permissions', 'permissions.idpermissions', '=', 'users_permissions.permission_id') diff --git a/app/Http/Middleware/VerifyUserConsent.php b/app/Http/Middleware/VerifyUserConsent.php index a652e0f1a5..d89f183a2c 100644 --- a/app/Http/Middleware/VerifyUserConsent.php +++ b/app/Http/Middleware/VerifyUserConsent.php @@ -2,6 +2,8 @@ namespace App\Http\Middleware; +use Symfony\Component\HttpFoundation\Response; +use Illuminate\Http\Request; use App\User; use Auth; use Closure; @@ -10,12 +12,8 @@ class VerifyUserConsent { /** * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next): Response { if (Auth::check() && Auth::user()->hasUserGivenConsent()) { return $next($request); diff --git a/app/Http/Resources/Alert.php b/app/Http/Resources/Alert.php index f5268aab58..58dde80f8d 100644 --- a/app/Http/Resources/Alert.php +++ b/app/Http/Resources/Alert.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; @@ -72,11 +73,8 @@ class Alert extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { $ret = [ 'id' => $this->id, diff --git a/app/Http/Resources/AlertCollection.php b/app/Http/Resources/AlertCollection.php index f850ac63d3..0861f36b23 100644 --- a/app/Http/Resources/AlertCollection.php +++ b/app/Http/Resources/AlertCollection.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; /** @@ -20,11 +21,8 @@ class AlertCollection extends ResourceCollection { /** * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return parent::toArray($request); } diff --git a/app/Http/Resources/Category.php b/app/Http/Resources/Category.php index fcd8d1ac13..e25a1ae1ef 100644 --- a/app/Http/Resources/Category.php +++ b/app/Http/Resources/Category.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; /** @@ -37,11 +38,8 @@ class Category extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'id' => $this->idcategories, diff --git a/app/Http/Resources/Device.php b/app/Http/Resources/Device.php index d41a316cd7..fbef390d1e 100644 --- a/app/Http/Resources/Device.php +++ b/app/Http/Resources/Device.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use App\Party; use Illuminate\Http\Resources\Json\JsonResource; @@ -181,11 +182,8 @@ class Device extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { $event = \App\Party::find($this->event); $group = $event ? \App\Group::find($event->group) : NULL; diff --git a/app/Http/Resources/Group.php b/app/Http/Resources/Group.php index 211a9088fd..c4bc6e435e 100644 --- a/app/Http/Resources/Group.php +++ b/app/Http/Resources/Group.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; @@ -268,11 +269,8 @@ class Group extends JsonResource /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { $stats = $this->resource->getGroupStats(); $stats['events'] = $stats['parties']; diff --git a/app/Http/Resources/GroupCollection.php b/app/Http/Resources/GroupCollection.php index 23008f02ea..d109264c2a 100644 --- a/app/Http/Resources/GroupCollection.php +++ b/app/Http/Resources/GroupCollection.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; /** @@ -20,11 +21,8 @@ class GroupCollection extends ResourceCollection { /** * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return parent::toArray($request); } diff --git a/app/Http/Resources/GroupLocation.php b/app/Http/Resources/GroupLocation.php index ec4f75d22d..c4e3949ccb 100644 --- a/app/Http/Resources/GroupLocation.php +++ b/app/Http/Resources/GroupLocation.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Facades\Auth; @@ -62,11 +63,8 @@ class GroupLocation extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { $ret = [ 'location' => $this->location, diff --git a/app/Http/Resources/GroupSummary.php b/app/Http/Resources/GroupSummary.php index 2d8a493d9f..b4af5cf306 100644 --- a/app/Http/Resources/GroupSummary.php +++ b/app/Http/Resources/GroupSummary.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; @@ -81,11 +82,8 @@ class GroupSummary extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { $ret = [ 'id' => $this->idgroups, diff --git a/app/Http/Resources/Image.php b/app/Http/Resources/Image.php index 436b508a52..0a49c50117 100644 --- a/app/Http/Resources/Image.php +++ b/app/Http/Resources/Image.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; /** @@ -30,11 +31,8 @@ class Image extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'id' => $this->idimages, diff --git a/app/Http/Resources/Item.php b/app/Http/Resources/Item.php index fd9a870d2b..03c53b1288 100644 --- a/app/Http/Resources/Item.php +++ b/app/Http/Resources/Item.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; /** @@ -44,11 +45,8 @@ class Item extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'type' => $this->item_type, diff --git a/app/Http/Resources/ItemCollection.php b/app/Http/Resources/ItemCollection.php index e89c2619b6..3fe9835e25 100644 --- a/app/Http/Resources/ItemCollection.php +++ b/app/Http/Resources/ItemCollection.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; /** @@ -20,11 +21,8 @@ class ItemCollection extends ResourceCollection { /** * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return parent::toArray($request); } diff --git a/app/Http/Resources/Network.php b/app/Http/Resources/Network.php index db727b23b7..a9cbbd655e 100644 --- a/app/Http/Resources/Network.php +++ b/app/Http/Resources/Network.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; /** @@ -206,11 +207,8 @@ class Network extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'id' => $this->id, diff --git a/app/Http/Resources/NetworkSummary.php b/app/Http/Resources/NetworkSummary.php index 2be5f0b2bb..6a63d7e94d 100644 --- a/app/Http/Resources/NetworkSummary.php +++ b/app/Http/Resources/NetworkSummary.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; /** @@ -45,11 +46,8 @@ class NetworkSummary extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'id' => $this->id, diff --git a/app/Http/Resources/NetworkSummaryCollection.php b/app/Http/Resources/NetworkSummaryCollection.php index 605a03a8d4..056a3c2d7b 100644 --- a/app/Http/Resources/NetworkSummaryCollection.php +++ b/app/Http/Resources/NetworkSummaryCollection.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; /** @@ -20,11 +21,8 @@ class NetworkSummaryCollection extends ResourceCollection { /** * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return parent::toArray($request); } diff --git a/app/Http/Resources/Party.php b/app/Http/Resources/Party.php index e0e78b56fb..e79eb523cb 100644 --- a/app/Http/Resources/Party.php +++ b/app/Http/Resources/Party.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; @@ -238,11 +239,8 @@ class Party extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { // We return information which can be public, and we rename fields to look more consistent. $networkData = gettype($this->network_data) == 'string' ? json_decode($this->network_data, true) : $this->network_data; diff --git a/app/Http/Resources/PartySummary.php b/app/Http/Resources/PartySummary.php index 86855eb8fc..2ed021d79d 100644 --- a/app/Http/Resources/PartySummary.php +++ b/app/Http/Resources/PartySummary.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; @@ -107,11 +108,8 @@ class PartySummary extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { // We return information which can be public, and we rename fields to look more consistent. // diff --git a/app/Http/Resources/Skill.php b/app/Http/Resources/Skill.php index 137cc36436..7dd62cea1a 100644 --- a/app/Http/Resources/Skill.php +++ b/app/Http/Resources/Skill.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; /** @@ -44,11 +45,8 @@ class Skill extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'id' => $this->id, diff --git a/app/Http/Resources/SkillCollection.php b/app/Http/Resources/SkillCollection.php index 03ac5b12fd..80d412f4a3 100644 --- a/app/Http/Resources/SkillCollection.php +++ b/app/Http/Resources/SkillCollection.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; /** @@ -20,11 +21,8 @@ class SkillCollection extends ResourceCollection { /** * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return parent::toArray($request); } diff --git a/app/Http/Resources/Tag.php b/app/Http/Resources/Tag.php index 55edeeb13f..d0c3a0756d 100644 --- a/app/Http/Resources/Tag.php +++ b/app/Http/Resources/Tag.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; /** @@ -37,11 +38,8 @@ class Tag extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'id' => $this->id, diff --git a/app/Http/Resources/TagCollection.php b/app/Http/Resources/TagCollection.php index 886cd77d14..828af4b2fe 100644 --- a/app/Http/Resources/TagCollection.php +++ b/app/Http/Resources/TagCollection.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; /** @@ -20,11 +21,8 @@ class TagCollection extends ResourceCollection { /** * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return parent::toArray($request); } diff --git a/app/Http/Resources/Volunteer.php b/app/Http/Resources/Volunteer.php index 801f7f4c75..d944f8e458 100644 --- a/app/Http/Resources/Volunteer.php +++ b/app/Http/Resources/Volunteer.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use App\Role; use App\Skills; use App\User; @@ -64,11 +65,8 @@ class Volunteer extends JsonResource { /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { if (\Cache::has('all_skills')) { $allSkills = \Cache::get('all_skills'); diff --git a/app/Http/Resources/VolunteerCollection.php b/app/Http/Resources/VolunteerCollection.php index a5ed8e82a9..a44f340d57 100644 --- a/app/Http/Resources/VolunteerCollection.php +++ b/app/Http/Resources/VolunteerCollection.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; /** @@ -20,11 +21,8 @@ class VolunteerCollection extends ResourceCollection { /** * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return parent::toArray($request); } diff --git a/app/Invite.php b/app/Invite.php index cd79974c8f..8acc00d8e2 100644 --- a/app/Invite.php +++ b/app/Invite.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Model; use Illuminate\Notifications\Notifiable; @@ -18,14 +19,14 @@ class Invite extends Model 'email', 'record_id', 'hash', 'type', ]; - public function group() + public function group(): BelongsTo { if ($this->type == 'group') { return $this->belongsTo(Group::class, 'record_id', 'idgroups'); } } - public function event() + public function event(): BelongsTo { if ($this->type == 'event') { return $this->belongsTo(Party::class, 'record_id', 'idevents'); diff --git a/app/Listeners/AddUserToDiscourseGroup.php b/app/Listeners/AddUserToDiscourseGroup.php index afd44a0482..3c793aff6e 100644 --- a/app/Listeners/AddUserToDiscourseGroup.php +++ b/app/Listeners/AddUserToDiscourseGroup.php @@ -21,11 +21,8 @@ public function __construct() /** * Handle the event. - * - * @param UserFollowedGroup $event - * @return void */ - public function handle(UserFollowedGroup $event) + public function handle(UserFollowedGroup $event): void { if (! config('restarters.features.discourse_integration')) { return; diff --git a/app/Listeners/AddUserToDiscourseThreadForEvent.php b/app/Listeners/AddUserToDiscourseThreadForEvent.php index 4868768806..f07369c4ce 100644 --- a/app/Listeners/AddUserToDiscourseThreadForEvent.php +++ b/app/Listeners/AddUserToDiscourseThreadForEvent.php @@ -29,7 +29,7 @@ private function getHost($idevents) { return $hosts->count() ? $hosts[0] : null; } - public function handle(UserConfirmedEvent $e) { + public function handle(UserConfirmedEvent $e): void { // This call can block for a long time - add our own timeout so that we can fail it rather than block // the whole queue. pcntl_signal(SIGALRM, function () { diff --git a/app/Listeners/AnonymiseSoftDeletedUser.php b/app/Listeners/AnonymiseSoftDeletedUser.php index 73091b12d1..db209225c2 100644 --- a/app/Listeners/AnonymiseSoftDeletedUser.php +++ b/app/Listeners/AnonymiseSoftDeletedUser.php @@ -6,10 +6,7 @@ class AnonymiseSoftDeletedUser extends BaseEvent { - /** - * @param UserDeleted $event - */ - public function handle(UserDeleted $event) + public function handle(UserDeleted $event): void { $event->user->anonymise()->save(); } diff --git a/app/Listeners/ChangeWikiPassword.php b/app/Listeners/ChangeWikiPassword.php index d99230c16d..2a875d75f2 100644 --- a/app/Listeners/ChangeWikiPassword.php +++ b/app/Listeners/ChangeWikiPassword.php @@ -24,11 +24,8 @@ public function __construct(Request $request) /** * Handle the event. - * - * @param PasswordChanged $event - * @return void */ - public function handle(PasswordChanged $event) + public function handle(PasswordChanged $event): void { $user = $event->user; $oldpw = $event->oldPassword; diff --git a/app/Listeners/CreateDiscourseGroupForGroup.php b/app/Listeners/CreateDiscourseGroupForGroup.php index 40fcb652a7..bca3fdb0fc 100644 --- a/app/Listeners/CreateDiscourseGroupForGroup.php +++ b/app/Listeners/CreateDiscourseGroupForGroup.php @@ -24,11 +24,8 @@ public function __construct() /** * Handle the event. - * - * @param ApproveGroup $event - * @return void */ - public function handle(ApproveGroup $event) + public function handle(ApproveGroup $event): void { if (! config('restarters.features.discourse_integration')) { return; diff --git a/app/Listeners/CreateDiscourseThreadForEvent.php b/app/Listeners/CreateDiscourseThreadForEvent.php index 4ca7920a98..d3bab8dc48 100644 --- a/app/Listeners/CreateDiscourseThreadForEvent.php +++ b/app/Listeners/CreateDiscourseThreadForEvent.php @@ -22,11 +22,8 @@ public function __construct() /** * Handle the event. - * - * @param ApproveEvent $event - * @return void */ - public function handle(ApproveEvent $event) + public function handle(ApproveEvent $event): void { if (! config('restarters.features.discourse_integration')) { return; diff --git a/app/Listeners/CreateWordpressPostForEvent.php b/app/Listeners/CreateWordpressPostForEvent.php index 4f8af507f4..051ffef977 100644 --- a/app/Listeners/CreateWordpressPostForEvent.php +++ b/app/Listeners/CreateWordpressPostForEvent.php @@ -27,11 +27,8 @@ public function __construct(WordpressClient $wpClient) /** * Handle the event. - * - * @param ApproveEvent $event - * @return void */ - public function handle(ApproveEvent $event) + public function handle(ApproveEvent $event): void { $partyId = $event->party->idevents; diff --git a/app/Listeners/CreateWordpressPostForGroup.php b/app/Listeners/CreateWordpressPostForGroup.php index 61ffed8bc5..9060029a5d 100644 --- a/app/Listeners/CreateWordpressPostForGroup.php +++ b/app/Listeners/CreateWordpressPostForGroup.php @@ -24,11 +24,8 @@ public function __construct(WordpressClient $wpClient) /** * Handle the event. - * - * @param ApproveGroup $event - * @return void */ - public function handle(ApproveGroup $event) + public function handle(ApproveGroup $event): void { $id = $event->group->idgroups; $data = $event->data; diff --git a/app/Listeners/DeleteEventFromWordPress.php b/app/Listeners/DeleteEventFromWordPress.php index d1e452dae2..5093b3d075 100644 --- a/app/Listeners/DeleteEventFromWordPress.php +++ b/app/Listeners/DeleteEventFromWordPress.php @@ -25,11 +25,8 @@ public function __construct(WordpressClient $wpClient) /** * Handle the event. - * - * @param EventDeleted $event - * @return void */ - public function handle(EventDeleted $event) + public function handle(EventDeleted $event): void { // Slightly confusing name clash - usually we refer to community repair events as 'events' in the system. Here explicitly calling it repairEvent. diff --git a/app/Listeners/DeviceUpdatedAt.php b/app/Listeners/DeviceUpdatedAt.php index 2c24543642..f555b765dc 100644 --- a/app/Listeners/DeviceUpdatedAt.php +++ b/app/Listeners/DeviceUpdatedAt.php @@ -11,11 +11,8 @@ class DeviceUpdatedAt extends BaseEvent { /** * Handle the event. - * - * @param DeviceCreatedOrUpdated $event - * @return void */ - public function handle(DeviceCreatedOrUpdated $event) + public function handle(DeviceCreatedOrUpdated $event): void { // We've been passed a device id, and we want to record in the event and group that the devices have been // updated. diff --git a/app/Listeners/DiscourseUserEventSubscriber.php b/app/Listeners/DiscourseUserEventSubscriber.php index 0d42a5b03f..0078b6620a 100644 --- a/app/Listeners/DiscourseUserEventSubscriber.php +++ b/app/Listeners/DiscourseUserEventSubscriber.php @@ -2,6 +2,7 @@ namespace App\Listeners; +use Illuminate\Events\Dispatcher; use App\Events\UserEmailUpdated; use App\Events\UserLanguageUpdated; use App\Events\UserRegistered; @@ -82,7 +83,7 @@ public function onUserLanguageUpdated(UserLanguageUpdated $event) $userName = $json['user']['username']; - // TODO: Discourse doesn't have e.g. fr-BE, so just going with main locale. + // Discourse doesn't support regional locales like fr-BE, so use the main locale. $locale = explode('-', $user->language)[0]; $endpoint = "/u/{$userName}.json"; @@ -136,10 +137,8 @@ public function onUserDeleted(UserDeleted $event) /** * Register the listeners for the subscriber. - * - * @param \Illuminate\Events\Dispatcher $events */ - public function subscribe($events) + public function subscribe(Dispatcher $events) { // We subscribe to all the events irrespective of whether the feature is enabled so that we can test them. $events->listen( diff --git a/app/Listeners/EditWordpressPostForEvent.php b/app/Listeners/EditWordpressPostForEvent.php index c0aff9d9d0..784dab4e2f 100644 --- a/app/Listeners/EditWordpressPostForEvent.php +++ b/app/Listeners/EditWordpressPostForEvent.php @@ -27,11 +27,8 @@ public function __construct(WordpressClient $wpClient) /** * Handle the event. - * - * @param EditEvent $event - * @return void */ - public function handle(EditEvent $event) + public function handle(EditEvent $event): void { $id = $event->party->idevents; $data = $event->data; diff --git a/app/Listeners/EditWordpressPostForGroup.php b/app/Listeners/EditWordpressPostForGroup.php index e10527db1d..f4c5677af0 100644 --- a/app/Listeners/EditWordpressPostForGroup.php +++ b/app/Listeners/EditWordpressPostForGroup.php @@ -24,11 +24,8 @@ public function __construct(WordpressClient $wpClient) /** * Handle the event. - * - * @param EditGroup $event - * @return void */ - public function handle(EditGroup $event) + public function handle(EditGroup $event): void { $id = $event->group->idgroups; $data = $event->data; diff --git a/app/Listeners/LogInToWiki.php b/app/Listeners/LogInToWiki.php index 193d30d80b..8dd2740aba 100644 --- a/app/Listeners/LogInToWiki.php +++ b/app/Listeners/LogInToWiki.php @@ -33,11 +33,8 @@ public function __construct(Request $request, UserCreator $mediawikiUserCreator) /** * Handle the event. - * - * @param Login $event - * @return void */ - public function handle(Login $event) + public function handle(Login $event): void { $user = $event->user; diff --git a/app/Listeners/LogOutOfWiki.php b/app/Listeners/LogOutOfWiki.php index f82617ec33..81a508276c 100644 --- a/app/Listeners/LogOutOfWiki.php +++ b/app/Listeners/LogOutOfWiki.php @@ -22,11 +22,8 @@ public function __construct(Request $request) /** * Handle the event. - * - * @param Logout $event - * @return void */ - public function handle(Logout $event) + public function handle(Logout $event): void { $user = $event->user; diff --git a/app/Listeners/LogSuccessfulLogin.php b/app/Listeners/LogSuccessfulLogin.php index 5e2ec09d66..ecc813e8d2 100644 --- a/app/Listeners/LogSuccessfulLogin.php +++ b/app/Listeners/LogSuccessfulLogin.php @@ -22,11 +22,8 @@ public function __construct(Request $request) /** * Handle the event. - * - * @param Login $event - * @return void */ - public function handle(Login $event) + public function handle(Login $event): void { $user = $event->user; diff --git a/app/Listeners/NotifyApprovedEvent.php b/app/Listeners/NotifyApprovedEvent.php index 3e712d6e45..8a8deca9ce 100644 --- a/app/Listeners/NotifyApprovedEvent.php +++ b/app/Listeners/NotifyApprovedEvent.php @@ -17,11 +17,8 @@ class NotifyApprovedEvent extends BaseEvent { /** * Handle the event. - * - * @param ApproveEvent $event - * @return void */ - public function handle(ApproveEvent $event) + public function handle(ApproveEvent $event): void { $partyId = $event->party->idevents; diff --git a/app/Listeners/RemoveSoftDeletedUserFromAllGroups.php b/app/Listeners/RemoveSoftDeletedUserFromAllGroups.php index faf90d6f4d..ae28bd16c6 100644 --- a/app/Listeners/RemoveSoftDeletedUserFromAllGroups.php +++ b/app/Listeners/RemoveSoftDeletedUserFromAllGroups.php @@ -7,10 +7,7 @@ class RemoveSoftDeletedUserFromAllGroups extends BaseEvent { - /** - * @param UserDeleted $event - */ - public function handle(UserDeleted $event) + public function handle(UserDeleted $event): void { UserGroups::where('user', $event->user->id)->delete(); } diff --git a/app/Listeners/RemoveUserFromDiscourseThreadForEvent.php b/app/Listeners/RemoveUserFromDiscourseThreadForEvent.php index 2c1f085dcf..61f21d68c5 100644 --- a/app/Listeners/RemoveUserFromDiscourseThreadForEvent.php +++ b/app/Listeners/RemoveUserFromDiscourseThreadForEvent.php @@ -27,7 +27,7 @@ private function getHost($idevents) { return $hosts->count() ? $hosts[0] : null; } - public function handle(UserLeftEvent $e) { + public function handle(UserLeftEvent $e): void { if ($e->iduser) { $event = Party::find($e->idevents); $user = User::find($e->iduser); diff --git a/app/Listeners/SendAdminModerateEventPhotosNotification.php b/app/Listeners/SendAdminModerateEventPhotosNotification.php index 2e69775a97..4c2710a648 100644 --- a/app/Listeners/SendAdminModerateEventPhotosNotification.php +++ b/app/Listeners/SendAdminModerateEventPhotosNotification.php @@ -33,10 +33,7 @@ class SendAdminModerateEventPhotosNotification extends BaseEvent */ protected $party; - /** - * @param EventImagesUploaded $event - */ - public function handle(EventImagesUploaded $event) + public function handle(EventImagesUploaded $event): void { $this->event = $event; $this->party = $event->party; diff --git a/app/Listeners/SendAdminUserDeletedNotification.php b/app/Listeners/SendAdminUserDeletedNotification.php index 9982751aa1..580be608e4 100644 --- a/app/Listeners/SendAdminUserDeletedNotification.php +++ b/app/Listeners/SendAdminUserDeletedNotification.php @@ -9,10 +9,7 @@ class SendAdminUserDeletedNotification extends BaseEvent { - /** - * @param UserDeleted $event - */ - public function handle(UserDeleted $event) + public function handle(UserDeleted $event): void { $notify_users = Fixometer::usersWhoHavePreference('admin-user-deleted'); diff --git a/app/Listeners/SyncUserProperties.php b/app/Listeners/SyncUserProperties.php index b7b1cad9ca..07d054f59c 100644 --- a/app/Listeners/SyncUserProperties.php +++ b/app/Listeners/SyncUserProperties.php @@ -22,11 +22,8 @@ public function __construct() /** * Handle the event. - * - * @param UserUpdated $event - * @return void */ - public function handle(UserUpdated $event) + public function handle(UserUpdated $event): void { if ($event->user->isDirty('email')) { event(new UserEmailUpdated($event->user)); diff --git a/app/Misccat.php b/app/Misccat.php index f972a2d73f..6c8863d222 100644 --- a/app/Misccat.php +++ b/app/Misccat.php @@ -30,10 +30,8 @@ class Misccat extends Model * The list of excluded iddevices is because those records have * useless problem text: * "Like all data in Y1, this data is an estimate based on participation" - * - * @return array */ - public function fetchMisc() + public function fetchMisc(): array { return DB::select( " diff --git a/app/Network.php b/app/Network.php index acc2376d46..0f61ccf35b 100644 --- a/app/Network.php +++ b/app/Network.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use App\Group; use Illuminate\Database\Eloquent\Model; @@ -10,7 +11,7 @@ class Network extends Model { use HasFactory; - public function groups() + public function groups(): BelongsToMany { return $this->belongsToMany(Group::class, 'group_network', 'network_id', 'group_id'); } @@ -25,7 +26,7 @@ public function containsGroup($group) return $this->groups->contains($group); } - public function coordinators() + public function coordinators(): BelongsToMany { return $this->belongsToMany(User::class, 'user_network', 'network_id', 'user_id'); } diff --git a/app/Notifications/AdminAbnormalDevices.php b/app/Notifications/AdminAbnormalDevices.php index 7fdc86277e..abd1a34bf4 100644 --- a/app/Notifications/AdminAbnormalDevices.php +++ b/app/Notifications/AdminAbnormalDevices.php @@ -10,9 +10,8 @@ class AdminAbnormalDevices extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { return (new MailMessage) ->subject(__('notifications.abnormal_devices_subject', [], $notifiable->language)) @@ -34,9 +33,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('notifications.abnormal_devices_title', [], $notifiable->language), diff --git a/app/Notifications/AdminModerationEvent.php b/app/Notifications/AdminModerationEvent.php index 316929722c..7046c4e66f 100644 --- a/app/Notifications/AdminModerationEvent.php +++ b/app/Notifications/AdminModerationEvent.php @@ -10,9 +10,8 @@ class AdminModerationEvent extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { return (new MailMessage) ->subject( @@ -39,9 +38,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('notifications.moderation_event_subject', [ diff --git a/app/Notifications/AdminModerationEventPhotos.php b/app/Notifications/AdminModerationEventPhotos.php index 817e6dd99a..defc50f602 100644 --- a/app/Notifications/AdminModerationEventPhotos.php +++ b/app/Notifications/AdminModerationEventPhotos.php @@ -10,9 +10,8 @@ class AdminModerationEventPhotos extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -44,9 +43,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/AdminModerationGroup.php b/app/Notifications/AdminModerationGroup.php index 43c7fbcc16..e5fee8ca9b 100644 --- a/app/Notifications/AdminModerationGroup.php +++ b/app/Notifications/AdminModerationGroup.php @@ -10,9 +10,8 @@ class AdminModerationGroup extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -40,9 +39,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/AdminNewUser.php b/app/Notifications/AdminNewUser.php index 83eca44b84..5aae2d0360 100644 --- a/app/Notifications/AdminNewUser.php +++ b/app/Notifications/AdminNewUser.php @@ -10,9 +10,8 @@ class AdminNewUser extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -35,9 +34,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/AdminUserDeleted.php b/app/Notifications/AdminUserDeleted.php index 9d7b1ea56d..470e6815c7 100644 --- a/app/Notifications/AdminUserDeleted.php +++ b/app/Notifications/AdminUserDeleted.php @@ -10,9 +10,8 @@ class AdminUserDeleted extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -35,9 +34,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/AdminWordPressCreateEventFailure.php b/app/Notifications/AdminWordPressCreateEventFailure.php index e1eda41661..e5b6129fb5 100644 --- a/app/Notifications/AdminWordPressCreateEventFailure.php +++ b/app/Notifications/AdminWordPressCreateEventFailure.php @@ -10,9 +10,8 @@ class AdminWordPressCreateEventFailure extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -35,9 +34,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/AdminWordPressCreateGroupFailure.php b/app/Notifications/AdminWordPressCreateGroupFailure.php index 43a5afe220..96b76199aa 100644 --- a/app/Notifications/AdminWordPressCreateGroupFailure.php +++ b/app/Notifications/AdminWordPressCreateGroupFailure.php @@ -10,9 +10,8 @@ class AdminWordPressCreateGroupFailure extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -35,9 +34,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/AdminWordPressEditEventFailure.php b/app/Notifications/AdminWordPressEditEventFailure.php index 630fb55a08..05a14fc480 100644 --- a/app/Notifications/AdminWordPressEditEventFailure.php +++ b/app/Notifications/AdminWordPressEditEventFailure.php @@ -10,9 +10,8 @@ class AdminWordPressEditEventFailure extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -35,9 +34,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/AdminWordPressEditGroupFailure.php b/app/Notifications/AdminWordPressEditGroupFailure.php index 88fdaaeca2..1d7c95cb9f 100644 --- a/app/Notifications/AdminWordPressEditGroupFailure.php +++ b/app/Notifications/AdminWordPressEditGroupFailure.php @@ -10,9 +10,8 @@ class AdminWordPressEditGroupFailure extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -35,9 +34,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/BaseNotification.php b/app/Notifications/BaseNotification.php index 0a3aeaec3f..9d4c2bf0e9 100644 --- a/app/Notifications/BaseNotification.php +++ b/app/Notifications/BaseNotification.php @@ -25,7 +25,7 @@ public function __construct($arr, $user = null) * @param mixed $notifiable * @return array */ - public function via($notifiable) + public function via($notifiable): array { // If user being notified has opted in to receive emails. if ($notifiable->invites == 1) diff --git a/app/Notifications/DeleteEventFromWordpressFailed.php b/app/Notifications/DeleteEventFromWordpressFailed.php index 96c6dc0fcd..a996228b28 100644 --- a/app/Notifications/DeleteEventFromWordpressFailed.php +++ b/app/Notifications/DeleteEventFromWordpressFailed.php @@ -10,9 +10,8 @@ class DeleteEventFromWordpressFailed extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -42,9 +41,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/EventConfirmed.php b/app/Notifications/EventConfirmed.php index 3b875d76c7..373d867f3e 100644 --- a/app/Notifications/EventConfirmed.php +++ b/app/Notifications/EventConfirmed.php @@ -23,9 +23,8 @@ public function __construct(Party $party) * Get the notification's delivery channels. * * @param mixed $notifiable - * @return array */ - public function via($notifiable) + public function via($notifiable): array { return ['mail']; } @@ -34,9 +33,8 @@ public function via($notifiable) * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; $url = url('/party/view/' . $this->party->idevents); @@ -64,9 +62,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; $url = url('/party/view/' . $this->party->idevents); diff --git a/app/Notifications/EventDevices.php b/app/Notifications/EventDevices.php index 1115445e49..a41bdb2117 100644 --- a/app/Notifications/EventDevices.php +++ b/app/Notifications/EventDevices.php @@ -10,9 +10,8 @@ class EventDevices extends BaseNotification * Get the notification's delivery channels. * * @param mixed $notifiable - * @return array */ - public function via($notifiable) + public function via($notifiable): array { return ['mail']; } @@ -21,9 +20,8 @@ public function via($notifiable) * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { if ($notifiable !== null && $notifiable->invites == 1) { @@ -49,9 +47,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/EventRepairs.php b/app/Notifications/EventRepairs.php index cc65b1c3bd..2ea2feaf0d 100644 --- a/app/Notifications/EventRepairs.php +++ b/app/Notifications/EventRepairs.php @@ -10,9 +10,8 @@ class EventRepairs extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; @@ -40,9 +39,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; diff --git a/app/Notifications/GroupConfirmed.php b/app/Notifications/GroupConfirmed.php index 09604c0f80..081bf25b3e 100644 --- a/app/Notifications/GroupConfirmed.php +++ b/app/Notifications/GroupConfirmed.php @@ -22,9 +22,8 @@ public function __construct($group) * Get the notification's delivery channels. * * @param mixed $notifiable - * @return array */ - public function via($notifiable) + public function via($notifiable): array { return ['mail']; } @@ -33,9 +32,8 @@ public function via($notifiable) * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; @@ -59,9 +57,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'name' => $this->group->name, diff --git a/app/Notifications/JoinEvent.php b/app/Notifications/JoinEvent.php index f07ced7e9c..abfedb83a4 100644 --- a/app/Notifications/JoinEvent.php +++ b/app/Notifications/JoinEvent.php @@ -10,9 +10,8 @@ class JoinEvent extends BaseNotification * Get the notification's delivery channels. * * @param mixed $notifiable - * @return array */ - public function via($notifiable) + public function via($notifiable): array { if ($notifiable == null) { @@ -41,9 +40,8 @@ public function via($notifiable) * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; $subject = __('notifications.join_event_subject', [ @@ -129,9 +127,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('notifications.join_event_title', [], $notifiable->locale), diff --git a/app/Notifications/JoinGroup.php b/app/Notifications/JoinGroup.php index 79b02bbb20..6a987e9a53 100644 --- a/app/Notifications/JoinGroup.php +++ b/app/Notifications/JoinGroup.php @@ -10,9 +10,8 @@ class JoinGroup extends BaseNotification * Get the notification's delivery channels. * * @param mixed $notifiable - * @return array */ - public function via($notifiable) + public function via($notifiable): array { return ['mail']; } @@ -21,9 +20,8 @@ public function via($notifiable) * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; $subject = __('notifications.join_group_title', [ @@ -104,9 +102,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ diff --git a/app/Notifications/NewDiscourseMember.php b/app/Notifications/NewDiscourseMember.php index 696a7e26ce..4b1811d687 100644 --- a/app/Notifications/NewDiscourseMember.php +++ b/app/Notifications/NewDiscourseMember.php @@ -10,9 +10,8 @@ class NewDiscourseMember extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { return (new MailMessage) ->subject( @@ -37,9 +36,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('groups.talk_group_add_title', [ diff --git a/app/Notifications/NewGroupMember.php b/app/Notifications/NewGroupMember.php index a2d2ec3cbe..da9182fe62 100644 --- a/app/Notifications/NewGroupMember.php +++ b/app/Notifications/NewGroupMember.php @@ -10,9 +10,8 @@ class NewGroupMember extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; @@ -41,9 +40,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('notifications.new_member_title', [ diff --git a/app/Notifications/NewGroupWithinRadius.php b/app/Notifications/NewGroupWithinRadius.php index 7262b93c4c..668804b935 100644 --- a/app/Notifications/NewGroupWithinRadius.php +++ b/app/Notifications/NewGroupWithinRadius.php @@ -10,9 +10,8 @@ class NewGroupWithinRadius extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -40,9 +39,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('notifications.new_group_title', [], $notifiable->language), diff --git a/app/Notifications/NotifyAdminNoDevices.php b/app/Notifications/NotifyAdminNoDevices.php index 98c66978d6..6804484317 100644 --- a/app/Notifications/NotifyAdminNoDevices.php +++ b/app/Notifications/NotifyAdminNoDevices.php @@ -10,9 +10,8 @@ class NotifyAdminNoDevices extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; return (new MailMessage) @@ -35,9 +34,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { $locale = $notifiable->language; return [ diff --git a/app/Notifications/NotifyRestartersOfNewEvent.php b/app/Notifications/NotifyRestartersOfNewEvent.php index f7388e484f..30b5894c62 100644 --- a/app/Notifications/NotifyRestartersOfNewEvent.php +++ b/app/Notifications/NotifyRestartersOfNewEvent.php @@ -10,9 +10,8 @@ class NotifyRestartersOfNewEvent extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; @@ -41,9 +40,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('notifications.new_event_title', [ diff --git a/app/Notifications/RSVPEvent.php b/app/Notifications/RSVPEvent.php index 198c8b809c..185a8c5f45 100644 --- a/app/Notifications/RSVPEvent.php +++ b/app/Notifications/RSVPEvent.php @@ -10,9 +10,8 @@ class RSVPEvent extends BaseNotification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; @@ -41,9 +40,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ 'title' => __('notifications.rsvp_title', [ diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php index 032e6030ab..3f645b9e76 100644 --- a/app/Notifications/ResetPassword.php +++ b/app/Notifications/ResetPassword.php @@ -10,9 +10,8 @@ class ResetPassword extends BaseNotification * Get the notification's delivery channels. * * @param mixed $notifiable - * @return array */ - public function via($notifiable) + public function via($notifiable): array { return ['mail']; } @@ -21,9 +20,8 @@ public function via($notifiable) * Get the mail representation of the notification. * * @param mixed $notifiable - * @return \Illuminate\Notifications\Messages\MailMessage */ - public function toMail($notifiable) + public function toMail($notifiable): MailMessage { $locale = $notifiable->language; @@ -39,9 +37,8 @@ public function toMail($notifiable) * Get the array representation of the notification. * * @param mixed $notifiable - * @return array */ - public function toArray($notifiable) + public function toArray($notifiable): array { return [ diff --git a/app/Observers/EventsUsersObserver.php b/app/Observers/EventsUsersObserver.php index cff09f19b2..1c20f53d7f 100644 --- a/app/Observers/EventsUsersObserver.php +++ b/app/Observers/EventsUsersObserver.php @@ -5,6 +5,7 @@ use App\Events\UserConfirmedEvent; use App\Events\UserLeftEvent; use App\EventsUsers; +use App\Party; use App\Role; use App\Services\DiscourseService; use App\User; @@ -26,34 +27,30 @@ public function __construct(DiscourseService $discourseService) /** * Listen to the created event. - * - * @param \App\EventsUsers $eu - * @return void */ - public function created(EventsUsers $eu) + public function created(EventsUsers $eu): void { $idevents = $eu->event; $event = \App\Party::find($idevents); $iduser = $eu->user; $user = $iduser ? User::find($iduser) : null; - if ($eu->status == 1) { - // Confirmed. Make sure they are on the thread. - $this->confirmed($event, $user, true); - } else { - // Not confirmed. Make sure they are not on the thread. Don't change the count, as they shouldn't - // be on it anyway. - $this->removed($event, $user, false); + if ($user) { + if ($eu->status == 1) { + // Confirmed. Make sure they are on the thread. + $this->confirmed($event, $user, true); + } else { + // Not confirmed. Make sure they are not on the thread. Don't change the count, as they shouldn't + // be on it anyway. + $this->removed($event, $user, false); + } } } /** * Listen to the updated event. - * - * @param \App\EventsUsers $eu - * @return void */ - public function updating(EventsUsers $eu) { + public function updating(EventsUsers $eu): void { $idevents = $eu->event; $event = \App\Party::find($idevents); $iduser = $eu->user; @@ -74,11 +71,8 @@ public function updating(EventsUsers $eu) { /** * Listen to the deleted event. - * - * @param \App\EventsUsers $eu - * @return void */ - public function deleted(EventsUsers $eu) + public function deleted(EventsUsers $eu): void { $idevents = $eu->event; $event = \App\Party::find($idevents); @@ -86,15 +80,12 @@ public function deleted(EventsUsers $eu) $user = $iduser ? User::find($iduser) : null; // Make sure they are not on the thread. If they were confirmed, we need to update the volunteer count. - $this->removed($event, $user, true, $eu->status == 1); + if ($user) { + $this->removed($event, $user, true, $eu->status == 1); + } } - /** - * @param Party $event - * @param User $user - * @return void - */ - private function confirmed($event, $user, $count): void + private function confirmed(Party $event, User $user, $count): void { if ($count) { $event->increment('volunteers'); @@ -103,12 +94,7 @@ private function confirmed($event, $user, $count): void event(new UserConfirmedEvent($event->idevents, $user ? $user->id : null)); } - /** - * @param Party $event - * @param User $user - * @return void - */ - private function removed($event, $user, $count): void + private function removed(Party $event, User $user, $count): void { if ($count) { $event->decrement('volunteers'); diff --git a/app/Party.php b/app/Party.php index cfa9c0d035..4c21ab8205 100644 --- a/app/Party.php +++ b/app/Party.php @@ -2,6 +2,9 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Factories\HasFactory; use App\Events\ApproveEvent; use Auth; @@ -63,8 +66,7 @@ class Party extends Model implements Auditable //Getters public function findAllSearchable() { - // TODO Can this be replaced by Party::past? - return DB::select(DB::raw('SELECT + return DB::select('SELECT `e`.`idevents` AS `id`, UNIX_TIMESTAMP(`event_start_utc`) AS `event_timestamp`, TIME(CONVERT_TZ(`event_start_utc`, \'GMT\', `e`.`timezone`)) AS `start`, @@ -84,7 +86,7 @@ public function findAllSearchable() INNER JOIN `groups` AS `g` ON `g`.`idgroups` = `e`.`group` WHERE `event_end_utc` < NOW() - ORDER BY `e`.`event_start_utc` DESC')); + ORDER BY `e`.`event_start_utc` DESC'); } public function findThis($id, $devices = false) @@ -119,7 +121,7 @@ public function findThis($id, $devices = false) WHERE `e`.`idevents` = :id ORDER BY `e`.`event_start_utc` DESC'; - $party = DB::select(DB::raw($sql), ['id' => $id]); + $party = DB::select($sql, ['id' => $id]); if ($devices) { $devices = new Device; @@ -131,7 +133,7 @@ public function findThis($id, $devices = false) public function deleteUserList($party) { - return DB::delete(DB::raw('DELETE FROM `events_users` WHERE `event` = :party'), ['party' => $party]); + return DB::delete('DELETE FROM `events_users` WHERE `event` = :party', ['party' => $party]); } public function ofThisGroup($group = 'admin', $only_past = false, $devices = false) @@ -172,13 +174,13 @@ public function findNextParties($group = null) if (! is_null($group)) { try { - return DB::select(DB::raw($sql), ['group' => $group]); + return DB::select($sql, ['group' => $group]); } catch (\Illuminate\Database\QueryException $e) { dd($e); } } else { try { - return DB::select(DB::raw($sql)); + return DB::select($sql); } catch (\Illuminate\Database\QueryException $e) { dd($e); } @@ -309,8 +311,6 @@ public function scopePastForUser($query, $userids = null) { } public function scopeForGroup($query, $idgroups) { - // TODO This should probably move into Group, and be a scope in there. But we've not yet rationalised the - // scopes in Groups. $query->where('events.group', $idgroups); return $query; } @@ -334,7 +334,7 @@ public function scopeUpcomingEventsInUserArea($query, $user) $exclude_group_ids = array_merge($exclude_group_ids, Group::where('approved', false)->pluck('idgroups')->toArray()); return $this - ->select(DB::raw('`events`.*, ( 6371 * acos( cos( radians('.$user->latitude.') ) * cos( radians( events.latitude ) ) * cos( radians( events.longitude ) - radians('.$user->longitude.') ) + sin( radians('.$user->latitude.') ) * sin( radians( events.latitude ) ) ) ) AS distance')) + ->selectRaw('`events`.*, ( 6371 * acos( cos( radians(?) ) * cos( radians( events.latitude ) ) * cos( radians( events.longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( events.latitude ) ) ) ) AS distance', [$user->latitude, $user->longitude, $user->latitude]) ->join('groups', 'groups.idgroups', '=', 'events.group') ->join('group_network', 'groups.idgroups', '=', 'group_network.group_id') ->join('networks', 'networks.id', '=', 'group_network.network_id') @@ -349,17 +349,17 @@ public function scopeUpcomingEventsInUserArea($query, $user) ->orderBy('distance', 'ASC'); } - public function allDevices() + public function allDevices(): HasMany { return $this->hasMany(\App\Device::class, 'event', 'idevents')->join('categories', 'categories.idcategories', '=', 'devices.category'); } - public function allInvited() + public function allInvited(): HasMany { return $this->hasMany(\App\EventsUsers::class, 'event', 'idevents')->where('status', '!=', 1); } - public function allConfirmedVolunteers() + public function allConfirmedVolunteers(): HasMany { return $this->hasMany(EventsUsers::class, 'event', 'idevents') ->where(function ($query) { @@ -369,7 +369,7 @@ public function allConfirmedVolunteers() } // Doesn't work if called 'group' - I guess because a reserved SQL keyword. - public function theGroup() + public function theGroup(): HasOne { return $this->hasOne(\App\Group::class, 'idgroups', 'group'); } @@ -377,10 +377,9 @@ public function theGroup() /** * Return formatted date, in timezone of event. * - * @param string $format * @return false|string */ - public function getFormattedLocalStart($format = 'd/m/Y') + public function getFormattedLocalStart(string $format = 'd/m/Y') { $dt = new Carbon($this->event_start_utc); $dt->setTimezone($this->timezone); @@ -390,10 +389,9 @@ public function getFormattedLocalStart($format = 'd/m/Y') /** * Return formatted date, in timezone of event. * - * @param string $format * @return false|string */ - public function getFormattedLocalEnd($format = 'd/m/Y') + public function getFormattedLocalEnd(string $format = 'd/m/Y') { $dt = new Carbon($this->event_end_utc); $dt->setTimezone($this->timezone); @@ -441,9 +439,8 @@ public function isUpcoming() * If the event is of today, is not in progress and has not finished = true. * @author Christopher Kelker * @date 2019-06-13T15:48:05+010 - * @return bool */ - public function isStartingSoon() + public function isStartingSoon(): bool { $start = new Carbon($this->event_start_utc); @@ -574,7 +571,7 @@ public function getEventStats($eEmissionRatio = null, $uEmissionratio = null, $i return $result; } - public function devices() + public function devices(): HasMany { return $this->hasMany(\App\Device::class, 'event', 'idevents'); } @@ -622,11 +619,7 @@ public function getShareableLinkAttribute() return ''; } - /** - * @param int|null $user_id - * @return bool - */ - public function isVolunteer($user_id = null) + public function isVolunteer(?int $user_id = null): bool { return $this->allConfirmedVolunteers ->contains('user', $user_id ?: auth()->id()); @@ -650,7 +643,7 @@ public function isBeingAttendedBy($userId) * @version 1.0.0 * @return [type] */ - public function owner() + public function owner(): BelongsTo { return $this->belongsTo(User::class, 'user_id', 'id'); } diff --git a/app/Policies/NetworkPolicy.php b/app/Policies/NetworkPolicy.php index 0c7163f316..4aee713fb0 100644 --- a/app/Policies/NetworkPolicy.php +++ b/app/Policies/NetworkPolicy.php @@ -12,12 +12,8 @@ class NetworkPolicy /** * Determine whether the user can view the network. - * - * @param \App\User $user - * @param \App\Network $network - * @return mixed */ - public function view(User $user, Network $network) + public function view(User $user, Network $network): bool { if ($user->hasRole('Administrator')) { return true; @@ -32,11 +28,8 @@ public function view(User $user, Network $network) /** * Determine whether the user can create networks. - * - * @param \App\User $user - * @return mixed */ - public function create(User $user) + public function create(User $user): bool { if ($user->hasRole('Administrator')) { return true; @@ -45,12 +38,8 @@ public function create(User $user) /** * Determine whether the user can update the network. - * - * @param \App\User $user - * @param \App\Network $network - * @return mixed */ - public function update(User $user, Network $network) + public function update(User $user, Network $network): bool { if ($user->hasRole('Administrator')) { return true; @@ -66,7 +55,6 @@ public function update(User $user, Network $network) /** * Determine whether the user can associate groups to networks. * - * @param \App\User $user * @return mixed */ public function associateGroups(User $user, Network $network) @@ -84,12 +72,8 @@ public function associateGroups(User $user, Network $network) /** * Determine whether the user can delete the network. - * - * @param \App\User $user - * @param \App\Network $network - * @return mixed */ - public function delete(User $user, Network $network) + public function delete(User $user, Network $network): bool { if ($user->hasRole('Administrator')) { return true; @@ -98,12 +82,8 @@ public function delete(User $user, Network $network) /** * Determine whether the user can restore the network. - * - * @param \App\User $user - * @param \App\Network $network - * @return mixed */ - public function restore(User $user, Network $network) + public function restore(User $user, Network $network): bool { if ($user->hasRole('Administrator')) { return true; @@ -112,12 +92,8 @@ public function restore(User $user, Network $network) /** * Determine whether the user can permanently delete the network. - * - * @param \App\User $user - * @param \App\Network $network - * @return mixed */ - public function forceDelete(User $user, Network $network) + public function forceDelete(User $user, Network $network): bool { if ($user->hasRole('Administrator')) { return true; diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 7994e9732a..46b5fe9d31 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -16,10 +16,9 @@ class UserPolicy * * @param \App\User $user * @param \App\User $user - * @param int $role * @return mixed */ - public function changeRepairDirRole(User $perpetrator, User $victim, $role) + public function changeRepairDirRole(User $perpetrator, User $victim, int $role) { // We have rules for whether you can change the Repair Directory role. Code is structured for readability // of these rules, rather than a single big if. @@ -53,7 +52,6 @@ public function changeRepairDirRole(User $perpetrator, User $victim, $role) /** * Determine whether this user can view the Repair Directory settings for users * - * @param \App\User $user * @return mixed */ public function viewRepairDirectorySettings(User $user) @@ -64,7 +62,6 @@ public function viewRepairDirectorySettings(User $user) /** * Determine whether this user can see the Admin menu. * - * @param \App\User $user * @return mixed */ public function viewAdminMenu(User $user) @@ -79,7 +76,6 @@ public function viewAdminMenu(User $user) /** * Determine whether this user can access the Repair Directory via the menu. * - * @param \App\User $user * @return mixed */ public function accessRepairDirectory(User $user) diff --git a/app/Providers/AgentServiceProvider.php b/app/Providers/AgentServiceProvider.php index 8e34f8c705..3c1dbfb659 100644 --- a/app/Providers/AgentServiceProvider.php +++ b/app/Providers/AgentServiceProvider.php @@ -8,14 +8,14 @@ class AgentServiceProvider extends ServiceProvider { - public function boot() + public function boot(): void { $agent = new Agent(); View::share('agent', $agent); } - public function register() + public function register(): void { // } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 2c73288359..4f620ea837 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -17,10 +17,8 @@ class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. - * - * @return void */ - public function boot() + public function boot(): void { // The admin area is unusable without this if (app()->isLocal()) { @@ -44,10 +42,8 @@ public function boot() /** * Register any application services. - * - * @return void */ - public function register() + public function register(): void { $this->app->singleton(Geocoder::class, function () { return new Geocoder(); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index db44fadf7d..d2ecb3c182 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -24,13 +24,9 @@ class AuthServiceProvider extends ServiceProvider /** * Register any authentication / authorization services. - * - * @return void */ - public function boot() + public function boot(): void { - $this->registerPolicies(); - // } } diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php index 395c518bc4..2be04f5d9d 100644 --- a/app/Providers/BroadcastServiceProvider.php +++ b/app/Providers/BroadcastServiceProvider.php @@ -9,10 +9,8 @@ class BroadcastServiceProvider extends ServiceProvider { /** * Bootstrap any application services. - * - * @return void */ - public function boot() + public function boot(): void { Broadcast::routes(); diff --git a/app/Providers/DiscourseServiceProvider.php b/app/Providers/DiscourseServiceProvider.php index 8bec9af118..69817074a8 100644 --- a/app/Providers/DiscourseServiceProvider.php +++ b/app/Providers/DiscourseServiceProvider.php @@ -22,7 +22,7 @@ class DiscourseServiceProvider extends ServiceProvider private $logger = null; - public function register() + public function register(): void { // We need to register the service whether or not the feature is turned on, so that we can mock it in testing. diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index b510773386..6363171ff5 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -113,10 +113,8 @@ class EventServiceProvider extends ServiceProvider /** * Register any events for your application. - * - * @return void */ - public function boot() + public function boot(): void { if (env('FEATURE__WIKI_INTEGRATION') === true) { @@ -126,10 +124,8 @@ public function boot() /** * Determine if events and listeners should be automatically discovered. - * - * @return bool */ - public function shouldDiscoverEvents() + public function shouldDiscoverEvents(): bool { return false; } diff --git a/app/Providers/MediawikiServiceProvider.php b/app/Providers/MediawikiServiceProvider.php index 697f9de089..a082eb0a19 100644 --- a/app/Providers/MediawikiServiceProvider.php +++ b/app/Providers/MediawikiServiceProvider.php @@ -13,20 +13,16 @@ class MediawikiServiceProvider extends ServiceProvider { /** * Bootstrap services. - * - * @return void */ - public function boot() + public function boot(): void { // } /** * Register services. - * - * @return void */ - public function register() + public function register(): void { if (env('FEATURE__WIKI_INTEGRATION') === false) { return; diff --git a/app/Providers/OurSentryLogging.php b/app/Providers/OurSentryLogging.php index 3ef4ebfad0..90f487913f 100644 --- a/app/Providers/OurSentryLogging.php +++ b/app/Providers/OurSentryLogging.php @@ -10,19 +10,15 @@ class OurSentryLogging extends ServiceProvider { /** * Register services. - * - * @return void */ - public function register() + public function register(): void { } /** * Bootstrap services. - * - * @return void */ - public function boot() + public function boot(): void { Event::listen(MessageLogged::class, function (MessageLogged $e) { if ($e->level == 'error') { diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index adb0175cd4..ceb5f81774 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -23,10 +23,8 @@ class RouteServiceProvider extends ServiceProvider * Define the "web" routes for the application. * * These routes all receive session state, CSRF protection, etc. - * - * @return void */ - protected function mapWebRoutes() + protected function mapWebRoutes(): void { Route::middleware('web') ->group(base_path('routes/web.php')); @@ -36,10 +34,8 @@ protected function mapWebRoutes() * Define the "api" routes for the application. * * These routes are typically stateless. - * - * @return void */ - protected function mapApiRoutes() + protected function mapApiRoutes(): void { Route::prefix('api') ->middleware('api') @@ -48,28 +44,16 @@ protected function mapApiRoutes() /** * Define your route model bindings, pattern filters, etc. - * - * @return void */ - public function boot() + public function boot(): void { - $this->configureRateLimiting(); + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(300)->by($request->user()?->id ?: $request->ip()); + }); $this->routes(function () { $this->mapApiRoutes(); $this->mapWebRoutes(); }); } - - /** - * Configure the rate limiters for the application. - * - * @return void - */ - protected function configureRateLimiting() - { - RateLimiter::for('api', function (Request $request) { - return Limit::perMinute(300)->by($request->user()?->id ?: $request->ip()); - }); - } } diff --git a/app/Providers/ScheduleServiceProvider.php b/app/Providers/ScheduleServiceProvider.php index 6055e0d057..963b380fbb 100644 --- a/app/Providers/ScheduleServiceProvider.php +++ b/app/Providers/ScheduleServiceProvider.php @@ -7,7 +7,7 @@ class ScheduleServiceProvider extends ServiceProvider { - public function boot() + public function boot(): void { $this->app->booted(function () { $schedule = $this->app->make(Schedule::class); @@ -16,7 +16,7 @@ public function boot() }); } - public function register() + public function register(): void { } } diff --git a/app/Providers/WordpressServiceProvider.php b/app/Providers/WordpressServiceProvider.php index fc864276cb..6815bd00c5 100644 --- a/app/Providers/WordpressServiceProvider.php +++ b/app/Providers/WordpressServiceProvider.php @@ -10,20 +10,16 @@ class WordpressServiceProvider extends ServiceProvider { /** * Bootstrap services. - * - * @return void */ - public function boot() + public function boot(): void { // } /** * Register services. - * - * @return void */ - public function register() + public function register(): void { $this->app->singleton(WordpressClient::class, function () { try { diff --git a/app/Role.php b/app/Role.php index 6ee341cad8..ee082d6eeb 100644 --- a/app/Role.php +++ b/app/Role.php @@ -53,7 +53,7 @@ class Role extends Model * */ public function findAll() { - return DB::select(DB::raw('SELECT + return DB::select('SELECT `r`.`idroles` AS `id`, `r`.`role` AS `role`, GROUP_CONCAT(`p`.`permission` ORDER BY `p`.`permission` ASC SEPARATOR ", " ) as `permissions_list` @@ -61,22 +61,22 @@ public function findAll() LEFT JOIN `roles_permissions` AS `rp` ON `r`.`idroles` = `rp`.`role` LEFT JOIN `permissions` AS `p` ON `rp`.`permission` = `p`.`idpermissions` GROUP BY `r`.`idroles` - ORDER BY `r`.`idroles` ASC')); + ORDER BY `r`.`idroles` ASC'); } public function permissions() { //Tested! - return DB::select(DB::raw('SELECT * FROM `permissions` ORDER BY `idpermissions` ASC')); + return DB::select('SELECT * FROM `permissions` ORDER BY `idpermissions` ASC'); } public function rolePermissions($role) { //Tested! - return DB::select(DB::raw('SELECT * FROM `permissions` + return DB::select('SELECT * FROM `permissions` INNER JOIN `roles_permissions` ON `roles_permissions`.`permission` = `permissions`.`idpermissions` WHERE `roles_permissions`.`role` = :role - ORDER BY `idpermissions` ASC'), ['role' => $role]); + ORDER BY `idpermissions` ASC', ['role' => $role]); } public function edit($id, $data) @@ -84,14 +84,14 @@ public function edit($id, $data) //Tested! // delete permissions before updating references - DB::delete(DB::raw('DELETE FROM roles_permissions WHERE role = :role'), ['role' => $id]); + DB::delete('DELETE FROM roles_permissions WHERE role = :role', ['role' => $id]); // insert data here $sql = 'INSERT INTO roles_permissions(role, permission) VALUES (:role, :permission)'; foreach ($data as &$p) { try { - DB::insert(DB::raw($sql), ['role' => $id, 'permission' => $p]); + DB::insert($sql, ['role' => $id, 'permission' => $p]); } catch (\Illuminate\Database\QueryException $e) { return false; } diff --git a/app/Rules/Timezone.php b/app/Rules/Timezone.php index 0d0569ecd2..d18e2a9a9e 100644 --- a/app/Rules/Timezone.php +++ b/app/Rules/Timezone.php @@ -2,39 +2,17 @@ namespace App\Rules; -use Illuminate\Contracts\Validation\Rule; +use Illuminate\Contracts\Validation\ValidationRule; -class Timezone implements Rule +class Timezone implements ValidationRule { /** - * Create a new rule instance. - * - * @return void + * Run the validation rule. */ - public function __construct() + public function validate(string $_attribute, mixed $value, \Closure $fail): void { - // - } - - /** - * Determine if the validation rule passes. - * - * @param string $attribute - * @param mixed $value - * @return bool - */ - public function passes($attribute, $value) - { - return in_array($value, \DateTimeZone::listIdentifiers(\DateTimeZone::ALL_WITH_BC)); - } - - /** - * Get the validation error message. - * - * @return string - */ - public function message() - { - return __('partials.validate_timezone'); + if (!in_array($value, \DateTimeZone::listIdentifiers(\DateTimeZone::ALL_WITH_BC))) { + $fail(__('partials.validate_timezone')); + } } } diff --git a/app/Services/CheckAuthService.php b/app/Services/CheckAuthService.php index 395341ad8b..37016af5f1 100644 --- a/app/Services/CheckAuthService.php +++ b/app/Services/CheckAuthService.php @@ -2,6 +2,7 @@ namespace App\Services; +use Illuminate\Http\Request; use App\Helpers\Fixometer; use App\User; use Cookie; @@ -85,11 +86,8 @@ private function handle($email) /** * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array */ - public function toArray($request) + public function toArray(Request $request): array { return [ 'authenticated' => $this->authenticated, diff --git a/app/Services/DiscourseService.php b/app/Services/DiscourseService.php index b3fe3631e3..51571cc414 100644 --- a/app/Services/DiscourseService.php +++ b/app/Services/DiscourseService.php @@ -159,10 +159,22 @@ public function getAllUsers() } $discourseResult = json_decode($response->getBody()); + // Check for JSON error responses (like {"errors":["..."], "error_type":"not_found"}) + if (property_exists($discourseResult, 'error_type') && $discourseResult->error_type == 'not_found') { + Log::warning("{$endpoint} returned not_found error - trust_level_0 group may not exist or be accessible"); + return []; // Return empty array instead of throwing exception for missing groups + } + // We seem to get rate-limited in a way that the 429 retrying doesn't cover, so spot that here. $limited = property_exists($discourseResult, 'error_type') && $discourseResult->error_type == 'rate_limit'; if (! $limited) { + // Check if members property exists before accessing it + if (! property_exists($discourseResult, 'members')) { + Log::warning("{$endpoint} response missing 'members' property, got: " . json_encode($discourseResult)); + return []; // Return empty array for unexpected response format + } + $users = $discourseResult->members; Log::info('...process '.count($users)); @@ -363,8 +375,6 @@ public function syncGroups($idgroups = NULL) { } } - // TODO The Discourse API accepts up to around 1000 as the limit. This is plenty for now, but - // we will assert below if it turns out not to be in future. $limit = 1000; $response = $client->request('GET', "/groups/$discourseName/members.json?limit=$limit"); diff --git a/app/Session.php b/app/Session.php index 98fcb1b4d5..d6cce30683 100644 --- a/app/Session.php +++ b/app/Session.php @@ -33,7 +33,7 @@ public static function createSession($user) try { DB::insert( - DB::raw('INSERT INTO `sessions`(`session`, `user`, created_at) VALUES (:session, :user, :tm)'), + 'INSERT INTO `sessions`(`session`, `user`, created_at VALUES (:session, :user, :tm)', ['session' => $session, 'user' => $user, 'tm' => $created_at] ); } catch (\Illuminate\Database\QueryException $e) { @@ -48,7 +48,7 @@ public function setSession($user, $sessionToken) $sql = 'UPDATE `sessions` SET `session` = :session WHERE `user` = :user'; try { - DB::update(DB::raw($sql), ['session' => $sessionToken, 'user' => $user]); + DB::update($sql, ['session' => $sessionToken, 'user' => $user]); unset($_SESSION[env('APP_NAME')]); $_SESSION[env('APP_NAME')][env('APP_KEY')] = $sessionToken; //was $_SESSION[APPNAME][SESSIONKEY] will need a config file for SESSIONKEY @@ -79,7 +79,7 @@ protected function getSession() WHERE sessions.session = :session'; try { - $objectUser = DB::select(DB::raw($sql), ['session' => $session]); + $objectUser = DB::select($sql, ['session' => $session]); if (is_object($objectUser)) { $User = new User; diff --git a/app/User.php b/app/User.php index 24e3096bc8..5f47a84a65 100644 --- a/app/User.php +++ b/app/User.php @@ -2,6 +2,9 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use App\Events\UserDeleted; use App\Events\UserUpdated; @@ -37,7 +40,7 @@ class User extends Authenticatable implements Auditable, HasLocalePreference * @var array */ protected $fillable = [ - 'name', 'email', 'password', 'role', 'recovery', 'recovery_expires', 'language', 'repair_network', 'location', 'age', 'gender', 'country_code', 'newsletter', 'drip_subscriber_id', 'invites', 'biography', 'consent_future_data', 'consent_past_data', 'consent_gdpr', 'number_of_logins', 'latitude', 'longitude', 'last_login_at', 'api_token', 'access_group_tag_id', 'calendar_hash', 'repairdir_role', 'mediawiki', 'username', + 'name', 'email', 'password', 'role', 'recovery', 'recovery_expires', 'language', 'repair_network', 'location', 'age', 'gender', 'country_code', 'newsletter', 'invites', 'biography', 'consent_future_data', 'consent_past_data', 'consent_gdpr', 'number_of_logins', 'latitude', 'longitude', 'last_login_at', 'api_token', 'access_group_tag_id', 'calendar_hash', 'repairdir_role', 'mediawiki', 'username', ]; /** @@ -70,7 +73,7 @@ class User extends Authenticatable implements Auditable, HasLocalePreference 'deleted' => UserDeleted::class, ]; - public function role() + public function role(): HasOne { return $this->hasOne(\App\Role::class, 'idroles', 'role'); } @@ -81,19 +84,19 @@ public function repairdir_role() return $this->repairdir_role ? $this->repairdir_role : Role::REPAIR_DIRECTORY_NONE; } - public function userSkills() + public function userSkills(): HasMany { return $this->hasMany(\App\UsersSkills::class, 'user', 'id'); } - public function skills() + public function skills(): BelongsToMany { return $this->belongsToMany(\App\Skills::class, 'users_skills', 'user', 'skill'); } // This is an incorrect relationship, but leaving it here for now as it is used in a strange way in two legacy places and apparently working in those instances somehow. // Use skills() for correct belongsToMany relationship. - public function skillsold() + public function skillsold(): BelongsToMany { return $this->belongsToMany(\App\UsersSkills::class, 'users_skills', 'user', 'skill'); } @@ -110,7 +113,7 @@ public function assignSkill($skill) } } - public function groups() + public function groups(): BelongsToMany { return $this->belongsToMany(\App\Group::class, 'users_groups', 'user', 'group'); } @@ -121,14 +124,15 @@ public function groups() * @param int $numberOfGroups How many groups to return * @param string String of minimum creation date */ - public function groupsNearby($numberOfGroups = 10, $createdSince = null, $nearby = self::NEARBY_KM) + public function groupsNearby(int $numberOfGroups = 10, $createdSince = null, $nearby = self::NEARBY_KM) { if (is_null($this->latitude) || is_null($this->longitude)) { return []; } - $groupsNearbyQuery = Group::select( - DB::raw('*, ( 6371 * acos( cos( radians('.$this->latitude.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$this->longitude.') ) + sin( radians('.$this->latitude.') ) * sin( radians( latitude ) ) ) ) AS dist') + $groupsNearbyQuery = Group::selectRaw( + '*, ( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS dist', + [$this->latitude, $this->longitude, $this->latitude] )->where(function ($q) { $q->whereNull('archived_at'); @@ -165,12 +169,12 @@ public function groupsNearby($numberOfGroups = 10, $createdSince = null, $nearby return $groupsNearby; } - public function preferences() + public function preferences(): BelongsToMany { return $this->belongsToMany(self::class, 'users_preferences', 'user_id', 'preference_id'); } - public function permissions() + public function permissions(): BelongsToMany { return $this->belongsToMany(self::class, 'users_permissions', 'user_id', 'permission_id'); } @@ -187,18 +191,18 @@ public function addPreference($slug) public function getRolePermissions($role) { - return DB::select(DB::raw('SELECT p.idpermissions, p.permission, r.idroles, r.role FROM permissions AS p + return DB::select('SELECT p.idpermissions, p.permission, r.idroles, r.role FROM permissions AS p INNER JOIN roles_permissions AS rp ON rp.permission = p.idpermissions INNER JOIN roles AS r ON rp.role= r.idroles - WHERE r.role = :role'), ['role' => $role]); + WHERE r.role = :role', ['role' => $role]); } public function getUserGroups($user) { - return DB::select(DB::raw('SELECT * FROM `'.$this->table.'` AS `u` + return DB::select('SELECT * FROM `'.$this->table.'` AS `u` INNER JOIN `users_groups` AS `ug` ON `ug`.`user` = `u`.`id` INNER JOIN `groups` AS `g` ON `ug`.`group` = `g`.`idgroups` - WHERE `u`.`id` = :id'), ['id' => $user]); + WHERE `u`.`id` = :id', ['id' => $user]); } // Setters @@ -238,7 +242,7 @@ public static function getProfile($id) // $sql .= implode(' AND ', $clauses); // // try { - // return DB::select(DB::raw($sql), $params); + // return DB::select($sql, $params); // } catch (\Illuminate\Database\QueryException $e) { // return false; // } @@ -249,9 +253,9 @@ public function getUserList($eloquent = false) //Tested! if (! $eloquent) { - $Users = DB::select(DB::raw('SELECT users.id AS id, users.name, users.email, roles.role FROM users + $Users = DB::select('SELECT users.id AS id, users.name, users.email, roles.role FROM users INNER JOIN roles ON roles.idroles = users.role WHERE users.deleted_at IS NULL - ORDER BY users.id ASC')); //INNER JOIN sessions ON sessions.user = users.id, UNIX_TIMESTAMP(sessions.modified_at) AS modified_at + ORDER BY users.id ASC'); //INNER JOIN sessions ON sessions.user = users.id, UNIX_TIMESTAMP(sessions.modified_at) AS modified_at if (is_array($Users)) { $User = new self; @@ -269,7 +273,7 @@ public function getUserList($eloquent = false) public function partyEligible() { //Tested! - return DB::select(DB::raw('SELECT + return DB::select('SELECT users.id AS id, users.name, users.email, @@ -277,12 +281,12 @@ public function partyEligible() FROM '.$this->table.' INNER JOIN roles ON roles.idroles = users.role WHERE users.role > 1 - ORDER BY users.name ASC')); + ORDER BY users.name ASC'); } public function inGroup($group) { - return DB::select(DB::raw('SELECT + return DB::select('SELECT users.id AS id, users.name, users.email, @@ -292,7 +296,7 @@ public function inGroup($group) WHERE users.role > 1 AND users.id IN (SELECT `user` FROM users_groups WHERE `group` = :group) - ORDER BY users.name ASC'), ['group' => $group]); + ORDER BY users.name ASC', ['group' => $group]); } public function isInGroup($groupId) @@ -309,14 +313,14 @@ public function checkEmail($email) { //Tested! - $r = DB::select(DB::raw('SELECT COUNT(id) AS emails FROM '.$this->table.' WHERE email = :email'), ['email' => $email]); + $r = DB::select('SELECT COUNT(id) AS emails FROM '.$this->table.' WHERE email = :email', ['email' => $email]); return ($r[0]->emails > 0) ? false : true; } public function scopeNearbyRestarters($query, $latitude, $longitude, $radius = 20) { - return $query->select(DB::raw('*, ( 6371 * acos( cos( radians('.$latitude.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$longitude.') ) + sin( radians('.$latitude.') ) * sin( radians( latitude ) ) ) ) AS distance')) + return $query->selectRaw('*, ( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance', [$latitude, $longitude, $latitude]) ->whereNotNull('location') ->whereNotNull('latitude') ->whereNotNull('longitude') @@ -347,9 +351,9 @@ public function hasUserGivenConsent() } /** - * @return Date when the user last logged in + * @return \Carbon\Carbon when the user last logged in */ - public function lastLogin() + public function lastLogin(): \Carbon\Carbon { return new \Carbon\Carbon($this->last_login_at); } @@ -362,7 +366,6 @@ public function anonymise() $this->name = 'Deleted User'; $this->email = $this->id.'@deleted.invalid'; - // TODO: country, city, gender, age, also required? return $this; } @@ -402,7 +405,7 @@ public function convertToHost() } } - public function groupTag() + public function groupTag(): HasOne { return $this->hasOne(GroupTags::class, 'id', 'access_group_tag_id'); } @@ -438,11 +441,6 @@ public function generateAndSetUsername() $this->username = $username; } - public function isDripSubscriber() - { - return ! is_null($this->drip_subscriber_id); - } - public function isRepairDirectoryNone() { return $this->repairdir_role == Role::REPAIR_DIRECTORY_NONE; @@ -512,7 +510,7 @@ public function isCoordinatorOf($network) return $this->networks->contains($network); } - public function networks() + public function networks(): BelongsToMany { return $this->belongsToMany(Network::class, 'user_network', 'user_id', 'network_id'); } @@ -566,32 +564,20 @@ public function ensureAPIToken() /** * Get the user's preferred locale. This is automatically used by email notifications. - * - * @return string */ - public function preferredLocale() + public function preferredLocale(): string { - // TODO Use of preferredLocale should mean we don't have to explicitly pass the locale. But that isn't - // working. So at the moment we are passing a locale explicitly in the translations in the notifications - // to users (not admins). - return $this->language; + return $this->language ?? 'en'; } - public static function userCanSeeEvent($user, $event, $group = null) { + public static function userCanSeeEvent($user, $event) { // We need to filter based on approved visibility: // - where the group is approved, this event is visible // - where the group is not approved, this event is visible to network coordinators or group hosts. - $group = $event->theGroup; - - if ($event->approved && $group->approved) { - // Do this before getting user roles - improves performance. - return true; - } - $amHost = $user && $user->hasRole('Host'); $admin = $user && $user->hasRole('Administrator'); - $group = $group ? $group : Group::find($event->group); + $group = Group::find($event->group); if (($event->approved && $group->approved) || $admin || diff --git a/app/UserGroups.php b/app/UserGroups.php index 6d3f8b6bae..4e5b3c3828 100644 --- a/app/UserGroups.php +++ b/app/UserGroups.php @@ -2,6 +2,8 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use DB; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -51,7 +53,7 @@ public function createUsersGroups($iduser, $groups) foreach ($groups as &$group) { try { - DB::insert(DB::raw($sql), ['user' => $iduser, 'group' => $group]); + DB::insert($sql, ['user' => $iduser, 'group' => $group]); } catch (\Illuminate\Database\QueryException $e) { if (env('APP_ENV') == 'local' || env('APP_ENV') == 'development') { dd($e); @@ -76,7 +78,7 @@ public function deleteUsersGroups($iduser) { $sql = 'DELETE FROM `users_groups` WHERE `user` = :id'; try { - DB::delete(DB::raw($sql), ['id' => $iduser]); + DB::delete($sql, ['id' => $iduser]); return true; } catch (\Illuminate\Database\QueryException $e) { @@ -89,7 +91,7 @@ public function deleteUsersGroups($iduser) } //Table Relations - public function volunteer() + public function volunteer(): HasOne { return $this->hasOne(\App\User::class, 'id', 'user'); } @@ -113,11 +115,11 @@ public function getFullName() return 'N/A'; } - public function user() { + public function user(): BelongsTo { return $this->belongsTo(\App\User::class, 'user', 'id'); } - public function group() { + public function group(): BelongsTo { return $this->belongsTo(\App\Groups::class, 'group', 'idgroups'); } } diff --git a/app/UsersSkills.php b/app/UsersSkills.php index 82079a7c60..603540bb2f 100644 --- a/app/UsersSkills.php +++ b/app/UsersSkills.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasOne; use DB; use Illuminate\Database\Eloquent\Model; @@ -25,7 +26,7 @@ class UsersSkills extends Model public $timestamps = false; //Table Relations - public function skillName() + public function skillName(): HasOne { return $this->hasOne(\App\Skills::class, 'id', 'skill'); } diff --git a/app/Xref.php b/app/Xref.php index 2145acb475..068b202213 100644 --- a/app/Xref.php +++ b/app/Xref.php @@ -2,6 +2,7 @@ namespace App; +use Illuminate\Database\Eloquent\Relations\HasOne; use DB; use Illuminate\Database\Eloquent\Model; @@ -35,7 +36,7 @@ public function createXref($clear = true) $sql = 'INSERT INTO `'.$this->table.'`(`object`, `object_type`, `reference`, `reference_type`) VALUES (:obj, :objType, :ref, :refType)'; try { - return DB::insert(DB::raw($sql), ['obj' => $this->obj, 'objType' => $this->objType, 'ref' => $this->ref, 'refType' => $this->refType]); + return DB::insert($sql, ['obj' => $this->obj, 'objType' => $this->objType, 'ref' => $this->ref, 'refType' => $this->refType]); } catch (\Illuminate\Database\QueryException $e) { return false; } @@ -50,7 +51,7 @@ public function deleteXref() $sql = 'DELETE FROM `'.$this->table.'` WHERE `reference` = :id AND `reference_type` = :type AND `object_type` = :objectType'; try { - return DB::delete(DB::raw($sql), ['id' => $this->ref, 'type' => $this->refType, 'objectType' => $this->objType]); + return DB::delete($sql, ['id' => $this->ref, 'type' => $this->refType, 'objectType' => $this->objType]); } catch (\Illuminate\Database\QueryException $e) { return false; } @@ -64,13 +65,13 @@ public function deleteObjectXref() $sql = 'DELETE FROM `'.$this->table.'` WHERE `object` = :id AND `object_type` = :type'; try { - return DB::delete(DB::raw($sql), ['id' => $this->obj, 'type' => $this->objType]); + return DB::delete($sql, ['id' => $this->obj, 'type' => $this->objType]); } catch (\Illuminate\Database\QueryException $e) { return false; } } - public function image() + public function image(): HasOne { return $this->hasOne(\App\Images::class, 'idimages', 'object'); } diff --git a/composer.json b/composer.json index 5167f983bd..36133a1284 100644 --- a/composer.json +++ b/composer.json @@ -8,15 +8,15 @@ "license": "MIT", "type": "project", "require": { - "php": "^8.0", - "addwiki/mediawiki-api": "~0.7.0", - "addwiki/mediawiki-api-base": "~2.0", + "php": "^8.1", + "addwiki/mediawiki-api": "^3.1.0", + "addwiki/mediawiki-api-base": "^3.1.0", "barryvdh/laravel-translation-manager": "^0.6.2", "bkwld/croppa": "^6.0.1", "caseyamcl/guzzle_retry_middleware": "^2.6", "cweagans/composer-patches": "^1.7", - "darkaonline/l5-swagger": "^8.0", - "doctrine/dbal": "^2.13", + "darkaonline/l5-swagger": "^8.3", + "doctrine/dbal": "^3.5", "egulias/email-validator": "^3.0.0", "filp/whoops": "^2.14", "geocoder-php/mapbox-provider": "^1.4", @@ -24,41 +24,40 @@ "hieu-le/wordpress-xmlrpc-client": "~2.0", "intervention/image": "^2.7", "jenssegers/agent": "^2.6", - "laravel/framework": "^9.42", - "laravel/tinker": "^2.7", - "laravel/ui": "^3.3", - "laravelcollective/html": "^6.3", + "laravel/framework": "^10.48", + "laravel/tinker": "^2.8", + "laravel/ui": "^4.2", + "laravelcollective/html": "^6.4", "league/csv": "^9.7", "league/flysystem-aws-s3-v3": "^3.0", - "mariuzzo/laravel-js-localization": "^1.9", - "mcamara/laravel-localization": "^1.7", - "msurguy/honeypot": "^1.1", - "owen-it/laravel-auditing": "^12.1", - "rennokki/laravel-eloquent-query-cache": "^3.3", - "sentry/sentry-laravel": "^2.11", + "mariuzzo/laravel-js-localization": "^1.10", + "mcamara/laravel-localization": "^2.3.0", + "msurguy/honeypot": "^1.2", + "owen-it/laravel-auditing": "^13.1", + "rennokki/laravel-eloquent-query-cache": "^3.4", + "sentry/sentry-laravel": "^3.2", "soundasleep/html2text": "^1.1", "spatie/calendar-links": "^1.6", "spatie/laravel-validation-rules": "^3.4", - "spinen/laravel-discourse-sso": "^2.6", + "spinen/laravel-discourse-sso": "^2.8", "symfony/http-client": "^6.2", - "symfony/http-foundation": "^6.0", + "symfony/http-foundation": "^6.2", "symfony/mailgun-mailer": "^6.2", "toin0u/geocoder-laravel": "^4.6", - "twbs/bootstrap": "4.1.0", - "wouternl/laravel-drip": "^1.2.4" + "wouternl/laravel-drip": "dev-master", + "twbs/bootstrap": "4.1.0" }, "require-dev": { - "barryvdh/laravel-debugbar": "^3.6", + "barryvdh/laravel-debugbar": "^3.8", "fakerphp/faker": "^1.20.0", - "laravel/dusk": "^6.21", + "laravel/dusk": "^7.4", "mockery/mockery": "^1.4.4", "nunomaduro/collision": "^6.3", "osteel/openapi-httpfoundation-testing": "^0.8.0", - "php-coveralls/php-coveralls": "^2.4", "phpunit/phpunit": "^9.5.10", - "spatie/laravel-ignition": "^1.4", + "spatie/laravel-ignition": "^2.0", "squizlabs/php_codesniffer": "^3.6", - "symfony/dom-crawler": "^6.0" + "symfony/dom-crawler": "^6.2" }, "autoload": { "files": [ @@ -102,9 +101,16 @@ "sort-packages": true, "optimize-autoloader": true, "allow-plugins": { - "cweagans/composer-patches": true + "cweagans/composer-patches": true, + "php-http/discovery": true } }, - "minimum-stability": "dev", - "prefer-stable": true + "minimum-stability": "stable", + "prefer-stable": true, + "repositories": { + "laravel-drip": { + "type": "vcs", + "url": "https://github.com/TheRestartProject/laravel-drip" + } + } } diff --git a/composer.lock b/composer.lock index d6e3fc6b85..6116db558d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,98 +4,104 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0c0abc9232b1432ec1bad2ab73057e8d", + "content-hash": "58e367724a0cb582befb5a878f939819", "packages": [ { "name": "addwiki/mediawiki-api", - "version": "0.7.3", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/addwiki/mediawiki-api.git", - "reference": "cd1321526235b0a0507f92259254bd738ffb39d3" + "reference": "40b37905b74b3ccc57e495c27a2b7fab44509336" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/addwiki/mediawiki-api/zipball/cd1321526235b0a0507f92259254bd738ffb39d3", - "reference": "cd1321526235b0a0507f92259254bd738ffb39d3", + "url": "https://api.github.com/repos/addwiki/mediawiki-api/zipball/40b37905b74b3ccc57e495c27a2b7fab44509336", + "reference": "40b37905b74b3ccc57e495c27a2b7fab44509336", "shasum": "" }, "require": { - "addwiki/mediawiki-api-base": "~2.4", - "addwiki/mediawiki-datamodel": "~0.7.0|~0.8.0" + "addwiki/mediawiki-api-base": "^3.1", + "addwiki/mediawiki-datamodel": "^3.1", + "php": ">=8.1" }, "require-dev": { - "jakub-onderka/php-parallel-lint": "^0.9.2", - "mediawiki/mediawiki-codesniffer": "^13.0", - "monolog/monolog": "^1.23", - "phpunit/phpunit": "~4.8" + "mediawiki/mediawiki-codesniffer": "~38.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "~9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.7.x-dev" + "dev-main": "3.1-dev" } }, "autoload": { "psr-4": { - "Mediawiki\\Api\\": "src/" + "Addwiki\\Mediawiki\\Api\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { "name": "Addshore" + }, + { + "name": "Sam Wilson" } ], "description": "A MediaWiki API library", "keywords": [ + "api", "mediawiki" ], "support": { - "source": "https://github.com/addwiki/mediawiki-api/tree/0.7.3" + "source": "https://github.com/addwiki/mediawiki-api/tree/3.1.0" }, - "time": "2020-01-14T08:52:25+00:00" + "time": "2024-10-15T20:46:05+00:00" }, { "name": "addwiki/mediawiki-api-base", - "version": "2.8.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/addwiki/mediawiki-api-base.git", - "reference": "d8eff31b54fd39d90eb14457e5ce478cfdf08394" + "reference": "9a7433eb94284d9625c4c57de0bd1d45a6e301f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/addwiki/mediawiki-api-base/zipball/d8eff31b54fd39d90eb14457e5ce478cfdf08394", - "reference": "d8eff31b54fd39d90eb14457e5ce478cfdf08394", + "url": "https://api.github.com/repos/addwiki/mediawiki-api-base/zipball/9a7433eb94284d9625c4c57de0bd1d45a6e301f4", + "reference": "9a7433eb94284d9625c4c57de0bd1d45a6e301f4", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "~6.3|~7.0", + "guzzlehttp/guzzle": "~6.3||~7.0", "guzzlehttp/promises": "~1.0", - "php": ">=7.3", - "psr/log": "~1.0" + "mediawiki/oauthclient": "^2.1", + "php": ">=8.1", + "psr/log": "~3.0" }, "require-dev": { - "mediawiki/mediawiki-codesniffer": "~35.0", + "mediawiki/mediawiki-codesniffer": "~38.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpunit/phpunit": "~9" }, "suggest": { - "etsy/phan": "Allows running static analysis on the package (requires PHP 7+)" + "ext-dom": "Needed if you want to discover APIs using only page URLs", + "ext-simplexml": "Needed if you want to discover APIs using only page URLs" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.8-dev" + "dev-main": "3.1-dev" } }, "autoload": { "psr-4": { - "Mediawiki\\Api\\": "src/" + "Addwiki\\Mediawiki\\Api\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -113,43 +119,46 @@ "mediawiki" ], "support": { - "source": "https://github.com/addwiki/mediawiki-api-base/tree/2.8.0" + "source": "https://github.com/addwiki/mediawiki-api-base/tree/3.1.0" }, - "time": "2021-02-16T19:46:17+00:00" + "time": "2024-10-15T20:46:05+00:00" }, { "name": "addwiki/mediawiki-datamodel", - "version": "0.8.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/addwiki/mediawiki-datamodel.git", - "reference": "ed644d977f96bd9f1b165fbb9f186dbdf0c0ff7d" + "reference": "d78518876a28f5ee8704e73665ab172db5502de7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/addwiki/mediawiki-datamodel/zipball/ed644d977f96bd9f1b165fbb9f186dbdf0c0ff7d", - "reference": "ed644d977f96bd9f1b165fbb9f186dbdf0c0ff7d", + "url": "https://api.github.com/repos/addwiki/mediawiki-datamodel/zipball/d78518876a28f5ee8704e73665ab172db5502de7", + "reference": "d78518876a28f5ee8704e73665ab172db5502de7", "shasum": "" }, + "require": { + "php": ">=8.1" + }, "require-dev": { - "jakub-onderka/php-parallel-lint": "0.9.2", - "mediawiki/mediawiki-codesniffer": "^13.0", - "phpunit/phpunit": "~4.8.0|~5.3.0" + "mediawiki/mediawiki-codesniffer": "~38.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "~9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.8.x-dev" + "dev-main": "3.1-dev" } }, "autoload": { "psr-4": { - "Mediawiki\\DataModel\\": "src/" + "Addwiki\\Mediawiki\\DataModel\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -161,22 +170,22 @@ "mediawiki" ], "support": { - "source": "https://github.com/addwiki/mediawiki-datamodel/tree/master" + "source": "https://github.com/addwiki/mediawiki-datamodel/tree/3.1.0" }, - "time": "2018-07-30T09:55:08+00:00" + "time": "2024-10-15T20:46:10+00:00" }, { "name": "aws/aws-crt-php", - "version": "v1.2.4", + "version": "v1.2.7", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2" + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/eb0c6e4e142224a10b08f49ebf87f32611d162b2", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", "shasum": "" }, "require": { @@ -215,22 +224,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.4" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" }, - "time": "2023-11-08T00:42:13+00:00" + "time": "2024-10-18T22:15:13+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.295.7", + "version": "3.337.3", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "e3ba36c6e52dce373064fbb1741547828235425f" + "reference": "06dfc8f76423b49aaa181debd25bbdc724c346d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e3ba36c6e52dce373064fbb1741547828235425f", - "reference": "e3ba36c6e52dce373064fbb1741547828235425f", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/06dfc8f76423b49aaa181debd25bbdc724c346d6", + "reference": "06dfc8f76423b49aaa181debd25bbdc724c346d6", "shasum": "" }, "require": { @@ -259,8 +268,8 @@ "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0", - "psr/simple-cache": "^1.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", "sebastian/comparator": "^1.2.3 || ^4.0", "yoast/phpunit-polyfills": "^1.0" }, @@ -283,7 +292,10 @@ ], "psr-4": { "Aws\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/data/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -310,45 +322,45 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.295.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.337.3" }, - "time": "2024-01-05T19:10:48+00:00" + "time": "2025-01-21T19:10:05+00:00" }, { "name": "barryvdh/laravel-translation-manager", - "version": "v0.6.3", + "version": "v0.6.8", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-translation-manager.git", - "reference": "b21c18afdb1315ab616005b6d33104802a405ebc" + "reference": "fe182d8b6e994ef92ff816c926d2c8c875bcb12d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-translation-manager/zipball/b21c18afdb1315ab616005b6d33104802a405ebc", - "reference": "b21c18afdb1315ab616005b6d33104802a405ebc", + "url": "https://api.github.com/repos/barryvdh/laravel-translation-manager/zipball/fe182d8b6e994ef92ff816c926d2c8c875bcb12d", + "reference": "fe182d8b6e994ef92ff816c926d2c8c875bcb12d", "shasum": "" }, "require": { - "illuminate/support": "^6|^7|^8|^9", - "illuminate/translation": "^6|^7|^8|^9", - "php": ">=7.2", - "symfony/finder": "^4|^5|^6" + "illuminate/support": "^9|^10|^11|^12", + "illuminate/translation": "^9|^10|^11|^12", + "php": "^8.1", + "symfony/finder": "^6|^7" }, "require-dev": { - "orchestra/testbench": "^4|^5|^6|^7" + "orchestra/testbench": "^7|^8|^9|^10" }, "suggest": { "tanmuhittin/laravel-google-translate": "If you want to translate using Google API" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "0.6-dev" - }, "laravel": { "providers": [ "Barryvdh\\TranslationManager\\ManagerServiceProvider" ] + }, + "branch-alias": { + "dev-master": "0.6-dev" } }, "autoload": { @@ -374,29 +386,29 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-translation-manager/issues", - "source": "https://github.com/barryvdh/laravel-translation-manager/tree/v0.6.3" + "source": "https://github.com/barryvdh/laravel-translation-manager/tree/v0.6.8" }, - "time": "2022-03-17T20:07:34+00:00" + "time": "2025-06-07T14:31:37+00:00" }, { "name": "bkwld/croppa", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/BKWLD/croppa.git", - "reference": "1dc063c3684019eeaa02b2175d43c0d997659b84" + "reference": "ade55922a77817972df82f2f00be647ae6ffcbae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BKWLD/croppa/zipball/1dc063c3684019eeaa02b2175d43c0d997659b84", - "reference": "1dc063c3684019eeaa02b2175d43c0d997659b84", + "url": "https://api.github.com/repos/BKWLD/croppa/zipball/ade55922a77817972df82f2f00be647ae6ffcbae", + "reference": "ade55922a77817972df82f2f00be647ae6ffcbae", "shasum": "" }, "require": { "ext-gd": "*", - "illuminate/console": "^9.0", - "illuminate/routing": "^9.0", - "illuminate/support": "^9.0", + "illuminate/console": "^9.0|^10.0", + "illuminate/routing": "^9.0|^10.0", + "illuminate/support": "^9.0|^10.0", "intervention/image": "^2.7", "league/flysystem": "^3.0", "php": "^8.0.2", @@ -415,12 +427,12 @@ "type": "library", "extra": { "laravel": { - "providers": [ - "Bkwld\\Croppa\\CroppaServiceProvider" - ], "aliases": { "Croppa": "Bkwld\\Croppa\\Facades\\Croppa" - } + }, + "providers": [ + "Bkwld\\Croppa\\CroppaServiceProvider" + ] } }, "autoload": { @@ -450,32 +462,31 @@ ], "support": { "issues": "https://github.com/BKWLD/croppa/issues", - "source": "https://github.com/BKWLD/croppa/tree/6.0.1" + "source": "https://github.com/BKWLD/croppa/tree/6.0.2" }, - "time": "2022-05-30T09:25:12+00:00" + "time": "2023-03-20T19:02:41+00:00" }, { "name": "brick/math", - "version": "0.10.2", + "version": "0.12.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.4 || ^8.0" + "php": "^8.1" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "4.25.0" + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "6.8.8" }, "type": "library", "autoload": { @@ -495,12 +506,17 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.10.2" + "source": "https://github.com/brick/math/tree/0.12.3" }, "funding": [ { @@ -508,20 +524,89 @@ "type": "github" } ], - "time": "2022-08-10T22:54:19+00:00" + "time": "2025-02-28T13:11:00+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" }, { "name": "caseyamcl/guzzle_retry_middleware", - "version": "v2.8.0", + "version": "v2.13.0", "source": { "type": "git", "url": "https://github.com/caseyamcl/guzzle_retry_middleware.git", - "reference": "225c8485e6777746d32deac341b4781011e61424" + "reference": "17c9299cde438b00bbeb099c6480319a81636a60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/caseyamcl/guzzle_retry_middleware/zipball/225c8485e6777746d32deac341b4781011e61424", - "reference": "225c8485e6777746d32deac341b4781011e61424", + "url": "https://api.github.com/repos/caseyamcl/guzzle_retry_middleware/zipball/17c9299cde438b00bbeb099c6480319a81636a60", + "reference": "17c9299cde438b00bbeb099c6480319a81636a60", "shasum": "" }, "require": { @@ -530,11 +615,12 @@ }, "require-dev": { "jaschilz/php-coverage-badger": "^2.0", - "nesbot/carbon": "^2.0", + "nesbot/carbon": "^2.0|^3.0", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.0", "phpunit/phpunit": "^7.5|^8.0|^9.0", - "squizlabs/php_codesniffer": "^3.5" + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-dumper": "^5.0|^6.0|^7.0" }, "type": "library", "extra": { @@ -572,7 +658,7 @@ ], "support": { "issues": "https://github.com/caseyamcl/guzzle_retry_middleware/issues", - "source": "https://github.com/caseyamcl/guzzle_retry_middleware/tree/v2.8.0" + "source": "https://github.com/caseyamcl/guzzle_retry_middleware/tree/v2.13.0" }, "funding": [ { @@ -580,27 +666,27 @@ "type": "github" } ], - "time": "2022-11-20T21:56:14+00:00" + "time": "2025-07-11T12:33:22+00:00" }, { "name": "clue/stream-filter", - "version": "v1.6.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", "shasum": "" }, "require": { "php": ">=5.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -622,7 +708,7 @@ } ], "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "homepage": "https://github.com/clue/stream-filter", "keywords": [ "bucket brigade", "callback", @@ -634,7 +720,7 @@ ], "support": { "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" }, "funding": [ { @@ -646,7 +732,7 @@ "type": "github" } ], - "time": "2022-02-21T13:15:14+00:00" + "time": "2023-12-20T15:40:13+00:00" }, { "name": "cviebrock/discourse-php", @@ -747,41 +833,42 @@ }, { "name": "darkaonline/l5-swagger", - "version": "8.4.1", + "version": "8.6.5", "source": { "type": "git", "url": "https://github.com/DarkaOnLine/L5-Swagger.git", - "reference": "0b1c3f5aca80fc710877bf7fdbab6d28d9b54f4c" + "reference": "4cf2b3faae9e9cffd05e4eb6e066741bf56f0a85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DarkaOnLine/L5-Swagger/zipball/0b1c3f5aca80fc710877bf7fdbab6d28d9b54f4c", - "reference": "0b1c3f5aca80fc710877bf7fdbab6d28d9b54f4c", + "url": "https://api.github.com/repos/DarkaOnLine/L5-Swagger/zipball/4cf2b3faae9e9cffd05e4eb6e066741bf56f0a85", + "reference": "4cf2b3faae9e9cffd05e4eb6e066741bf56f0a85", "shasum": "" }, "require": { + "doctrine/annotations": "^1.0 || ^2.0", "ext-json": "*", - "laravel/framework": "^9.0 || >=8.40.0 || ^7.0", + "laravel/framework": "^11.0 || ^10.0 || ^9.0 || >=8.40.0 || ^7.0", "php": "^7.2 || ^8.0", - "swagger-api/swagger-ui": "^3.0 || ^4.0", - "symfony/yaml": "^5.0 || ^6.0", - "zircote/swagger-php": "^3.2 || ^4.0" + "swagger-api/swagger-ui": "^3.0 || >=4.1.3", + "symfony/yaml": "^5.0 || ^6.0 || ^7.0", + "zircote/swagger-php": "^3.2.0 || ^4.0.0" }, "require-dev": { "mockery/mockery": "1.*", - "orchestra/testbench": "7.* || ^6.15 || 5.*", + "orchestra/testbench": "^9.0 || ^8.0 || 7.* || ^6.15 || 5.*", "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^11.0 || ^10.0 || ^9.5" }, "type": "library", "extra": { "laravel": { - "providers": [ - "L5Swagger\\L5SwaggerServiceProvider" - ], "aliases": { "L5Swagger": "L5Swagger\\L5SwaggerFacade" - } + }, + "providers": [ + "L5Swagger\\L5SwaggerServiceProvider" + ] } }, "autoload": { @@ -814,7 +901,7 @@ ], "support": { "issues": "https://github.com/DarkaOnLine/L5-Swagger/issues", - "source": "https://github.com/DarkaOnLine/L5-Swagger/tree/8.4.1" + "source": "https://github.com/DarkaOnLine/L5-Swagger/tree/8.6.5" }, "funding": [ { @@ -822,7 +909,7 @@ "type": "github" } ], - "time": "2022-09-22T05:16:35+00:00" + "time": "2025-02-06T14:54:32+00:00" }, { "name": "dflydev/dot-access-data", @@ -901,16 +988,16 @@ }, { "name": "doctrine/annotations", - "version": "2.0.0", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "d02c9f3742044e17d5fa8d28d8402a2d95c33302" + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/d02c9f3742044e17d5fa8d28d8402a2d95c33302", - "reference": "d02c9f3742044e17d5fa8d28d8402a2d95c33302", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", "shasum": "" }, "require": { @@ -922,10 +1009,10 @@ "require-dev": { "doctrine/cache": "^2.0", "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.0", + "phpstan/phpstan": "^1.10.28", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" }, "suggest": { "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" @@ -971,134 +1058,47 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.0" - }, - "time": "2022-12-19T18:17:20+00:00" - }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" + "source": "https://github.com/doctrine/annotations/tree/2.0.2" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" + "time": "2024-09-05T10:17:24+00:00" }, { "name": "doctrine/dbal", - "version": "2.13.9", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + "reference": "3626601014388095d3af9de7e9e958623b7ef005" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/3626601014388095d3af9de7e9e958623b7ef005", + "reference": "3626601014388095d3af9de7e9e958623b7ef005", "shasum": "" }, "require": { - "doctrine/cache": "^1.0|^2.0", + "composer-runtime-api": "^2", "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "conflict": { + "doctrine/cache": "< 1.11" }, "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.4.6", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", - "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.22.0" + "doctrine/cache": "^1.11|^2.0", + "doctrine/coding-standard": "13.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "9.6.23", + "slevomat/coding-standard": "8.16.2", + "squizlabs/php_codesniffer": "3.13.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -1109,7 +1109,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + "Doctrine\\DBAL\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1152,14 +1152,13 @@ "queryobject", "sasql", "sql", - "sqlanywhere", "sqlite", "sqlserver", "sqlsrv" ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.9" + "source": "https://github.com/doctrine/dbal/tree/3.10.1" }, "funding": [ { @@ -1175,29 +1174,34 @@ "type": "tidelift" } ], - "time": "2022-05-02T20:28:55+00:00" + "time": "2025-08-05T12:18:06+00:00" }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" }, "require-dev": { - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1205,7 +1209,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Doctrine\\Deprecations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1216,36 +1220,35 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { "name": "doctrine/event-manager", - "version": "1.2.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.24" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "type": "library", "autoload": { @@ -1294,7 +1297,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" }, "funding": [ { @@ -1310,37 +1313,36 @@ "type": "tidelift" } ], - "time": "2022-10-12T20:51:15+00:00" + "time": "2024-05-22T20:47:39+00:00" }, { "name": "doctrine/inflector", - "version": "2.0.6", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", - "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1385,7 +1387,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.6" + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -1401,20 +1403,20 @@ "type": "tidelift" } ], - "time": "2022-10-20T09:10:12+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", "shasum": "" }, "require": { @@ -1422,11 +1424,11 @@ "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", + "doctrine/coding-standard": "^9 || ^12", "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "vimeo/psalm": "^4.11 || ^5.21" }, "type": "library", "autoload": { @@ -1463,7 +1465,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "source": "https://github.com/doctrine/lexer/tree/2.1.1" }, "funding": [ { @@ -1479,20 +1481,20 @@ "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2024-02-05T11:35:39+00:00" }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.2", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { @@ -1505,10 +1507,14 @@ "require-dev": { "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.0", - "phpstan/phpstan-webmozart-assert": "^1.0", "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -1532,7 +1538,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, "funding": [ { @@ -1540,20 +1546,20 @@ "type": "github" } ], - "time": "2022-09-10T18:51:20+00:00" + "time": "2024-10-09T13:47:03+00:00" }, { "name": "egulias/email-validator", - "version": "3.2.5", + "version": "3.2.6", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "b531a2311709443320c786feb4519cfaf94af796" + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b531a2311709443320c786feb4519cfaf94af796", - "reference": "b531a2311709443320c786feb4519cfaf94af796", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", "shasum": "" }, "require": { @@ -1599,7 +1605,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/3.2.5" + "source": "https://github.com/egulias/EmailValidator/tree/3.2.6" }, "funding": [ { @@ -1607,30 +1613,30 @@ "type": "github" } ], - "time": "2023-01-02T17:26:14+00:00" + "time": "2023-06-01T07:04:22+00:00" }, { "name": "filp/whoops", - "version": "2.14.6", + "version": "2.18.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "f7948baaa0330277c729714910336383286305da" + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da", - "reference": "f7948baaa0330277c729714910336383286305da", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", + "php": "^7.1 || ^8.0", "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -1670,7 +1676,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.6" + "source": "https://github.com/filp/whoops/tree/2.18.4" }, "funding": [ { @@ -1678,25 +1684,25 @@ "type": "github" } ], - "time": "2022-11-02T16:23:29+00:00" + "time": "2025-08-08T12:00:00+00:00" }, { "name": "fruitcake/php-cors", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/fruitcake/php-cors.git", - "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", - "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "symfony/http-foundation": "^4.4|^5.4|^6" + "symfony/http-foundation": "^4.4|^5.4|^6|^7" }, "require-dev": { "phpstan/phpstan": "^1.4", @@ -1706,7 +1712,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.1-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -1737,7 +1743,7 @@ ], "support": { "issues": "https://github.com/fruitcake/php-cors/issues", - "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" }, "funding": [ { @@ -1749,26 +1755,26 @@ "type": "github" } ], - "time": "2022-02-20T15:07:15+00:00" + "time": "2023-10-12T05:21:21+00:00" }, { "name": "geocoder-php/chain-provider", - "version": "4.5.0", + "version": "4.6.0", "source": { "type": "git", "url": "https://github.com/geocoder-php/chain-provider.git", - "reference": "ebcae03b9cc6f8dd1ebebf48f8105103e28b9152" + "reference": "38e03ddb2c16ac3c964072f4f9d06837164341df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/chain-provider/zipball/ebcae03b9cc6f8dd1ebebf48f8105103e28b9152", - "reference": "ebcae03b9cc6f8dd1ebebf48f8105103e28b9152", + "url": "https://api.github.com/repos/geocoder-php/chain-provider/zipball/38e03ddb2c16ac3c964072f4f9d06837164341df", + "reference": "38e03ddb2c16ac3c964072f4f9d06837164341df", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", + "php": "^8.0", "psr/log": "^1.0|^2.0|^3.0", - "willdurand/geocoder": "^4.0" + "willdurand/geocoder": "^4.0|^5.0" }, "provide": { "geocoder-php/provider-implementation": "1.0" @@ -1806,40 +1812,37 @@ "description": "Geocoder chain adapter", "homepage": "http://geocoder-php.org/Geocoder/", "support": { - "source": "https://github.com/geocoder-php/chain-provider/tree/4.5.0" + "source": "https://github.com/geocoder-php/chain-provider/tree/4.6.0" }, - "time": "2022-07-30T12:09:30+00:00" + "time": "2025-04-15T13:24:32+00:00" }, { "name": "geocoder-php/common-http", - "version": "4.5.0", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/geocoder-php/php-common-http.git", - "reference": "4ee2cee60d21631e2a09c196bf6b9fd296bca728" + "reference": "4209be6c31946ed5a658f6240ab21faaf5413f61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/php-common-http/zipball/4ee2cee60d21631e2a09c196bf6b9fd296bca728", - "reference": "4ee2cee60d21631e2a09c196bf6b9fd296bca728", + "url": "https://api.github.com/repos/geocoder-php/php-common-http/zipball/4209be6c31946ed5a658f6240ab21faaf5413f61", + "reference": "4209be6c31946ed5a658f6240ab21faaf5413f61", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", - "php-http/client-implementation": "^1.0", - "php-http/discovery": "^1.6", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0", - "psr/http-message-implementation": "^1.0", - "willdurand/geocoder": "^4.0" + "php": "^8.0", + "php-http/discovery": "^1.17", + "psr/http-client-implementation": "^1.0", + "psr/http-factory-implementation": "^1.0", + "willdurand/geocoder": "^4.0|^5.0" }, "require-dev": { "nyholm/psr7": "^1.0", "php-http/message": "^1.0", "php-http/mock-client": "^1.0", "phpunit/phpunit": "^9.5", - "symfony/stopwatch": "~2.5" + "symfony/stopwatch": "~2.5 || ~5.0" }, "type": "library", "extra": { @@ -1871,36 +1874,35 @@ "http geocoder" ], "support": { - "source": "https://github.com/geocoder-php/php-common-http/tree/4.5.0" + "source": "https://github.com/geocoder-php/php-common-http/tree/4.7.0" }, - "time": "2022-07-30T12:09:30+00:00" + "time": "2025-04-15T12:38:11+00:00" }, { "name": "geocoder-php/geo-plugin-provider", - "version": "4.3.0", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/geocoder-php/geo-plugin-provider.git", - "reference": "fcb8fd60bb6324be305a90deae59497b928ccbd3" + "reference": "0fffb478260d8c3ec6cb5388a67d0684b006191a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/geo-plugin-provider/zipball/fcb8fd60bb6324be305a90deae59497b928ccbd3", - "reference": "fcb8fd60bb6324be305a90deae59497b928ccbd3", + "url": "https://api.github.com/repos/geocoder-php/geo-plugin-provider/zipball/0fffb478260d8c3ec6cb5388a67d0684b006191a", + "reference": "0fffb478260d8c3ec6cb5388a67d0684b006191a", "shasum": "" }, "require": { "geocoder-php/common-http": "^4.0", "igorw/get-in": "^1.0", - "php": "^7.4 || ^8.0", - "willdurand/geocoder": "^4.0" + "php": "^8.0", + "willdurand/geocoder": "^4.0|^5.0" }, "provide": { "geocoder-php/provider-implementation": "1.0" }, "require-dev": { - "geocoder-php/provider-integration-tests": "^1.0", - "php-http/curl-client": "^2.2", + "geocoder-php/provider-integration-tests": "^1.6.3", "php-http/message": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -1931,35 +1933,34 @@ "description": "Geocoder GeoPlugin adapter", "homepage": "http://geocoder-php.org/Geocoder/", "support": { - "source": "https://github.com/geocoder-php/geo-plugin-provider/tree/4.3.0" + "source": "https://github.com/geocoder-php/geo-plugin-provider/tree/4.4.0" }, - "time": "2022-07-30T10:48:32+00:00" + "time": "2025-04-15T13:24:32+00:00" }, { "name": "geocoder-php/google-maps-provider", - "version": "4.7.0", + "version": "4.8.0", "source": { "type": "git", "url": "https://github.com/geocoder-php/google-maps-provider.git", - "reference": "378cd4dd26cba5a004f2a4738e8988e646af3274" + "reference": "587aac3647ebd2ce2090b613fc56c753b9dee9a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/google-maps-provider/zipball/378cd4dd26cba5a004f2a4738e8988e646af3274", - "reference": "378cd4dd26cba5a004f2a4738e8988e646af3274", + "url": "https://api.github.com/repos/geocoder-php/google-maps-provider/zipball/587aac3647ebd2ce2090b613fc56c753b9dee9a7", + "reference": "587aac3647ebd2ce2090b613fc56c753b9dee9a7", "shasum": "" }, "require": { "geocoder-php/common-http": "^4.0", - "php": "^7.4 || ^8.0", - "willdurand/geocoder": "^4.0" + "php": "^8.0", + "willdurand/geocoder": "^4.0|^5.0" }, "provide": { "geocoder-php/provider-implementation": "1.0" }, "require-dev": { - "geocoder-php/provider-integration-tests": "^1.0", - "php-http/curl-client": "^2.2", + "geocoder-php/provider-integration-tests": "^1.6.3", "php-http/message": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -1990,35 +1991,34 @@ "description": "Geocoder GoogleMaps adapter", "homepage": "http://geocoder-php.org/Geocoder/", "support": { - "source": "https://github.com/geocoder-php/google-maps-provider/tree/4.7.0" + "source": "https://github.com/geocoder-php/google-maps-provider/tree/4.8.0" }, - "time": "2022-07-30T12:09:30+00:00" + "time": "2025-04-15T13:24:32+00:00" }, { "name": "geocoder-php/mapbox-provider", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/geocoder-php/mapbox-provider.git", - "reference": "95287b1c4724de32a1552bdaa27e53d7a9490fe8" + "reference": "cf41bc1a19b9c54277d615c884bf95d0bfc2ae9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/mapbox-provider/zipball/95287b1c4724de32a1552bdaa27e53d7a9490fe8", - "reference": "95287b1c4724de32a1552bdaa27e53d7a9490fe8", + "url": "https://api.github.com/repos/geocoder-php/mapbox-provider/zipball/cf41bc1a19b9c54277d615c884bf95d0bfc2ae9f", + "reference": "cf41bc1a19b9c54277d615c884bf95d0bfc2ae9f", "shasum": "" }, "require": { "geocoder-php/common-http": "^4.0", - "php": "^7.4 || ^8.0", - "willdurand/geocoder": "^4.0" + "php": "^8.0", + "willdurand/geocoder": "^4.0|^5.0" }, "provide": { "geocoder-php/provider-implementation": "1.0" }, "require-dev": { - "geocoder-php/provider-integration-tests": "^1.0", - "php-http/curl-client": "^2.2", + "geocoder-php/provider-integration-tests": "^1.6.3", "php-http/message": "^1.0", "phpunit/phpunit": "^9.5" }, @@ -2049,30 +2049,30 @@ "description": "Geocoder Mapbox adapter", "homepage": "http://geocoder-php.org/Geocoder/", "support": { - "source": "https://github.com/geocoder-php/mapbox-provider/tree/1.4.0" + "source": "https://github.com/geocoder-php/mapbox-provider/tree/1.5.0" }, - "time": "2022-07-30T12:09:30+00:00" + "time": "2025-04-15T13:24:32+00:00" }, { "name": "graham-campbell/result-type", - "version": "v1.1.0", + "version": "v1.1.3", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8" + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8", - "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9" + "phpoption/phpoption": "^1.9.3" }, "require-dev": { - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", "autoload": { @@ -2101,7 +2101,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" }, "funding": [ { @@ -2113,26 +2113,26 @@ "type": "tidelift" } ], - "time": "2022-07-30T15:56:11+00:00" + "time": "2024-07-20T21:45:45+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -2143,9 +2143,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -2223,7 +2223,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.3" }, "funding": [ { @@ -2239,7 +2239,7 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2025-03-27T13:37:11+00:00" }, { "name": "guzzlehttp/promises", @@ -2322,16 +2322,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -2346,8 +2346,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2418,7 +2418,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -2434,38 +2434,41 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { - "name": "hieu-le/wordpress-xmlrpc-client", - "version": "2.6.0", + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", "source": { "type": "git", - "url": "https://github.com/letrunghieu/wordpress-xmlrpc-client.git", - "reference": "4eced3821b41ba21ce314569b79d7302d65f4b16" + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/letrunghieu/wordpress-xmlrpc-client/zipball/4eced3821b41ba21ce314569b79d7302d65f4b16", - "reference": "4eced3821b41ba21ce314569b79d7302d65f4b16", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", "shasum": "" }, "require": { - "ext-xmlrpc": "*", - "php": ">=5.3.0" + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "codeclimate/php-test-reporter": "dev-master", - "illuminate/support": "~4.0", - "php-vcr/php-vcr": "^1.0", - "php-vcr/phpunit-testlistener-vcr": "*", - "phpunit/phpunit": "*", - "symfony/yaml": "2.*" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { "psr-4": { - "HieuLe\\WordpressXmlrpcClient\\": "src/" + "GuzzleHttp\\UriTemplate\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2474,11 +2477,94 @@ ], "authors": [ { - "name": "Hieu Le", - "email": "letrunghieu.cse09@gmail.com", - "homepage": "http://www.hieule.info" - } - ], + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "hieu-le/wordpress-xmlrpc-client", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/letrunghieu/wordpress-xmlrpc-client.git", + "reference": "4eced3821b41ba21ce314569b79d7302d65f4b16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/letrunghieu/wordpress-xmlrpc-client/zipball/4eced3821b41ba21ce314569b79d7302d65f4b16", + "reference": "4eced3821b41ba21ce314569b79d7302d65f4b16", + "shasum": "" + }, + "require": { + "ext-xmlrpc": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "illuminate/support": "~4.0", + "php-vcr/php-vcr": "^1.0", + "php-vcr/phpunit-testlistener-vcr": "*", + "phpunit/phpunit": "*", + "symfony/yaml": "2.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "HieuLe\\WordpressXmlrpcClient\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Hieu Le", + "email": "letrunghieu.cse09@gmail.com", + "homepage": "http://www.hieule.info" + } + ], "description": "A PHP client for Wordpress websites that closely implement the XML-RPC WordPress API with full test suite built in", "keywords": [ "api", @@ -2630,16 +2716,16 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - }, "laravel": { - "providers": [ - "Intervention\\Image\\ImageServiceProvider" - ], "aliases": { "Image": "Intervention\\Image\\Facades\\Image" - } + }, + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.4-dev" } }, "autoload": { @@ -2686,20 +2772,20 @@ }, { "name": "jaybizzle/crawler-detect", - "version": "v1.2.112", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/JayBizzle/Crawler-Detect.git", - "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f" + "reference": "fbf1a3e81d61b088e7af723fb3c7a4ee92ac7e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f", - "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f", + "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/fbf1a3e81d61b088e7af723fb3c7a4ee92ac7e34", + "reference": "fbf1a3e81d61b088e7af723fb3c7a4ee92ac7e34", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.1.0" }, "require-dev": { "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4" @@ -2732,34 +2818,35 @@ ], "support": { "issues": "https://github.com/JayBizzle/Crawler-Detect/issues", - "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.112" + "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.3.5" }, - "time": "2022-10-05T21:52:44+00:00" + "time": "2025-06-11T17:58:05+00:00" }, { "name": "jean85/pretty-package-versions", - "version": "2.0.5", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^0.12.66", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", "extra": { @@ -2791,9 +2878,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" }, - "time": "2021-10-08T21:21:46+00:00" + "time": "2025-03-19T14:43:43+00:00" }, { "name": "jenssegers/agent", @@ -2823,16 +2910,16 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - }, "laravel": { - "providers": [ - "Jenssegers\\Agent\\AgentServiceProvider" - ], "aliases": { "Agent": "Jenssegers\\Agent\\Facades\\Agent" - } + }, + "providers": [ + "Jenssegers\\Agent\\AgentServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" } }, "autoload": { @@ -2880,53 +2967,65 @@ }, { "name": "laravel/framework", - "version": "v9.48.0", + "version": "v10.48.29", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "c78ae7aeb0cbcb1a205050d3592247ba07f5b711" + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/c78ae7aeb0cbcb1a205050d3592247ba07f5b711", - "reference": "c78ae7aeb0cbcb1a205050d3592247ba07f5b711", + "url": "https://api.github.com/repos/laravel/framework/zipball/8f7f9247cb8aad1a769d6b9815a6623d89b46b47", + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47", "shasum": "" }, "require": { - "brick/math": "^0.10.2", - "doctrine/inflector": "^2.0", + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.3.2", "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", "ext-mbstring": "*", "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", "fruitcake/php-cors": "^1.2", - "laravel/serializable-closure": "^1.2.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", - "monolog/monolog": "^2.0", - "nesbot/carbon": "^2.62.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", "nunomaduro/termwind": "^1.13", - "php": "^8.0.2", + "php": "^8.1", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^6.0.9", - "symfony/error-handler": "^6.0", - "symfony/finder": "^6.0", - "symfony/http-foundation": "^6.0", - "symfony/http-kernel": "^6.0", - "symfony/mailer": "^6.0", - "symfony/mime": "^6.0", - "symfony/process": "^6.0", - "symfony/routing": "^6.0", - "symfony/uid": "^6.0", - "symfony/var-dumper": "^6.0", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.4.1", "voku/portable-ascii": "^2.0" }, "conflict": { + "carbonphp/carbon-doctrine-types": ">=3.0", + "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", "tightenco/collect": "<5.5.33" }, "provide": { @@ -2957,6 +3056,7 @@ "illuminate/notifications": "self.version", "illuminate/pagination": "self.version", "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", "illuminate/queue": "self.version", "illuminate/redis": "self.version", "illuminate/routing": "self.version", @@ -2970,7 +3070,8 @@ "require-dev": { "ably/ably-php": "^1.0", "aws/aws-sdk-php": "^3.235.5", - "doctrine/dbal": "^2.13.3|^3.1.4", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", "fakerphp/faker": "^1.21", "guzzlehttp/guzzle": "^7.5", "league/flysystem-aws-s3-v3": "^3.0", @@ -2979,25 +3080,28 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", - "orchestra/testbench-core": "^7.16", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.23.4", "pda/pheanstalk": "^4.0", - "phpstan/phpdoc-parser": "^1.15", - "phpstan/phpstan": "^1.4.7", - "phpunit/phpunit": "^9.5.8", - "predis/predis": "^1.1.9|^2.0.2", - "symfony/cache": "^6.0", - "symfony/http-client": "^6.0" + "phpstan/phpstan": "~1.11.11", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", "brianium/paratest": "Required to run tests in parallel (^6.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", - "ext-bcmath": "Required to use the multiple_of validation rule.", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", "ext-ftp": "Required to use the Flysystem FTP driver.", "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-memcached": "Required to use the memcache cache driver.", - "ext-pcntl": "Required to use all features of the queue worker.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", @@ -3012,27 +3116,28 @@ "mockery/mockery": "Required to use mocking (^1.5.1).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8).", - "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^6.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^6.0).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "9.x-dev" + "dev-master": "10.x-dev" } }, "autoload": { "files": [ "src/Illuminate/Collections/helpers.php", "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Support/helpers.php" ], @@ -3065,30 +3170,89 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-01-17T15:06:19+00:00" + "time": "2025-03-12T14:42:01+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.25", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.25" + }, + "time": "2024-08-12T22:06:33+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.2.2", + "version": "v1.3.7", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae" + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae", - "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/4f48ade902b94323ca3be7646db16209ec76be3d", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d", "shasum": "" }, "require": { "php": "^7.3|^8.0" }, "require-dev": { - "nesbot/carbon": "^2.61", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", "pestphp/pest": "^1.21.3", "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" }, "type": "library", "extra": { @@ -3125,42 +3289,40 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2022-09-08T13:45:54+00:00" + "time": "2024-11-14T18:34:49+00:00" }, { "name": "laravel/tinker", - "version": "v2.8.0", + "version": "v2.10.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad" + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/74d0b287cc4ae65d15c368dd697aae71d62a73ad", - "reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^7.2.5|^8.0", - "psy/psysh": "^0.10.4|^0.11.1", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", - "phpunit/phpunit": "^8.5.8|^9.3.3" + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, "laravel": { "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" @@ -3191,43 +3353,45 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.8.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.1" }, - "time": "2023-01-10T18:03:30+00:00" + "time": "2025-01-27T14:24:01+00:00" }, { "name": "laravel/ui", - "version": "v3.4.6", + "version": "v4.6.1", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c" + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/65ec5c03f7fee2c8ecae785795b829a15be48c2c", - "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c", + "url": "https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", "shasum": "" }, "require": { - "illuminate/console": "^8.42|^9.0", - "illuminate/filesystem": "^8.42|^9.0", - "illuminate/support": "^8.82|^9.0", - "illuminate/validation": "^8.42|^9.0", - "php": "^7.3|^8.0" + "illuminate/console": "^9.21|^10.0|^11.0|^12.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0", + "illuminate/validation": "^9.21|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0" }, "require-dev": { - "orchestra/testbench": "^6.23|^7.0" + "orchestra/testbench": "^7.35|^8.15|^9.0|^10.0", + "phpunit/phpunit": "^9.3|^10.4|^11.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - }, "laravel": { "providers": [ "Laravel\\Ui\\UiServiceProvider" ] + }, + "branch-alias": { + "dev-master": "4.x-dev" } }, "autoload": { @@ -3252,34 +3416,34 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v3.4.6" + "source": "https://github.com/laravel/ui/tree/v4.6.1" }, - "time": "2022-05-20T13:38:08+00:00" + "time": "2025-01-28T15:15:29+00:00" }, { "name": "laravelcollective/html", - "version": "v6.3.0", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "78c3cb516ac9e6d3d76cad9191f81d217302dea6" + "reference": "64ddfdcaeeb8d332bd98bef442bef81e39c3910b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/78c3cb516ac9e6d3d76cad9191f81d217302dea6", - "reference": "78c3cb516ac9e6d3d76cad9191f81d217302dea6", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/64ddfdcaeeb8d332bd98bef442bef81e39c3910b", + "reference": "64ddfdcaeeb8d332bd98bef442bef81e39c3910b", "shasum": "" }, "require": { - "illuminate/http": "^6.0|^7.0|^8.0|^9.0", - "illuminate/routing": "^6.0|^7.0|^8.0|^9.0", - "illuminate/session": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", - "illuminate/view": "^6.0|^7.0|^8.0|^9.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/routing": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/session": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/view": "^6.0|^7.0|^8.0|^9.0|^10.0", "php": ">=7.2.5" }, "require-dev": { - "illuminate/database": "^6.0|^7.0|^8.0|^9.0", + "illuminate/database": "^6.0|^7.0|^8.0|^9.0|^10.0", "mockery/mockery": "~1.0", "phpunit/phpunit": "~8.5|^9.5.10" }, @@ -3326,20 +3490,21 @@ "issues": "https://github.com/LaravelCollective/html/issues", "source": "https://github.com/LaravelCollective/html" }, - "time": "2022-02-08T21:02:54+00:00" + "abandoned": "spatie/laravel-html", + "time": "2023-04-25T02:46:11+00:00" }, { "name": "league/commonmark", - "version": "2.6.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d150f911e0079e90ae3c106734c93137c184f932" + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d150f911e0079e90ae3c106734c93137c184f932", - "reference": "d150f911e0079e90ae3c106734c93137c184f932", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", "shasum": "" }, "require": { @@ -3368,7 +3533,7 @@ "symfony/process": "^5.4 | ^6.0 | ^7.0", "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0 || ^5.0.0" + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, "suggest": { "symfony/yaml": "v2.3+ required if using the Front Matter extension" @@ -3376,7 +3541,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.7-dev" + "dev-main": "2.8-dev" } }, "autoload": { @@ -3433,7 +3598,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T15:34:16+00:00" + "time": "2025-07-20T12:47:49+00:00" }, { "name": "league/config", @@ -3519,35 +3684,42 @@ }, { "name": "league/csv", - "version": "9.8.0", + "version": "9.24.1", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "9d2e0265c5d90f5dd601bc65ff717e05cec19b47" + "reference": "e0221a3f16aa2a823047d59fab5809d552e29bc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/9d2e0265c5d90f5dd601bc65ff717e05cec19b47", - "reference": "9d2e0265c5d90f5dd601bc65ff717e05cec19b47", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/e0221a3f16aa2a823047d59fab5809d552e29bc8", + "reference": "e0221a3f16aa2a823047d59fab5809d552e29bc8", "shasum": "" }, "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^7.4 || ^8.0" + "ext-filter": "*", + "php": "^8.1.2" }, "require-dev": { - "ext-curl": "*", "ext-dom": "*", - "friendsofphp/php-cs-fixer": "^v3.4.0", - "phpstan/phpstan": "^1.3.0", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpstan/phpstan-strict-rules": "^1.1.0", - "phpunit/phpunit": "^9.5.11" + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.75.0", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^1.12.27", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.22", + "symfony/var-dumper": "^6.4.8 || ^7.3.0" }, "suggest": { - "ext-dom": "Required to use the XMLConverter and or the HTMLConverter classes", - "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters" + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" }, "type": "library", "extra": { @@ -3599,27 +3771,30 @@ "type": "github" } ], - "time": "2022-01-04T00:13:07+00:00" + "time": "2025-06-25T14:53:51+00:00" }, { "name": "league/flysystem", - "version": "3.12.2", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f" + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f6377c709d2275ed6feaf63e44be7a7162b0e77f", - "reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", "shasum": "" }, "require": { + "league/flysystem-local": "^3.0.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", "aws/aws-sdk-php": "3.209.31 || 3.210.0", "guzzlehttp/guzzle": "<7.0", "guzzlehttp/ringphp": "<1.1.1", @@ -3627,20 +3802,23 @@ "symfony/http-client": "<5.2" }, "require-dev": { - "async-aws/s3": "^1.5", - "async-aws/simple-s3": "^1.1", - "aws/aws-sdk-php": "^3.220.0", + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "phpseclib/phpseclib": "^3.0.14", - "phpstan/phpstan": "^0.12.26", - "phpunit/phpunit": "^9.5.11", - "sabre/dav": "^4.3.1" + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" }, "type": "library", "autoload": { @@ -3674,40 +3852,26 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.12.2" + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2023-01-19T12:02:19+00:00" + "time": "2025-06-25T13:29:59+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.12.2", + "version": "3.29.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "645e14e4a80bd2da8b01e57388e7296a695a80c2" + "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/645e14e4a80bd2da8b01e57388e7296a695a80c2", - "reference": "645e14e4a80bd2da8b01e57388e7296a695a80c2", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/c6ff6d4606e48249b63f269eba7fabdb584e76a9", + "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9", "shasum": "" }, "require": { - "aws/aws-sdk-php": "^3.220.0", + "aws/aws-sdk-php": "^3.295.10", "league/flysystem": "^3.10.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" @@ -3743,47 +3907,81 @@ "storage" ], "support": { - "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.12.2" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.29.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, + "time": "2024-08-17T13:10:48+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.30.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "time": "2023-01-17T14:15:08+00:00" + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" + }, + "time": "2025-05-21T10:34:19+00:00" }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -3804,7 +4002,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { @@ -3816,32 +4014,32 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { "name": "mariuzzo/laravel-js-localization", - "version": "v1.9.0", + "version": "v1.11.2", "source": { "type": "git", "url": "https://github.com/rmariuzzo/Laravel-JS-Localization.git", - "reference": "12531672e995296e280378251efb37f3d1285693" + "reference": "1ea310be42d3a4f09c38a0d97b8d5bd4683c7026" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rmariuzzo/Laravel-JS-Localization/zipball/12531672e995296e280378251efb37f3d1285693", - "reference": "12531672e995296e280378251efb37f3d1285693", + "url": "https://api.github.com/repos/rmariuzzo/Laravel-JS-Localization/zipball/1ea310be42d3a4f09c38a0d97b8d5bd4683c7026", + "reference": "1ea310be42d3a4f09c38a0d97b8d5bd4683c7026", "shasum": "" }, "require": { - "illuminate/config": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/console": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/filesystem": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/config": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/console": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/filesystem": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", "php": "^5.4 || ^7.0 || ^8.0", "tedivm/jshrink": "~1.0" }, "require-dev": { - "orchestra/testbench": "^2.2 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + "orchestra/testbench": "^2.2 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0" }, "type": "library", "extra": { @@ -3909,29 +4107,29 @@ "issues": "https://github.com/rmariuzzo/laravel-js-localization/issues", "source": "https://github.com/rmariuzzo/laravel-js-localization" }, - "time": "2022-02-09T09:35:03+00:00" + "time": "2024-12-24T15:43:00+00:00" }, { "name": "mcamara/laravel-localization", - "version": "v1.7.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/mcamara/laravel-localization.git", - "reference": "27565315c585e90d8d93aa06afd49d6a5992fe5a" + "reference": "af91f489f518fb1907944de8622a19266159d28f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mcamara/laravel-localization/zipball/27565315c585e90d8d93aa06afd49d6a5992fe5a", - "reference": "27565315c585e90d8d93aa06afd49d6a5992fe5a", + "url": "https://api.github.com/repos/mcamara/laravel-localization/zipball/af91f489f518fb1907944de8622a19266159d28f", + "reference": "af91f489f518fb1907944de8622a19266159d28f", "shasum": "" }, "require": { - "laravel/framework": "~5.2.0||~5.3.0||~5.4.0||~5.5.0||~5.6.0||~5.7.0||~5.8.0||^6.0||^7.0||^8.0||^9.0", - "php": ">=7.1.0" + "laravel/framework": "^10.0|^11.0|^12.0", + "php": "^8.2" }, "require-dev": { - "orchestra/testbench-browser-kit": "~3.4|~3.8|~4.0", - "phpunit/phpunit": "6.0.*|^8.0" + "orchestra/testbench-browser-kit": "^8.5|^9.0|^10.0", + "phpunit/phpunit": "^10.1|^11.0" }, "suggest": { "ext-intl": "*" @@ -3939,12 +4137,12 @@ "type": "library", "extra": { "laravel": { - "providers": [ - "Mcamara\\LaravelLocalization\\LaravelLocalizationServiceProvider" - ], "aliases": { "LaravelLocalization": "Mcamara\\LaravelLocalization\\Facades\\LaravelLocalization" - } + }, + "providers": [ + "Mcamara\\LaravelLocalization\\LaravelLocalizationServiceProvider" + ] } }, "autoload": { @@ -3973,7 +4171,7 @@ ], "support": { "issues": "https://github.com/mcamara/laravel-localization/issues", - "source": "https://github.com/mcamara/laravel-localization/tree/v1.7.0" + "source": "https://github.com/mcamara/laravel-localization/tree/v2.3.0" }, "funding": [ { @@ -3985,27 +4183,87 @@ "type": "github" } ], - "time": "2022-01-26T10:27:45+00:00" + "time": "2025-02-26T06:38:01+00:00" + }, + { + "name": "mediawiki/oauthclient", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/mediawiki-oauthclient-php.git", + "reference": "15e81485ecd3566c5fddee23bcbdd9dd93c7886b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/mediawiki-oauthclient-php/zipball/15e81485ecd3566c5fddee23bcbdd9dd93c7886b", + "reference": "15e81485ecd3566c5fddee23bcbdd9dd93c7886b", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=7.4", + "psr/log": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "47.0.0", + "mediawiki/minus-x": "1.1.3", + "php-parallel-lint/php-console-highlighter": "1.0.0", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpunit/phpunit": "9.6.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "MediaWiki\\OAuthClient\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Andy Smith", + "homepage": "http://termie.pbworks.com/w/page/20571888/AndySmith" + }, + { + "name": "Chris Steipp", + "email": "csteipp@wikimedia.org" + }, + { + "name": "Bryan Davis", + "email": "bd808@wikimedia.org" + } + ], + "description": "PHP OAuth client for use with Wikipedia and other MediaWiki-based wikis running the OAuth extension", + "homepage": "https://www.mediawiki.org/wiki/oauthclient-php", + "support": { + "docs": "https://www.mediawiki.org/wiki/oauthclient-php", + "issues": "https://phabricator.wikimedia.org/tag/oauth/", + "source": "https://github.com/wikimedia/oauthclient-php/" + }, + "time": "2025-07-08T12:43:45+00:00" }, { "name": "mobiledetect/mobiledetectlib", - "version": "2.8.41", + "version": "2.8.45", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1" + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", - "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266", "shasum": "" }, "require": { "php": ">=5.0.0" }, "require-dev": { - "phpunit/phpunit": "~4.8.35||~5.7" + "phpunit/phpunit": "~4.8.36" }, "type": "library", "autoload": { @@ -4039,48 +4297,55 @@ ], "support": { "issues": "https://github.com/serbanghita/Mobile-Detect/issues", - "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.41" + "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.45" }, - "time": "2022-11-08T18:31:26+00:00" + "funding": [ + { + "url": "https://github.com/serbanghita", + "type": "github" + } + ], + "time": "2023-11-07T21:57:25+00:00" }, { "name": "monolog/monolog", - "version": "2.8.0", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", - "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -4103,7 +4368,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -4131,7 +4396,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" }, "funding": [ { @@ -4143,41 +4408,41 @@ "type": "tidelift" } ], - "time": "2022-07-24T11:55:47+00:00" + "time": "2025-03-24T10:02:05+00:00" }, { "name": "msurguy/honeypot", - "version": "1.1.7", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/msurguy/Honeypot.git", - "reference": "6e0d37201f936a8d8f3e2825dc038666d140fcd7" + "reference": "fedc19a7e863529d053e25199ffed0906218fc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/msurguy/Honeypot/zipball/6e0d37201f936a8d8f3e2825dc038666d140fcd7", - "reference": "6e0d37201f936a8d8f3e2825dc038666d140fcd7", + "url": "https://api.github.com/repos/msurguy/Honeypot/zipball/fedc19a7e863529d053e25199ffed0906218fc85", + "reference": "fedc19a7e863529d053e25199ffed0906218fc85", "shasum": "" }, "require": { - "illuminate/config": "4.*|5.*|6.*|7.*|8.*|9.*", - "illuminate/support": "4.*|5.*|6.*|7.*|8.*|9.*", - "illuminate/translation": "4.*|5.*|6.*|7.*|8.*|9.*", + "illuminate/config": "4.*|5.*|6.*|7.*|8.*|9.*|^10.0|^11.0|^12.0", + "illuminate/support": "4.*|5.*|6.*|7.*|8.*|9.*|^10.0|^11.0|^12.0", + "illuminate/translation": "4.*|5.*|6.*|7.*|8.*|9.*|^10.0|^11.0|^12.0", "php": ">=5.3.0" }, "require-dev": { - "mockery/mockery": "0.9.*", - "phpunit/phpunit": "4.0.*" + "mockery/mockery": "0.9.*|^1.4.4", + "phpunit/phpunit": "4.0.*|^9.5.10|^10.5" }, "type": "library", "extra": { "laravel": { - "providers": [ - "Msurguy\\Honeypot\\HoneypotServiceProvider" - ], "aliases": { "Honeypot": "Msurguy\\Honeypot\\HoneypotFacade" - } + }, + "providers": [ + "Msurguy\\Honeypot\\HoneypotServiceProvider" + ] } }, "autoload": { @@ -4204,22 +4469,22 @@ ], "support": { "issues": "https://github.com/msurguy/Honeypot/issues", - "source": "https://github.com/msurguy/Honeypot/tree/1.1.7" + "source": "https://github.com/msurguy/Honeypot/tree/1.4.0" }, - "time": "2022-02-14T17:19:26+00:00" + "time": "2025-02-20T06:19:17+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", "shasum": "" }, "require": { @@ -4236,7 +4501,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { @@ -4270,37 +4535,42 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" }, - "time": "2023-08-25T10:54:48+00:00" + "time": "2024-09-04T18:46:31+00:00" }, { "name": "nesbot/carbon", - "version": "2.65.0", + "version": "2.73.0", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "09acf64155c16dc6f580f36569ae89344e9734a3" + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/09acf64155c16dc6f580f36569ae89344e9734a3", - "reference": "09acf64155c16dc6f580f36569ae89344e9734a3", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075", "shasum": "" }, "require": { + "carbonphp/carbon-doctrine-types": "*", "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "psr/clock-implementation": "1.0" + }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4", - "doctrine/orm": "^2.7", + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", - "ondrejmirtes/better-reflection": "*", + "ondrejmirtes/better-reflection": "<6", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^0.12.99 || ^1.7.14", @@ -4313,10 +4583,6 @@ ], "type": "library", "extra": { - "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" - }, "laravel": { "providers": [ "Carbon\\Laravel\\ServiceProvider" @@ -4326,6 +4592,10 @@ "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" } }, "autoload": { @@ -4374,7 +4644,7 @@ "type": "tidelift" } ], - "time": "2023-01-06T15:55:01+00:00" + "time": "2025-01-08T20:10:23+00:00" }, { "name": "nette/schema", @@ -4440,29 +4710,29 @@ }, { "name": "nette/utils", - "version": "v4.0.5", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", - "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", "shasum": "" }, "require": { - "php": "8.0 - 8.4" + "php": "8.0 - 8.5" }, "conflict": { "nette/finder": "<3", "nette/schema": "<1.2.2" }, "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", + "jetbrains/phpstorm-attributes": "^1.2", "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", + "phpstan/phpstan-nette": "^2.0@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -4480,6 +4750,9 @@ } }, "autoload": { + "psr-4": { + "Nette\\": "src" + }, "classmap": [ "src/" ] @@ -4520,31 +4793,33 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.5" + "source": "https://github.com/nette/utils/tree/v4.0.8" }, - "time": "2024-08-07T15:39:19+00:00" + "time": "2025-08-06T21:43:34+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.3", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -4552,7 +4827,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -4576,39 +4851,38 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" }, - "time": "2023-01-16T22:05:37+00:00" + "time": "2025-08-13T20:13:15+00:00" }, { "name": "nunomaduro/termwind", - "version": "v1.15.0", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d" + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/594ab862396c16ead000de0c3c38f4a5cbe1938d", - "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/5369ef84d8142c1d87e4ec278711d4ece3cbf301", + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" - }, - "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", + "php": "^8.1", + "symfony/console": "^6.4.15" + }, + "require-dev": { + "illuminate/console": "^10.48.24", + "illuminate/support": "^10.48.24", + "laravel/pint": "^1.18.2", + "pestphp/pest": "^2.36.0", + "pestphp/pest-plugin-mock": "2.0.0", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^6.4.15", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -4648,7 +4922,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.0" + "source": "https://github.com/nunomaduro/termwind/tree/v1.17.0" }, "funding": [ { @@ -4664,20 +4938,20 @@ "type": "github" } ], - "time": "2022-12-20T19:00:15+00:00" + "time": "2024-11-21T10:36:35+00:00" }, { "name": "nyholm/psr7", - "version": "1.8.0", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { @@ -4730,7 +5004,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.0" + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { @@ -4742,47 +5016,47 @@ "type": "github" } ], - "time": "2023-05-02T11:26:24+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { "name": "owen-it/laravel-auditing", - "version": "v12.2.1", + "version": "v13.7.2", "source": { "type": "git", "url": "https://github.com/owen-it/laravel-auditing.git", - "reference": "98f1cfddbc4ed257e5644fe02e97db5674c7571a" + "reference": "4f72181622683bc667bbdd2e5fa09cd376329af4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/98f1cfddbc4ed257e5644fe02e97db5674c7571a", - "reference": "98f1cfddbc4ed257e5644fe02e97db5674c7571a", + "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/4f72181622683bc667bbdd2e5fa09cd376329af4", + "reference": "4f72181622683bc667bbdd2e5fa09cd376329af4", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^6.0|^7.0|^8.0|^9.0", - "illuminate/database": "^6.0|^7.0|^8.0|^9.0", - "illuminate/filesystem": "^6.0|^7.0|^8.0|^9.0", + "illuminate/console": "^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/database": "^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/filesystem": "^7.0|^8.0|^9.0|^10.0|^11.0", "php": "^7.3|^8.0" }, "require-dev": { "laravel/legacy-factories": "*", "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0", - "phpunit/phpunit": "^9.0" + "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0|^9.0", + "phpunit/phpunit": "^9.6|^10.5|^11.0" }, "suggest": { - "laravelista/lumen-vendor-publish": "Needed to publish the package configuration in Lumen" + "irazasyed/larasupport": "Needed to publish the package configuration in Lumen" }, "type": "package", "extra": { - "branch-alias": { - "dev-master": "v13-dev" - }, "laravel": { "providers": [ "OwenIt\\Auditing\\AuditingServiceProvider" ] + }, + "branch-alias": { + "dev-master": "v13-dev" } }, "autoload": { @@ -4802,10 +5076,14 @@ { "name": "Raphael França", "email": "raphaelfrancabsb@gmail.com" + }, + { + "name": "Morten D. Hansen", + "email": "morten@visia.dk" } ], "description": "Audit changes of your Eloquent models in Laravel/Lumen", - "homepage": "http://laravel-auditing.com", + "homepage": "https://laravel-auditing.com", "keywords": [ "Accountability", "Audit", @@ -4826,31 +5104,30 @@ "issues": "https://github.com/owen-it/laravel-auditing/issues", "source": "https://github.com/owen-it/laravel-auditing" }, - "time": "2022-02-22T13:39:06+00:00" + "time": "2025-02-21T14:58:02+00:00" }, { "name": "php-http/client-common", - "version": "2.6.0", + "version": "2.7.2", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0" + "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/45db684cd4e186dcdc2b9c06b22970fe123796c0", - "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0", + "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46", + "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "php-http/httplug": "^2.0", "php-http/message": "^1.6", - "php-http/message-factory": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", "symfony/polyfill-php80": "^1.17" }, "require-dev": { @@ -4859,7 +5136,7 @@ "nyholm/psr7": "^1.2", "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" }, "suggest": { "ext-json": "To detect JSON responses with the ContentTypePlugin", @@ -4869,11 +5146,6 @@ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\Common\\": "src/" @@ -4899,33 +5171,33 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.6.0" + "source": "https://github.com/php-http/client-common/tree/2.7.2" }, - "time": "2022-09-29T09:59:43+00:00" + "time": "2024-09-24T06:21:48+00:00" }, { "name": "php-http/curl-client", - "version": "2.2.1", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/php-http/curl-client.git", - "reference": "2ed4245a817d859dd0c1d51c7078cdb343cf5233" + "reference": "f3eb48d266341afec0229a7a37a03521d3646b81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/curl-client/zipball/2ed4245a817d859dd0c1d51c7078cdb343cf5233", - "reference": "2ed4245a817d859dd0c1d51c7078cdb343cf5233", + "url": "https://api.github.com/repos/php-http/curl-client/zipball/f3eb48d266341afec0229a7a37a03521d3646b81", + "reference": "f3eb48d266341afec0229a7a37a03521d3646b81", "shasum": "" }, "require": { "ext-curl": "*", - "php": "^7.1 || ^8.0", + "php": "^7.4 || ^8.0", "php-http/discovery": "^1.6", "php-http/httplug": "^2.0", "php-http/message": "^1.2", "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "symfony/options-resolver": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "psr/http-factory-implementation": "^1.0", + "symfony/options-resolver": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "provide": { "php-http/async-client-implementation": "1.0", @@ -4933,17 +5205,13 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "guzzlehttp/psr7": "^1.0", - "laminas/laminas-diactoros": "^2.0", + "guzzlehttp/psr7": "^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", "php-http/client-integration-tests": "^3.0", + "php-http/message-factory": "^1.1", "phpunit/phpunit": "^7.5 || ^9.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\Curl\\": "src/" @@ -4968,49 +5236,60 @@ ], "support": { "issues": "https://github.com/php-http/curl-client/issues", - "source": "https://github.com/php-http/curl-client/tree/2.2.1" + "source": "https://github.com/php-http/curl-client/tree/2.3.3" }, - "time": "2021-12-10T18:02:07+00:00" + "time": "2024-10-31T07:36:58+00:00" }, { "name": "php-http/discovery", - "version": "1.14.3", + "version": "1.20.0", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735" + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/31d8ee46d0215108df16a8527c7438e96a4d7735", - "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", "shasum": "" }, "require": { + "composer-plugin-api": "^1.0|^2.0", "php": "^7.1 || ^8.0" }, "conflict": { - "nyholm/psr7": "<1.0" + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" }, "require-dev": { + "composer/composer": "^1.0.2|^2.0", "graham-campbell/phpspec-skip-example-extension": "^5.0", "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1" - }, - "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, - "type": "library", + "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, "autoload": { "psr-4": { "Http\\Discovery\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5022,7 +5301,7 @@ "email": "mark.sagikazar@gmail.com" } ], - "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", "homepage": "http://php-http.org", "keywords": [ "adapter", @@ -5031,44 +5310,40 @@ "factory", "http", "message", + "psr17", "psr7" ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.14.3" + "source": "https://github.com/php-http/discovery/tree/1.20.0" }, - "time": "2022-07-11T14:04:40+00:00" + "time": "2024-10-02T11:20:13+00:00" }, { "name": "php-http/httplug", - "version": "2.3.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "f640739f80dfa1152533976e3c112477f69274eb" + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb", - "reference": "f640739f80dfa1152533976e3c112477f69274eb", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "php-http/promise": "^1.1", "psr/http-client": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1", - "phpspec/phpspec": "^5.1 || ^6.0" + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\": "src/" @@ -5097,29 +5372,28 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.3.0" + "source": "https://github.com/php-http/httplug/tree/2.4.1" }, - "time": "2022-02-21T09:52:22+00:00" + "time": "2024-09-23T11:39:58+00:00" }, { "name": "php-http/message", - "version": "1.13.0", + "version": "1.16.2", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361" + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/7886e647a30a966a1a8d1dad1845b71ca8678361", - "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361", + "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", "shasum": "" }, "require": { "clue/stream-filter": "^1.5", - "php": "^7.1 || ^8.0", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0" + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" }, "provide": { "php-http/message-factory-implementation": "1.0" @@ -5127,8 +5401,9 @@ "require-dev": { "ergebnis/composer-normalize": "^2.6", "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0", - "laminas/laminas-diactoros": "^2.0", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "slim/slim": "^3.0" }, @@ -5139,11 +5414,6 @@ "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { "files": [ "src/filters.php" @@ -5171,9 +5441,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.13.0" + "source": "https://github.com/php-http/message/tree/1.16.2" }, - "time": "2022-02-11T13:41:14+00:00" + "time": "2024-10-02T11:34:13+00:00" }, { "name": "php-http/message-factory", @@ -5227,35 +5497,31 @@ "issues": "https://github.com/php-http/message-factory/issues", "source": "https://github.com/php-http/message-factory/tree/1.1.0" }, + "abandoned": "psr/http-factory", "time": "2023-04-14T14:16:17+00:00" }, { "name": "php-http/promise", - "version": "1.1.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { "Http\\Promise\\": "src/" @@ -5282,36 +5548,36 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2020-07-07T09:29:14+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { "name": "phpoption/phpoption", - "version": "1.9.0", + "version": "1.9.4", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8", - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { "dev-master": "1.9-dev" @@ -5347,7 +5613,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" }, "funding": [ { @@ -5359,34 +5625,78 @@ "type": "tidelift" } ], - "time": "2022-07-30T15:51:26+00:00" + "time": "2025-08-21T11:53:16+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": "^7.0 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5399,16 +5709,20 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for caching libraries", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", "keywords": [ - "cache", + "clock", + "now", "psr", - "psr-6" + "psr-20", + "time" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { "name": "psr/container", @@ -5567,20 +5881,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -5604,7 +5918,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -5616,9 +5930,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -5675,30 +5989,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5719,9 +6033,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", @@ -5776,25 +6090,25 @@ }, { "name": "psy/psysh", - "version": "v0.11.10", + "version": "v0.12.10", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "e9eadffbed9c9deb5426fd107faae0452bf20a36" + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e9eadffbed9c9deb5426fd107faae0452bf20a36", - "reference": "e9eadffbed9c9deb5426fd107faae0452bf20a36", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", "shasum": "" }, "require": { "ext-json": "*", "ext-tokenizer": "*", - "nikic/php-parser": "^4.0 || ^3.1", - "php": "^8.0 || ^7.0.8", - "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", - "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" }, "conflict": { "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" @@ -5805,16 +6119,19 @@ "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, "bin": [ "bin/psysh" ], "type": "library", "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, "branch-alias": { - "dev-main": "0.11.x-dev" + "dev-main": "0.12.x-dev" } }, "autoload": { @@ -5832,12 +6149,11 @@ "authors": [ { "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" + "email": "justin@justinhileman.info" } ], "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", + "homepage": "https://psysh.org", "keywords": [ "REPL", "console", @@ -5846,9 +6162,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.10" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" }, - "time": "2022-12-23T17:47:18+00:00" + "time": "2025-08-04T12:39:37+00:00" }, { "name": "ralouphie/getallheaders", @@ -5896,16 +6212,16 @@ }, { "name": "ramsey/collection", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -5913,25 +6229,22 @@ }, "require-dev": { "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { @@ -5969,37 +6282,26 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", - "version": "4.7.3", + "version": "4.9.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "433b2014e3979047db08a17a205f410ba3869cf2" + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", - "reference": "433b2014e3979047db08a17a205f410ba3869cf2", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10", - "ext-json": "*", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -6007,26 +6309,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -6061,47 +6360,35 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.3" + "source": "https://github.com/ramsey/uuid/tree/4.9.0" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2023-01-12T18:13:24+00:00" + "time": "2025-06-25T14:20:11+00:00" }, { "name": "rennokki/laravel-eloquent-query-cache", - "version": "3.3.1", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/renoki-co/laravel-eloquent-query-cache.git", - "reference": "b0814fec43dd82f718fd10c4b0a2c1e25e7705fb" + "reference": "48e612b3e3fb1358f734f7742385b4853481a368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/renoki-co/laravel-eloquent-query-cache/zipball/b0814fec43dd82f718fd10c4b0a2c1e25e7705fb", - "reference": "b0814fec43dd82f718fd10c4b0a2c1e25e7705fb", + "url": "https://api.github.com/repos/renoki-co/laravel-eloquent-query-cache/zipball/48e612b3e3fb1358f734f7742385b4853481a368", + "reference": "48e612b3e3fb1358f734f7742385b4853481a368", "shasum": "" }, "require": { - "illuminate/database": "^8.83|^9.35", - "illuminate/support": "^8.83|^9.35" + "illuminate/database": "^10.5|^11.33|^12.0", + "illuminate/support": "^10.5|^11.33|^12.0" }, "require-dev": { - "chelout/laravel-relationship-events": "^1.5", - "laravel/legacy-factories": "^1.3", - "livewire/livewire": "dev-master", - "mockery/mockery": "^1.5", - "orchestra/database": "^6.28|^7.0", - "orchestra/testbench": "^6.28|^7.0", - "orchestra/testbench-core": "^6.28|^7.0", - "phpunit/phpunit": "^9.5.25" + "chelout/laravel-relationship-events": "^1.5|^2.0|^3.0", + "laravel/legacy-factories": "^1.4", + "livewire/livewire": "dev-main", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^8.1.1|^9|^10.0", + "phpunit/phpunit": "^9.5.25|^10|^11" }, "type": "library", "autoload": { @@ -6133,7 +6420,7 @@ ], "support": { "issues": "https://github.com/renoki-co/laravel-eloquent-query-cache/issues", - "source": "https://github.com/renoki-co/laravel-eloquent-query-cache/tree/3.3.1" + "source": "https://github.com/renoki-co/laravel-eloquent-query-cache/tree/3.6.1" }, "funding": [ { @@ -6141,26 +6428,26 @@ "type": "github" } ], - "time": "2022-11-13T18:49:44+00:00" + "time": "2025-03-18T07:43:34+00:00" }, { "name": "sentry/sdk", - "version": "3.3.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php-sdk.git", - "reference": "d0678fc7274dbb03046ed05cb24eb92945bedf8e" + "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/d0678fc7274dbb03046ed05cb24eb92945bedf8e", - "reference": "d0678fc7274dbb03046ed05cb24eb92945bedf8e", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/24c235ff2027401cbea099bf88689e1a1f197c7a", + "reference": "24c235ff2027401cbea099bf88689e1a1f197c7a", "shasum": "" }, "require": { "http-interop/http-factory-guzzle": "^1.0", - "sentry/sentry": "^3.9", - "symfony/http-client": "^4.3|^5.0|^6.0" + "sentry/sentry": "^3.22", + "symfony/http-client": "^4.3|^5.0|^6.0|^7.0" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -6186,7 +6473,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php-sdk/issues", - "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.3.0" + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.6.0" }, "funding": [ { @@ -6198,38 +6485,38 @@ "type": "custom" } ], - "time": "2022-10-11T09:05:00+00:00" + "time": "2023-12-04T10:49:33+00:00" }, { "name": "sentry/sentry", - "version": "3.12.1", + "version": "3.22.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "155bb9b78438999de4529d6f051465be15a58bc5" + "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/155bb9b78438999de4529d6f051465be15a58bc5", - "reference": "155bb9b78438999de4529d6f051465be15a58bc5", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", + "reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.8.4|^2.1.1", + "guzzlehttp/promises": "^1.5.3|^2.0", "jean85/pretty-package-versions": "^1.5|^2.0.4", "php": "^7.2|^8.0", "php-http/async-client-implementation": "^1.0", "php-http/client-common": "^1.5|^2.0", - "php-http/discovery": "^1.11", + "php-http/discovery": "^1.15", "php-http/httplug": "^1.1|^2.0", "php-http/message": "^1.5", + "php-http/message-factory": "^1.1", "psr/http-factory": "^1.0", - "psr/http-message-implementation": "^1.0", + "psr/http-factory-implementation": "^1.0", "psr/log": "^1.0|^2.0|^3.0", - "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", + "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0|^7.0", "symfony/polyfill-php80": "^1.17" }, "conflict": { @@ -6238,6 +6525,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.19|3.4.*", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", "http-interop/http-factory-guzzle": "^1.0", "monolog/monolog": "^1.6|^2.0|^3.0", "nikic/php-parser": "^4.10.3", @@ -6254,11 +6542,6 @@ "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.12.x-dev" - } - }, "autoload": { "files": [ "src/functions.php" @@ -6269,7 +6552,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { @@ -6290,7 +6573,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.12.1" + "source": "https://github.com/getsentry/sentry-php/tree/3.22.1" }, "funding": [ { @@ -6302,51 +6585,55 @@ "type": "custom" } ], - "time": "2023-01-12T12:24:27+00:00" + "time": "2023-11-13T11:47:28+00:00" }, { "name": "sentry/sentry-laravel", - "version": "2.14.2", + "version": "3.8.2", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "4538ed31d77868dd3b6d72ad6e5e68b572beeb9f" + "reference": "1293e5732f8405e12f000cdf5dee78c927a18de0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/4538ed31d77868dd3b6d72ad6e5e68b572beeb9f", - "reference": "4538ed31d77868dd3b6d72ad6e5e68b572beeb9f", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/1293e5732f8405e12f000cdf5dee78c927a18de0", + "reference": "1293e5732f8405e12f000cdf5dee78c927a18de0", "shasum": "" }, "require": { - "illuminate/support": "5.0 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0", + "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "nyholm/psr7": "^1.0", "php": "^7.2 | ^8.0", - "sentry/sdk": "^3.1", - "sentry/sentry": "^3.3", + "sentry/sdk": "^3.4", + "sentry/sentry": "^3.20.1", "symfony/psr-http-message-bridge": "^1.0 | ^2.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.11", - "laravel/framework": "5.0 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0", + "laravel/folio": "^1.0", + "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "mockery/mockery": "^1.3", - "orchestra/testbench": "3.1 - 3.8 | ^4.7 | ^5.1 | ^6.0 | ^7.0", - "phpunit/phpunit": "^5.7 | ^6.5 | ^7.5 | ^8.4 | ^9.3" + "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.4 | ^9.3" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.x-dev", - "dev-0.x": "0.x-dev" - }, "laravel": { + "aliases": { + "Sentry": "Sentry\\Laravel\\Facade" + }, "providers": [ "Sentry\\Laravel\\ServiceProvider", "Sentry\\Laravel\\Tracing\\ServiceProvider" - ], - "aliases": { - "Sentry": "Sentry\\Laravel\\Facade" - } + ] + }, + "branch-alias": { + "dev-0.x": "0.x-dev", + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" } }, "autoload": { @@ -6356,7 +6643,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { @@ -6378,7 +6665,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/2.14.2" + "source": "https://github.com/getsentry/sentry-laravel/tree/3.8.2" }, "funding": [ { @@ -6390,7 +6677,7 @@ "type": "custom" } ], - "time": "2022-10-13T09:21:29+00:00" + "time": "2023-10-12T14:38:46+00:00" }, { "name": "soundasleep/html2text", @@ -6449,26 +6736,26 @@ }, { "name": "spatie/calendar-links", - "version": "1.8.2", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/spatie/calendar-links.git", - "reference": "f632ac06599e9ed6cb60a9f85f30e08c5a384248" + "reference": "bf4645d6a2d8eb32248a5b0b7da7976a13e5e2b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/calendar-links/zipball/f632ac06599e9ed6cb60a9f85f30e08c5a384248", - "reference": "f632ac06599e9ed6cb60a9f85f30e08c5a384248", + "url": "https://api.github.com/repos/spatie/calendar-links/zipball/bf4645d6a2d8eb32248a5b0b7da7976a13e5e2b5", + "reference": "bf4645d6a2d8eb32248a5b0b7da7976a13e5e2b5", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.1" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.13", - "phpunit/phpunit": "^9.5", - "spatie/phpunit-snapshot-assertions": "^4.2", - "vimeo/psalm": "^5.0" + "friendsofphp/php-cs-fixer": "^3.49", + "phpunit/phpunit": "^10.5", + "spatie/phpunit-snapshot-assertions": "^5.1", + "vimeo/psalm": "^5.22" }, "type": "library", "autoload": { @@ -6496,7 +6783,7 @@ ], "support": { "issues": "https://github.com/spatie/calendar-links/issues", - "source": "https://github.com/spatie/calendar-links/tree/1.8.2" + "source": "https://github.com/spatie/calendar-links/tree/1.11.1" }, "funding": [ { @@ -6504,32 +6791,32 @@ "type": "custom" } ], - "time": "2022-12-11T03:02:19+00:00" + "time": "2025-01-16T16:49:47+00:00" }, { "name": "spatie/laravel-validation-rules", - "version": "3.4.0", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/spatie/laravel-validation-rules.git", - "reference": "b629b0a1049ddfe18e5534717b1627bacfaef208" + "reference": "45d1fb21a8480a359c2a58124d9adf44b40c84ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-validation-rules/zipball/b629b0a1049ddfe18e5534717b1627bacfaef208", - "reference": "b629b0a1049ddfe18e5534717b1627bacfaef208", + "url": "https://api.github.com/repos/spatie/laravel-validation-rules/zipball/45d1fb21a8480a359c2a58124d9adf44b40c84ca", + "reference": "45d1fb21a8480a359c2a58124d9adf44b40c84ca", "shasum": "" }, "require": { - "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^8.0" }, "require-dev": { "laravel/pint": "^1.3", "league/iso3166": "^3.0|^4.3", "myclabs/php-enum": "^1.6", - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0", - "pestphp/pest": "^1.23|^2.6", + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", + "pestphp/pest": "^1.23|^2.6|^3.7", "spatie/enum": "^2.2|^3.0" }, "suggest": { @@ -6569,7 +6856,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-validation-rules/issues", - "source": "https://github.com/spatie/laravel-validation-rules/tree/3.4.0" + "source": "https://github.com/spatie/laravel-validation-rules/tree/3.4.3" }, "funding": [ { @@ -6577,37 +6864,36 @@ "type": "github" } ], - "time": "2024-03-02T05:57:47+00:00" + "time": "2025-02-25T18:35:57+00:00" }, { "name": "spinen/laravel-discourse-sso", - "version": "2.7.0", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/spinen/laravel-discourse-sso.git", - "reference": "1246acb95cd437d3f3387e8ad5c9838b0036d286" + "reference": "f9f21e784789513664cf0deef8d99ed38912feec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spinen/laravel-discourse-sso/zipball/1246acb95cd437d3f3387e8ad5c9838b0036d286", - "reference": "1246acb95cd437d3f3387e8ad5c9838b0036d286", + "url": "https://api.github.com/repos/spinen/laravel-discourse-sso/zipball/f9f21e784789513664cf0deef8d99ed38912feec", + "reference": "f9f21e784789513664cf0deef8d99ed38912feec", "shasum": "" }, "require": { "cviebrock/discourse-php": "^0.9.3", - "ext-json": "*", - "guzzlehttp/guzzle": "^6.4|^7.0.1|^7.2", - "illuminate/auth": "~5.5|~6|~7|~8|~9", - "illuminate/routing": "~5.5|~6|~7|~8|~9", - "illuminate/support": "~5.5|~6|~7|~8|~9", - "php": ">=7.2" + "guzzlehttp/guzzle": "^7.4.5", + "illuminate/auth": "~8|~9|~10|~11", + "illuminate/routing": "~8|~9|~10|~11", + "illuminate/support": "~8|~9|~10|~11", + "php": ">=8.1" }, "require-dev": { - "mockery/mockery": "^1.3.1", - "phpunit/phpunit": "^8.4|^9.0", - "psy/psysh": "^0.10", - "symfony/thanks": "^1.1", - "symfony/var-dumper": "~3.0|^4.2|^6" + "laravel/sail": "^1.21", + "mockery/mockery": "^1.5.1", + "phpunit/phpunit": "^9.6.5", + "psy/psysh": "^0.11.1", + "symfony/var-dumper": "^6.2" }, "type": "library", "extra": { @@ -6647,22 +6933,22 @@ ], "support": { "issues": "https://github.com/spinen/laravel-discourse-sso/issues", - "source": "https://github.com/spinen/laravel-discourse-sso/tree/2.7.0" + "source": "https://github.com/spinen/laravel-discourse-sso/tree/2.9.1" }, - "time": "2022-02-19T15:01:34+00:00" + "time": "2024-04-14T21:40:02+00:00" }, { "name": "swagger-api/swagger-ui", - "version": "v4.15.5", + "version": "v5.28.0", "source": { "type": "git", "url": "https://github.com/swagger-api/swagger-ui.git", - "reference": "118ea1329c0948f4f7d5aa6a7776a11c84df5b13" + "reference": "01e23904eec6075e032e07f3235607b463d9ecf3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/118ea1329c0948f4f7d5aa6a7776a11c84df5b13", - "reference": "118ea1329c0948f4f7d5aa6a7776a11c84df5b13", + "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/01e23904eec6075e032e07f3235607b463d9ecf3", + "reference": "01e23904eec6075e032e07f3235607b463d9ecf3", "shasum": "" }, "type": "library", @@ -6708,30 +6994,30 @@ ], "support": { "issues": "https://github.com/swagger-api/swagger-ui/issues", - "source": "https://github.com/swagger-api/swagger-ui/tree/v4.15.5" + "source": "https://github.com/swagger-api/swagger-ui/tree/v5.28.0" }, - "time": "2022-11-09T06:53:40+00:00" + "time": "2025-08-28T13:24:41+00:00" }, { "name": "symfony/console", - "version": "v6.2.3", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0f579613e771dba2dbb8211c382342a641f5da06" + "reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0f579613e771dba2dbb8211c382342a641f5da06", - "reference": "0f579613e771dba2dbb8211c382342a641f5da06", + "url": "https://api.github.com/repos/symfony/console/zipball/273fd29ff30ba0a88ca5fb83f7cf1ab69306adae", + "reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.4|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/dependency-injection": "<5.4", @@ -6745,18 +7031,16 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6785,12 +7069,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.3" + "source": "https://github.com/symfony/console/tree/v6.4.25" }, "funding": [ { @@ -6801,29 +7085,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-28T14:26:22+00:00" + "time": "2025-08-22T10:21:53+00:00" }, { "name": "symfony/css-selector", - "version": "v6.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ab1df4ba3ded7b724766ba3a6e0eca0418e74f80" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab1df4ba3ded7b724766ba3a6e0eca0418e74f80", - "reference": "ab1df4ba3ded7b724766ba3a6e0eca0418e74f80", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -6855,7 +7143,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.2.3" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -6871,20 +7159,20 @@ "type": "tidelift" } ], - "time": "2022-12-28T14:26:22+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -6892,12 +7180,12 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -6922,7 +7210,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -6938,31 +7226,35 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/error-handler", - "version": "v6.2.5", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "0092696af0be8e6124b042fbe2890ca1788d7b28" + "reference": "30fd0b3cf0e972e82636038ce4db0e4fe777112c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/0092696af0be8e6124b042fbe2890ca1788d7b28", - "reference": "0092696af0be8e6124b042fbe2890ca1788d7b28", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/30fd0b3cf0e972e82636038ce4db0e4fe777112c", + "reference": "30fd0b3cf0e972e82636038ce4db0e4fe777112c", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -6993,7 +7285,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.2.5" + "source": "https://github.com/symfony/error-handler/tree/v6.4.24" }, "funding": [ { @@ -7004,33 +7296,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2025-07-24T08:25:04+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.2.5", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68" + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", - "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -7038,17 +7335,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7076,7 +7369,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.5" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" }, "funding": [ { @@ -7087,42 +7380,43 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.0", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", - "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.3-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -7155,7 +7449,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -7171,27 +7465,27 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/finder", - "version": "v6.2.3", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e" + "reference": "73089124388c8510efb8d2d1689285d285937b08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/81eefbddfde282ee33b437ba5e13d7753211ae8e", - "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e", + "url": "https://api.github.com/repos/symfony/finder/zipball/73089124388c8510efb8d2d1689285d285937b08", + "reference": "73089124388c8510efb8d2d1689285d285937b08", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -7219,7 +7513,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.2.3" + "source": "https://github.com/symfony/finder/tree/v6.4.24" }, "funding": [ { @@ -7230,33 +7524,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-22T17:55:15+00:00" + "time": "2025-07-15T12:02:45+00:00" }, { "name": "symfony/http-client", - "version": "v6.2.2", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "7054ad466f836309aef511789b9c697bc986d8ce" + "reference": "b8e9dce2d8acba3c32af467bb58e0c3656886181" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/7054ad466f836309aef511789b9c697bc986d8ce", - "reference": "7054ad466f836309aef511789b9c697bc986d8ce", + "url": "https://api.github.com/repos/symfony/http-client/zipball/b8e9dce2d8acba3c32af467bb58e0c3656886181", + "reference": "b8e9dce2d8acba3c32af467bb58e0c3656886181", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^1.0|^2|^3" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" }, "provide": { "php-http/async-client-implementation": "*", @@ -7269,14 +7572,15 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7303,8 +7607,11 @@ ], "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", + "keywords": [ + "http" + ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.2.2" + "source": "https://github.com/symfony/http-client/tree/v6.4.25" }, "funding": [ { @@ -7315,41 +7622,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-14T16:11:27+00:00" + "time": "2025-08-27T07:01:16+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.2.0", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "c5f587eb445224ddfeb05b5ee703476742d730bf" + "reference": "75d7043853a42837e68111812f4d964b01e5101c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/c5f587eb445224ddfeb05b5ee703476742d730bf", - "reference": "c5f587eb445224ddfeb05b5ee703476742d730bf", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/http-client-implementation": "" - }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.3-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -7385,7 +7693,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { @@ -7401,41 +7709,40 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.2.6", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e8dd1f502bc2b3371d05092aa233b064b03ce7ed" + "reference": "6bc974c0035b643aa497c58d46d9e25185e4b272" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e8dd1f502bc2b3371d05092aa233b064b03ce7ed", - "reference": "e8dd1f502bc2b3371d05092aa233b064b03ce7ed", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6bc974c0035b643aa497c58d46d9e25185e4b272", + "reference": "6bc974c0035b643aa497c58d46d9e25185e4b272", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.2" + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^5.4|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7463,7 +7770,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.2.6" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.25" }, "funding": [ { @@ -7474,34 +7781,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-30T15:46:28+00:00" + "time": "2025-08-20T06:48:20+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.2.6", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "7122db07b0d8dbf0de682267c84217573aee3ea7" + "reference": "a0ee3cea5cabf4ed960fd2ef57668ceeacdb6e15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7122db07b0d8dbf0de682267c84217573aee3ea7", - "reference": "7122db07b0d8dbf0de682267c84217573aee3ea7", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a0ee3cea5cabf4ed960fd2ef57668ceeacdb6e15", + "reference": "a0ee3cea5cabf4ed960fd2ef57668ceeacdb6e15", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^6.1", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7509,15 +7820,18 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.2", + "symfony/dependency-injection": "<6.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/mailer": "<5.4", "symfony/messenger": "<5.4", "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", "symfony/twig-bridge": "<5.4", - "symfony/validator": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, "provide": { @@ -7525,29 +7839,29 @@ }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^6.1", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.2", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", - "symfony/uid": "^5.4|^6.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, "type": "library", "autoload": { "psr-4": { @@ -7574,7 +7888,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.2.6" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.25" }, "funding": [ { @@ -7585,47 +7899,52 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-02-01T08:32:25+00:00" + "time": "2025-08-29T07:55:45+00:00" }, { "name": "symfony/mailer", - "version": "v6.2.2", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b355ad81f1d2987c47dcd3b04d5dce669e1e62e6" + "reference": "628b43b45a3e6b15c8a633fb22df547ed9b492a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b355ad81f1d2987c47dcd3b04d5dce669e1e62e6", - "reference": "b355ad81f1d2987c47dcd3b04d5dce669e1e62e6", + "url": "https://api.github.com/repos/symfony/mailer/zipball/628b43b45a3e6b15c8a633fb22df547ed9b492a2", + "reference": "628b43b45a3e6b15c8a633fb22df547ed9b492a2", "shasum": "" }, "require": { - "egulias/email-validator": "^2.1.10|^3", + "egulias/email-validator": "^2.1.10|^3|^4", "php": ">=8.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/mime": "^6.2", - "symfony/service-contracts": "^1.1|^2|^3" + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", "symfony/messenger": "<6.2", "symfony/mime": "<6.2", "symfony/twig-bridge": "<6.2.1" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/messenger": "^6.2", - "symfony/twig-bridge": "^6.2" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" }, "type": "library", "autoload": { @@ -7653,7 +7972,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.2.2" + "source": "https://github.com/symfony/mailer/tree/v6.4.25" }, "funding": [ { @@ -7664,33 +7983,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-14T16:11:27+00:00" + "time": "2025-08-13T09:41:44+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v6.2.0", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "c5364fbcf5581ba9eae569db12b380b9255ce238" + "reference": "3fd4b7735e1ead349e2559b8b0be5b4f787af057" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/c5364fbcf5581ba9eae569db12b380b9255ce238", - "reference": "c5364fbcf5581ba9eae569db12b380b9255ce238", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/3fd4b7735e1ead349e2559b8b0be5b4f787af057", + "reference": "3fd4b7735e1ead349e2559b8b0be5b4f787af057", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/mailer": "^5.4|^6.0" + "symfony/mailer": "^5.4.21|^6.2.7|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<6.2" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0" + "symfony/http-client": "^6.3|^7.0", + "symfony/webhook": "^6.3|^7.0" }, "type": "symfony-mailer-bridge", "autoload": { @@ -7718,7 +8045,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.2.0" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.24" }, "funding": [ { @@ -7729,29 +8056,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-10-09T08:55:40+00:00" + "time": "2025-07-10T08:14:14+00:00" }, { "name": "symfony/mime", - "version": "v6.2.2", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed" + "reference": "664d5e844a2de5e11c8255d0aef6bc15a9660ac7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/8c98bf40406e791043890a163f6f6599b9cfa1ed", - "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed", + "url": "https://api.github.com/repos/symfony/mime/zipball/664d5e844a2de5e11c8255d0aef6bc15a9660ac7", + "reference": "664d5e844a2de5e11c8255d0aef6bc15a9660ac7", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -7760,16 +8092,17 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^6.2" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -7801,7 +8134,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.2.2" + "source": "https://github.com/symfony/mime/tree/v6.4.24" }, "funding": [ { @@ -7812,30 +8145,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-14T16:38:10+00:00" + "time": "2025-07-15T12:02:45+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.2.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "d28f02acde71ff75e957082cd36e973df395f626" + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d28f02acde71ff75e957082cd36e973df395f626", - "reference": "d28f02acde71ff75e957082cd36e973df395f626", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -7868,7 +8205,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.2.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.3" }, "funding": [ { @@ -7879,29 +8216,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-02T09:08:04+00:00" + "time": "2025-08-05T10:16:07+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -7911,12 +8252,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -7950,7 +8288,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -7961,41 +8299,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8031,7 +8370,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -8042,43 +8381,43 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8118,7 +8457,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -8129,41 +8468,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8202,7 +8542,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -8213,29 +8553,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -8245,12 +8590,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8285,7 +8627,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -8296,38 +8638,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "name": "symfony/polyfill-php80", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8335,14 +8678,21 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -8352,7 +8702,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -8361,7 +8711,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -8372,25 +8722,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "name": "symfony/polyfill-php83", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -8408,7 +8762,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" @@ -8419,10 +8773,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -8432,7 +8782,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -8441,7 +8791,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -8452,29 +8802,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.27.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -8484,12 +8838,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -8523,7 +8874,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" }, "funding": [ { @@ -8531,7 +8882,11 @@ "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -8539,20 +8894,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v6.2.0", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877" + "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ba6e55359f8f755fe996c58a81e00eaa67a35877", - "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877", + "url": "https://api.github.com/repos/symfony/process/zipball/6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", + "reference": "6be2f0c9ab3428587c07bed03aa9e3d1b823c6c8", "shasum": "" }, "require": { @@ -8584,7 +8939,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.0" + "source": "https://github.com/symfony/process/tree/v6.4.25" }, "funding": [ { @@ -8595,41 +8950,46 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-02T09:08:04+00:00" + "time": "2025-08-14T06:23:17+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.1.4", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "a125b93ef378c492e274f217874906fb9babdebb" + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/a125b93ef378c492e274f217874906fb9babdebb", - "reference": "a125b93ef378c492e274f217874906fb9babdebb", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", "shasum": "" }, "require": { - "php": ">=7.1", - "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.0" }, "require-dev": { "nyholm/psr7": "^1.1", "psr/log": "^1.1 || ^2 || ^3", - "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0", - "symfony/config": "^4.4 || ^5.0 || ^6.0", - "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", - "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.4@dev || ^6.0" + "symfony/browser-kit": "^5.4 || ^6.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/framework-bundle": "^5.4 || ^6.0", + "symfony/http-kernel": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2" }, "suggest": { "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" @@ -8637,7 +8997,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-main": "2.1-dev" + "dev-main": "2.3-dev" } }, "autoload": { @@ -8672,7 +9032,7 @@ ], "support": { "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.4" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" }, "funding": [ { @@ -8688,24 +9048,25 @@ "type": "tidelift" } ], - "time": "2022-11-28T22:46:34+00:00" + "time": "2023-07-26T11:53:26+00:00" }, { "name": "symfony/routing", - "version": "v6.2.3", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "35fec764f3e2c8c08fb340d275c84bc78ca7e0c9" + "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/35fec764f3e2c8c08fb340d275c84bc78ca7e0c9", - "reference": "35fec764f3e2c8c08fb340d275c84bc78ca7e0c9", + "url": "https://api.github.com/repos/symfony/routing/zipball/e4f94e625c8e6f910aa004a0042f7b2d398278f5", + "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "doctrine/annotations": "<1.12", @@ -8716,17 +9077,11 @@ "require-dev": { "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8760,7 +9115,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.2.3" + "source": "https://github.com/symfony/routing/tree/v6.4.24" }, "funding": [ { @@ -8771,45 +9126,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-20T16:41:15+00:00" + "time": "2025-07-15T08:46:37+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.0", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", - "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.3-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -8845,7 +9202,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -8861,38 +9218,39 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/string", - "version": "v6.2.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "863219fd713fa41cbcd285a79723f94672faff4d" + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/863219fd713fa41cbcd285a79723f94672faff4d", - "reference": "863219fd713fa41cbcd285a79723f94672faff4d", + "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8931,7 +9289,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.2" + "source": "https://github.com/symfony/string/tree/v7.3.3" }, "funding": [ { @@ -8942,37 +9300,44 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-14T16:11:27+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/translation", - "version": "v6.2.3", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a2a15404ef4c15d92c205718eb828b225a144379" + "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a2a15404ef4c15d92c205718eb828b225a144379", - "reference": "a2a15404ef4c15d92c205718eb828b225a144379", + "url": "https://api.github.com/repos/symfony/translation/zipball/300b72643e89de0734d99a9e3f8494a3ef6936e1", + "reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { "symfony/config": "<5.4", "symfony/console": "<5.4", "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", "symfony/twig-bundle": "<5.4", "symfony/yaml": "<5.4" }, @@ -8980,25 +9345,19 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^4.18|^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "nikic/php-parser": "To use PhpAstExtractor", - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9029,7 +9388,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.2.3" + "source": "https://github.com/symfony/translation/tree/v6.4.24" }, "funding": [ { @@ -9040,41 +9399,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-23T14:11:11+00:00" + "time": "2025-07-30T17:30:48+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.2.0", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "68cce71402305a015f8c1589bfada1280dc64fe7" + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7", - "reference": "68cce71402305a015f8c1589bfada1280dc64fe7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/translation-implementation": "" - }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.3-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { @@ -9110,7 +9470,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, "funding": [ { @@ -9126,20 +9486,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2024-09-27T08:32:26+00:00" }, { "name": "symfony/uid", - "version": "v6.2.0", + "version": "v6.4.24", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "4f9f537e57261519808a7ce1d941490736522bbc" + "reference": "17da16a750541a42cf2183935e0f6008316c23f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/4f9f537e57261519808a7ce1d941490736522bbc", - "reference": "4f9f537e57261519808a7ce1d941490736522bbc", + "url": "https://api.github.com/repos/symfony/uid/zipball/17da16a750541a42cf2183935e0f6008316c23f7", + "reference": "17da16a750541a42cf2183935e0f6008316c23f7", "shasum": "" }, "require": { @@ -9147,7 +9507,7 @@ "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -9184,7 +9544,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.2.0" + "source": "https://github.com/symfony/uid/tree/v6.4.24" }, "funding": [ { @@ -9195,47 +9555,47 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-10-09T08:55:40+00:00" + "time": "2025-07-10T08:14:14+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.5", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "44b7b81749fd20c1bdf4946c041050e22bc8da27" + "reference": "c6cd92486e9fc32506370822c57bc02353a5a92c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/44b7b81749fd20c1bdf4946c041050e22bc8da27", - "reference": "44b7b81749fd20c1bdf4946c041050e22bc8da27", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6cd92486e9fc32506370822c57bc02353a5a92c", + "reference": "c6cd92486e9fc32506370822c57bc02353a5a92c", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -9272,7 +9632,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.5" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.25" }, "funding": [ { @@ -9283,39 +9643,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2023-01-20T17:45:48+00:00" + "time": "2025-08-13T09:41:44+00:00" }, { "name": "symfony/yaml", - "version": "v6.2.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3" + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3", - "reference": "6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "symfony/console": "^6.4|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -9346,7 +9708,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.2.2" + "source": "https://github.com/symfony/yaml/tree/v7.3.3" }, "funding": [ { @@ -9357,34 +9719,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-14T16:11:27+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "tedivm/jshrink", - "version": "v1.4.0", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/tedious/JShrink.git", - "reference": "0513ba1407b1f235518a939455855e6952a48bbc" + "reference": "29ee510d684c22060040f4260a527206eb8199f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tedious/JShrink/zipball/0513ba1407b1f235518a939455855e6952a48bbc", - "reference": "0513ba1407b1f235518a939455855e6952a48bbc", + "url": "https://api.github.com/repos/tedious/JShrink/zipball/29ee510d684c22060040f4260a527206eb8199f1", + "reference": "29ee510d684c22060040f4260a527206eb8199f1", "shasum": "" }, "require": { - "php": "^5.6|^7.0|^8.0" + "php": "^7.0|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.8", - "php-coveralls/php-coveralls": "^1.1.0", - "phpunit/phpunit": "^6" + "friendsofphp/php-cs-fixer": "^3.14", + "php-coveralls/php-coveralls": "^2.5.0", + "phpunit/phpunit": "^9|^10" }, "type": "library", "autoload": { @@ -9410,43 +9776,49 @@ ], "support": { "issues": "https://github.com/tedious/JShrink/issues", - "source": "https://github.com/tedious/JShrink/tree/v1.4.0" + "source": "https://github.com/tedious/JShrink/tree/v1.8.0" }, "funding": [ + { + "url": "https://github.com/tedivm", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/tedivm/jshrink", "type": "tidelift" } ], - "time": "2020-11-30T18:10:21+00:00" + "time": "2025-07-28T17:09:23+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.6", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", - "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -9469,22 +9841,22 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" }, - "time": "2023-01-03T09:29:04+00:00" + "time": "2024-12-21T16:25:41+00:00" }, { "name": "toin0u/geocoder-laravel", - "version": "4.6.0", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/geocoder-php/GeocoderLaravel.git", - "reference": "bdbb274ecd9fb32f0937237607456cb0d64a2ebb" + "reference": "f354165d10768b04da0e46b76dd99fd44dba89d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/geocoder-php/GeocoderLaravel/zipball/bdbb274ecd9fb32f0937237607456cb0d64a2ebb", - "reference": "bdbb274ecd9fb32f0937237607456cb0d64a2ebb", + "url": "https://api.github.com/repos/geocoder-php/GeocoderLaravel/zipball/f354165d10768b04da0e46b76dd99fd44dba89d2", + "reference": "f354165d10768b04da0e46b76dd99fd44dba89d2", "shasum": "" }, "require": { @@ -9493,8 +9865,8 @@ "geocoder-php/google-maps-provider": "^4.0", "guzzlehttp/psr7": "*", "http-interop/http-factory-guzzle": "^1.0", - "illuminate/cache": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", - "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/cache": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "php": "^8.0", "php-http/curl-client": "*", "willdurand/geocoder": "^4.0" @@ -9505,11 +9877,11 @@ "geocoder-php/geoip2-provider": "^4.0", "geocoder-php/maxmind-binary-provider": "^4.0", "laravel/legacy-factories": "^1.0", - "orchestra/testbench": "^7.0|^8.0", - "orchestra/testbench-browser-kit": "^7.0", - "orchestra/testbench-dusk": "^7.0", + "orchestra/testbench": "^7.0|^8.0|^9.0", + "orchestra/testbench-browser-kit": "^7.0|^8.5", + "orchestra/testbench-dusk": "^7.0|^8.22", "php-coveralls/php-coveralls": "*", - "phpunit/phpunit": "8.5|^9.0", + "phpunit/phpunit": "8.5|^9.0|^10.5", "sebastian/phpcpd": "^5.0|^6.0" }, "type": "library", @@ -9552,9 +9924,9 @@ ], "support": { "issues": "https://github.com/geocoder-php/GeocoderLaravel/issues", - "source": "https://github.com/geocoder-php/GeocoderLaravel/tree/4.6.0" + "source": "https://github.com/geocoder-php/GeocoderLaravel/tree/4.7.0" }, - "time": "2023-02-16T17:34:31+00:00" + "time": "2024-03-14T22:56:46+00:00" }, { "name": "twbs/bootstrap", @@ -9613,31 +9985,31 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.5.0", + "version": "v5.6.2", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.2", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.8", - "symfony/polyfill-ctype": "^1.23", - "symfony/polyfill-mbstring": "^1.23.1", - "symfony/polyfill-php80": "^1.23.1" + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "suggest": { "ext-filter": "Required to use the boolean validator." @@ -9646,10 +10018,10 @@ "extra": { "bamarni-bin": { "bin-links": true, - "forward-command": true + "forward-command": false }, "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -9681,7 +10053,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" }, "funding": [ { @@ -9693,20 +10065,20 @@ "type": "tidelift" } ], - "time": "2022-10-16T01:01:54+00:00" + "time": "2025-04-30T23:37:27+00:00" }, { "name": "voku/portable-ascii", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b56450eed252f6801410d810c8e1727224ae0743" + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", - "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", "shasum": "" }, "require": { @@ -9731,7 +10103,7 @@ "authors": [ { "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" + "homepage": "https://www.moelleken.org/" } ], "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", @@ -9743,7 +10115,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" }, "funding": [ { @@ -9767,7 +10139,7 @@ "type": "tidelift" } ], - "time": "2022-03-08T17:03:00+00:00" + "time": "2024-11-21T01:49:47+00:00" }, { "name": "webmozart/assert", @@ -9891,22 +10263,23 @@ }, { "name": "wouternl/laravel-drip", - "version": "1.2.4", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/wouterNL/laravel-drip.git", - "reference": "f9d96140ba62f4ddb4df909e20931e897e0edd54" + "url": "https://github.com/TheRestartProject/laravel-drip.git", + "reference": "424e5fa2bc9493f118cc482fb37007738a15a79f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wouterNL/laravel-drip/zipball/f9d96140ba62f4ddb4df909e20931e897e0edd54", - "reference": "f9d96140ba62f4ddb4df909e20931e897e0edd54", + "url": "https://api.github.com/repos/TheRestartProject/laravel-drip/zipball/424e5fa2bc9493f118cc482fb37007738a15a79f", + "reference": "424e5fa2bc9493f118cc482fb37007738a15a79f", "shasum": "" }, "require": { - "laravel/framework": "5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0|^9.0", - "php": ">=5.5.0" + "laravel/framework": "5.2.*|5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0|^9.0|^10.0", + "php": ">=8.1.0" }, + "default-branch": true, "type": "package", "extra": { "laravel": { @@ -9923,7 +10296,6 @@ "wouterNL\\Drip\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -9940,27 +10312,25 @@ "description": "A Laravel wrapper for Drip's REST API v2.0", "homepage": "https://bitbucket.org/wouterNL/laravel-drip-php", "support": { - "issues": "https://github.com/wouterNL/laravel-drip/issues", - "source": "https://github.com/wouterNL/laravel-drip/tree/1.2.4" + "source": "https://github.com/TheRestartProject/laravel-drip/tree/master" }, - "time": "2021-01-14T13:00:51+00:00" + "time": "2025-08-11T08:58:00+00:00" }, { "name": "zircote/swagger-php", - "version": "4.6.0", + "version": "4.11.1", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "ee8147745c92dd4404adb531751ce32676b888d4" + "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/ee8147745c92dd4404adb531751ce32676b888d4", - "reference": "ee8147745c92dd4404adb531751ce32676b888d4", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/7df10e8ec47db07c031db317a25bef962b4e5de1", + "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1", "shasum": "" }, "require": { - "doctrine/annotations": "^1.7 || ^2.0", "ext-json": "*", "php": ">=7.2", "psr/log": "^1.1 || ^2.0 || ^3.0", @@ -9970,11 +10340,15 @@ }, "require-dev": { "composer/package-versions-deprecated": "^1.11", - "friendsofphp/php-cs-fixer": "^2.17 || ^3.0", + "doctrine/annotations": "^1.7 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.17 || 3.62.0", "phpstan/phpstan": "^1.6", "phpunit/phpunit": ">=8", "vimeo/psalm": "^4.23" }, + "suggest": { + "doctrine/annotations": "^1.7 || ^2.0" + }, "bin": [ "bin/openapi" ], @@ -10019,52 +10393,52 @@ ], "support": { "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/4.6.0" + "source": "https://github.com/zircote/swagger-php/tree/4.11.1" }, - "time": "2023-01-13T00:51:01+00:00" + "time": "2024-10-15T19:20:02+00:00" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.7.0", + "version": "v3.16.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "3372ed65e6d2039d663ed19aa699956f9d346271" + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3372ed65e6d2039d663ed19aa699956f9d346271", - "reference": "3372ed65e6d2039d663ed19aa699956f9d346271", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f265cf5e38577d42311f1a90d619bcd3740bea23", + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23", "shasum": "" }, "require": { - "illuminate/routing": "^7|^8|^9", - "illuminate/session": "^7|^8|^9", - "illuminate/support": "^7|^8|^9", - "maximebf/debugbar": "^1.17.2", - "php": ">=7.2.5", - "symfony/finder": "^5|^6" + "illuminate/routing": "^9|^10|^11|^12", + "illuminate/session": "^9|^10|^11|^12", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1", + "php-debugbar/php-debugbar": "~2.2.0", + "symfony/finder": "^6|^7" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^5|^6|^7", - "phpunit/phpunit": "^8.5|^9.0", + "orchestra/testbench-dusk": "^7|^8|^9|^10", + "phpunit/phpunit": "^9.5.10|^10|^11", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.6-dev" - }, "laravel": { - "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" - ], "aliases": { "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" - } + }, + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.16-dev" } }, "autoload": { @@ -10089,13 +10463,14 @@ "keywords": [ "debug", "debugbar", + "dev", "laravel", "profiler", "webprofiler" ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.7.0" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.16.0" }, "funding": [ { @@ -10107,27 +10482,27 @@ "type": "github" } ], - "time": "2022-07-11T09:26:42+00:00" + "time": "2025-07-14T11:56:43+00:00" }, { "name": "cebe/php-openapi", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/cebe/php-openapi.git", - "reference": "020d72b8e3a9a60bc229953e93eda25c49f46f45" + "reference": "893ab104be1f5dfe5a39766703f583584e43c6e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cebe/php-openapi/zipball/020d72b8e3a9a60bc229953e93eda25c49f46f45", - "reference": "020d72b8e3a9a60bc229953e93eda25c49f46f45", + "url": "https://api.github.com/repos/cebe/php-openapi/zipball/893ab104be1f5dfe5a39766703f583584e43c6e1", + "reference": "893ab104be1f5dfe5a39766703f583584e43c6e1", "shasum": "" }, "require": { "ext-json": "*", - "justinrainbow/json-schema": "^5.2", + "justinrainbow/json-schema": "^5.2 || ^6.0", "php": ">=7.1.0", - "symfony/yaml": "^3.4 || ^4 || ^5 || ^6" + "symfony/yaml": "^3.4 || ^4 || ^5 || ^6 || ^7.0" }, "conflict": { "symfony/yaml": "3.4.0 - 3.4.4 || 4.0.0 - 4.4.17 || 5.0.0 - 5.1.9 || 5.2.0" @@ -10138,7 +10513,7 @@ "mermade/openapi3-examples": "1.0.0", "nexmo/api-specification": "1.0.0", "oai/openapi-specification": "3.0.3", - "phpstan/phpstan": "^0.12.0", + "phpstan/phpstan": "^0.12.0 || ^1.9", "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4" }, "bin": [ @@ -10176,7 +10551,7 @@ "issues": "https://github.com/cebe/php-openapi/issues", "source": "https://github.com/cebe/php-openapi" }, - "time": "2022-04-20T14:46:44+00:00" + "time": "2025-05-07T08:44:12+00:00" }, { "name": "doctrine/instantiator", @@ -10250,16 +10625,16 @@ }, { "name": "fakerphp/faker", - "version": "v1.21.0", + "version": "v1.24.1", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", - "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", "shasum": "" }, "require": { @@ -10285,11 +10660,6 @@ "ext-mbstring": "Required for multibyte Unicode string functionality." }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v1.21-dev" - } - }, "autoload": { "psr-4": { "Faker\\": "src/Faker/" @@ -10312,26 +10682,26 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" }, - "time": "2022-12-13T13:54:32+00:00" + "time": "2024-11-21T13:46:39+00:00" }, { "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", "shasum": "" }, "require": { - "php": "^5.3|^7.0|^8.0" + "php": "^7.4|^8.0" }, "replace": { "cordoval/hamcrest-php": "*", @@ -10339,8 +10709,8 @@ "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { @@ -10363,31 +10733,36 @@ ], "support": { "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" }, - "time": "2020-07-09T08:09:16+00:00" + "time": "2025-04-30T06:54:44+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "6.5.1", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "b5ab21e431594897e5bb86343c01f140ba862c26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/b5ab21e431594897e5bb86343c01f140ba862c26", + "reference": "b5ab21e431594897e5bb86343c01f140ba862c26", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-json": "*", + "marc-mabe/php-enum": "^4.0", + "php": "^7.2 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "friendsofphp/php-cs-fixer": "3.3.0", + "json-schema/json-schema-test-suite": "^23.2", + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" }, "bin": [ "bin/validate-json" @@ -10395,7 +10770,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "6.x-dev" } }, "autoload": { @@ -10426,61 +10801,64 @@ } ], "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "homepage": "https://github.com/jsonrainbow/json-schema", "keywords": [ "json", "schema" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/6.5.1" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2025-08-29T10:58:11+00:00" }, { "name": "laravel/dusk", - "version": "v6.25.2", + "version": "v7.13.0", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "25a595ac3dc82089a91af10dd23b0d58fd3f6d0b" + "reference": "dce7c4cc1c308bb18e95b2b3bf7d06d3f040a1f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/25a595ac3dc82089a91af10dd23b0d58fd3f6d0b", - "reference": "25a595ac3dc82089a91af10dd23b0d58fd3f6d0b", + "url": "https://api.github.com/repos/laravel/dusk/zipball/dce7c4cc1c308bb18e95b2b3bf7d06d3f040a1f6", + "reference": "dce7c4cc1c308bb18e95b2b3bf7d06d3f040a1f6", "shasum": "" }, "require": { "ext-json": "*", "ext-zip": "*", - "illuminate/console": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "guzzlehttp/guzzle": "^7.2", + "illuminate/console": "^9.0|^10.0", + "illuminate/support": "^9.0|^10.0", "nesbot/carbon": "^2.0", - "php": "^7.2|^8.0", + "php": "^8.0", "php-webdriver/webdriver": "^1.9.0", - "symfony/console": "^4.3|^5.0|^6.0", - "symfony/finder": "^4.3|^5.0|^6.0", - "symfony/process": "^4.3|^5.0|^6.0", - "vlucas/phpdotenv": "^3.0|^4.0|^5.2" + "symfony/console": "^6.0", + "symfony/finder": "^6.0", + "symfony/process": "^6.0", + "vlucas/phpdotenv": "^5.2" }, "require-dev": { - "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.16|^5.17.1|^6.12.1|^7.0", - "phpunit/phpunit": "^7.5.15|^8.4|^9.0" + "mockery/mockery": "^1.4.2", + "orchestra/testbench": "^7.33|^8.13", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.10|^10.0.1", + "psy/psysh": "^0.11.12" }, "suggest": { "ext-pcntl": "Used to gracefully terminate Dusk when tests are running." }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "6.x-dev" - }, "laravel": { "providers": [ "Laravel\\Dusk\\DuskServiceProvider" ] + }, + "branch-alias": { + "dev-master": "7.x-dev" } }, "autoload": { @@ -10506,9 +10884,9 @@ ], "support": { "issues": "https://github.com/laravel/dusk/issues", - "source": "https://github.com/laravel/dusk/tree/v6.25.2" + "source": "https://github.com/laravel/dusk/tree/v7.13.0" }, - "time": "2022-09-29T09:37:07+00:00" + "time": "2024-02-23T22:29:53+00:00" }, { "name": "league/openapi-psr7-validator", @@ -10743,111 +11121,108 @@ "time": "2021-06-28T04:27:21+00:00" }, { - "name": "masterminds/html5", - "version": "2.7.6", + "name": "marc-mabe/php-enum", + "version": "v4.7.1", "source": { "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "897eb517a343a2281f11bc5556d6548db7d93947" + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/897eb517a343a2281f11bc5556d6548db7d93947", - "reference": "897eb517a343a2281f11bc5556d6548db7d93947", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-libxml": "*", - "php": ">=5.3.0" + "ext-reflection": "*", + "php": "^7.1 | ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7" + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" } }, "autoload": { "psr-4": { - "Masterminds\\": "src" - } + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" } ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" ], "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.7.6" + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" }, - "time": "2022-08-18T16:18:26+00:00" + "time": "2024-11-28T04:54:44+00:00" }, { - "name": "maximebf/debugbar", - "version": "v1.18.1", + "name": "masterminds/html5", + "version": "2.10.0", "source": { "type": "git", - "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "ba0af68dd4316834701ecb30a00ce9604ced3ee9" + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/ba0af68dd4316834701ecb30a00ce9604ced3ee9", - "reference": "ba0af68dd4316834701ecb30a00ce9604ced3ee9", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", "shasum": "" }, "require": { - "php": "^7.1|^8", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^2.6|^3|^4|^5|^6" + "ext-dom": "*", + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^7.5.20 || ^9.4.2", - "twig/twig": "^1.38|^2.7|^3.0" - }, - "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.18-dev" + "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { - "DebugBar\\": "src/DebugBar/" + "Masterminds\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -10856,61 +11231,69 @@ ], "authors": [ { - "name": "Maxime Bouroumeau-Fuseau", - "email": "maxime.bouroumeau@gmail.com", - "homepage": "http://maximebf.com" + "name": "Matt Butcher", + "email": "technosophos@gmail.com" }, { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" } ], - "description": "Debug bar in the browser for php application", - "homepage": "https://github.com/maximebf/php-debugbar", + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", "keywords": [ - "debug", - "debugbar" + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" ], "support": { - "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.18.1" + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" }, - "time": "2022-03-31T14:55:54+00:00" + "time": "2025-07-25T09:04:22+00:00" }, { "name": "mockery/mockery", - "version": "1.5.1", + "version": "1.6.12", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", - "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { - "psr-0": { - "Mockery": "library/" + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", @@ -10921,12 +11304,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", @@ -10944,23 +11335,26 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.5.1" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2022-09-07T15:32:08+00:00" + "time": "2024-05-16T03:13:13+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -10968,11 +11362,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -10998,7 +11393,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -11006,7 +11401,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nunomaduro/collision", @@ -11039,13 +11434,13 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-develop": "6.x-dev" - }, "laravel": { "providers": [ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" ] + }, + "branch-alias": { + "dev-develop": "6.x-dev" } }, "autoload": { @@ -11166,20 +11561,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -11220,9 +11616,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -11276,44 +11678,47 @@ "time": "2022-02-21T01:04:05+00:00" }, { - "name": "php-coveralls/php-coveralls", - "version": "v2.5.3", + "name": "php-debugbar/php-debugbar", + "version": "v2.2.4", "source": { "type": "git", - "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/3146d04671f51f69ffec2a4207ac3bdcf13a9f35", + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35", "shasum": "" }, "require": { - "ext-json": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.0 || ^7.0", - "php": "^5.5 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "php": "^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "replace": { + "maximebf/debugbar": "self.version" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23", - "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" }, "suggest": { - "symfony/http-kernel": "Allows Symfony integration" + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" }, - "bin": [ - "bin/php-coveralls" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, "autoload": { "psr-4": { - "PhpCoveralls\\": "src/" + "DebugBar\\": "src/DebugBar/" } }, "notification-url": "https://packagist.org/downloads/", @@ -11322,75 +11727,63 @@ ], "authors": [ { - "name": "Kitamura Satoshi", - "email": "with.no.parachute@gmail.com", - "homepage": "https://www.facebook.com/satooshi.jp", - "role": "Original creator" - }, - { - "name": "Takashi Matsuo", - "email": "tmatsuo@google.com" - }, - { - "name": "Google Inc" - }, - { - "name": "Dariusz Ruminski", - "email": "dariusz.ruminski@gmail.com", - "homepage": "https://github.com/keradus" + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" }, { - "name": "Contributors", - "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" } ], - "description": "PHP client library for Coveralls API", - "homepage": "https://github.com/php-coveralls/php-coveralls", + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/php-debugbar/php-debugbar", "keywords": [ - "ci", - "coverage", - "github", - "test" + "debug", + "debug bar", + "debugbar", + "dev" ], "support": { - "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.4" }, - "time": "2022-09-12T20:47:09+00:00" + "time": "2025-07-22T14:01:30+00:00" }, { "name": "php-webdriver/webdriver", - "version": "1.13.1", + "version": "1.15.2", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" + "reference": "998e499b786805568deaf8cbf06f4044f05d91bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/998e499b786805568deaf8cbf06f4044f05d91bf", + "reference": "998e499b786805568deaf8cbf06f4044f05d91bf", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-zip": "*", - "php": "^5.6 || ~7.0 || ^8.0", + "php": "^7.3 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^5.0 || ^6.0 || ^7.0" }, "replace": { "facebook/webdriver": "*" }, "require-dev": { - "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^1.1 || ^2.0", + "php-mock/php-mock-phpunit": "^2.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", + "phpunit/phpunit": "^9.3", "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" + "symfony/var-dumper": "^5.0 || ^6.0 || ^7.0" }, "suggest": { "ext-SimpleXML": "For Firefox profile creation" @@ -11419,50 +11812,50 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.2" }, - "time": "2022-10-11T11:49:44+00:00" + "time": "2024-11-21T15:12:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.23", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", - "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -11490,7 +11883,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -11498,7 +11892,7 @@ "type": "github" } ], - "time": "2022-12-28T12:41:10+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11743,50 +12137,50 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.28", + "version": "9.6.25", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e" + "reference": "049c011e01be805202d8eebedef49f769a8ec7b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e", - "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/049c011e01be805202d8eebedef49f769a8ec7b7", + "reference": "049c011e01be805202d8eebedef49f769a8ec7b7", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.9", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.8", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", "sebastian/version": "^3.0.2" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -11794,7 +12188,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -11825,7 +12219,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.25" }, "funding": [ { @@ -11836,30 +12231,38 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2023-01-14T12:32:24+00:00" + "time": "2025-08-20T14:38:31+00:00" }, { "name": "psr/http-server-handler", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -11879,7 +12282,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side request handler", @@ -11895,28 +12298,27 @@ "server" ], "support": { - "issues": "https://github.com/php-fig/http-server-handler/issues", - "source": "https://github.com/php-fig/http-server-handler/tree/master" + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" }, - "time": "2018-10-30T16:46:14+00:00" + "time": "2023-04-10T20:06:20+00:00" }, { "name": "psr/http-server-middleware", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "type": "library", @@ -11937,7 +12339,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side middleware", @@ -11953,9 +12355,9 @@ ], "support": { "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/master" + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" }, - "time": "2018-10-30T17:12:04+00:00" + "time": "2023-04-11T06:14:47+00:00" }, { "name": "respect/stringifier", @@ -12013,41 +12415,42 @@ }, { "name": "respect/validation", - "version": "2.2.4", + "version": "2.4.4", "source": { "type": "git", "url": "https://github.com/Respect/Validation.git", - "reference": "d304ace5325efd7180daffb1f8627bb0affd4e3a" + "reference": "f13f10f19978aea33af2a102a2f58f2db1e63619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Respect/Validation/zipball/d304ace5325efd7180daffb1f8627bb0affd4e3a", - "reference": "d304ace5325efd7180daffb1f8627bb0affd4e3a", + "url": "https://api.github.com/repos/Respect/Validation/zipball/f13f10f19978aea33af2a102a2f58f2db1e63619", + "reference": "f13f10f19978aea33af2a102a2f58f2db1e63619", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0 || ^8.1 || ^8.2", + "php": ">=8.1", "respect/stringifier": "^0.2.0", "symfony/polyfill-mbstring": "^1.2" }, "require-dev": { "egulias/email-validator": "^3.0", - "malukenho/docheader": "^0.1", + "giggsey/libphonenumber-for-php-lite": "^8.13 || ^9.0", + "malukenho/docheader": "^1.0", "mikey179/vfsstream": "^1.6", "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", "phpunit/phpunit": "^9.6", "psr/http-message": "^1.0", - "respect/coding-standard": "^3.0", - "squizlabs/php_codesniffer": "^3.7", - "symfony/validator": "^3.0||^4.0" + "respect/coding-standard": "^4.0", + "squizlabs/php_codesniffer": "^3.7" }, "suggest": { - "egulias/email-validator": "Strict (RFC compliant) email validation", + "egulias/email-validator": "Improves the Email rule if available", "ext-bcmath": "Arbitrary Precision Mathematics", "ext-fileinfo": "File Information", - "ext-mbstring": "Multibyte String Functions" + "ext-mbstring": "Multibyte String Functions", + "giggsey/libphonenumber-for-php-lite": "Enables the phone rule if available" }, "type": "library", "autoload": { @@ -12074,22 +12477,22 @@ ], "support": { "issues": "https://github.com/Respect/Validation/issues", - "source": "https://github.com/Respect/Validation/tree/2.2.4" + "source": "https://github.com/Respect/Validation/tree/2.4.4" }, - "time": "2023-02-15T01:05:24+00:00" + "time": "2025-06-07T00:07:21+00:00" }, { "name": "riverline/multipart-parser", - "version": "2.0.9", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/Riverline/multipart-parser.git", - "reference": "ebba10245b5a6e03a673ff52c547d05029caedab" + "reference": "1410f23a8fd416a0cf5c8867ea9c95544016c831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Riverline/multipart-parser/zipball/ebba10245b5a6e03a673ff52c547d05029caedab", - "reference": "ebba10245b5a6e03a673ff52c547d05029caedab", + "url": "https://api.github.com/repos/Riverline/multipart-parser/zipball/1410f23a8fd416a0cf5c8867ea9c95544016c831", + "reference": "1410f23a8fd416a0cf5c8867ea9c95544016c831", "shasum": "" }, "require": { @@ -12097,10 +12500,10 @@ "php": ">=5.6.0" }, "require-dev": { - "laminas/laminas-diactoros": "^1.8.7", - "phpunit/phpunit": "^5.2 || ^6.0 || ^7.0", + "laminas/laminas-diactoros": "^1.8.7 || ^2.11.1", + "phpunit/phpunit": "^5.7 || ^9.0", "psr/http-message": "^1.0", - "symfony/psr-http-message-bridge": "^1.1" + "symfony/psr-http-message-bridge": "^1.1 || ^2.0" }, "type": "library", "autoload": { @@ -12130,22 +12533,22 @@ ], "support": { "issues": "https://github.com/Riverline/multipart-parser/issues", - "source": "https://github.com/Riverline/multipart-parser/tree/2.0.9" + "source": "https://github.com/Riverline/multipart-parser/tree/2.2.0" }, - "time": "2021-10-18T09:56:35+00:00" + "time": "2025-04-29T08:38:14+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -12180,7 +12583,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -12188,7 +12591,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -12303,16 +12706,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "4.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", "shasum": "" }, "require": { @@ -12365,32 +12768,44 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2025-08-10T06:51:50+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -12422,7 +12837,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -12430,20 +12845,20 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -12488,7 +12903,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -12496,20 +12911,20 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -12551,7 +12966,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -12559,20 +12974,20 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -12628,7 +13043,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -12636,20 +13051,20 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { @@ -12692,32 +13107,44 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2025-08-10T07:10:35+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -12749,7 +13176,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -12757,7 +13184,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -12873,16 +13300,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { @@ -12921,31 +13348,43 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -12957,7 +13396,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -12978,8 +13417,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -12987,20 +13425,20 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { @@ -13035,7 +13473,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -13043,7 +13481,7 @@ "type": "github" } ], - "time": "2022-09-12T14:47:03+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", @@ -13100,25 +13538,27 @@ }, { "name": "spatie/backtrace", - "version": "1.2.1", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b" + "reference": "8c0f16a59ae35ec8c62d85c3c17585158f430110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", - "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8c0f16a59ae35ec8c62d85c3c17585158f430110", + "reference": "8c0f16a59ae35ec8c62d85c3c17585158f430110", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": "^7.3 || ^8.0" }, "require-dev": { "ext-json": "*", - "phpunit/phpunit": "^9.3", - "symfony/var-dumper": "^5.1" + "laravel/serializable-closure": "^1.3 || ^2.0", + "phpunit/phpunit": "^9.3 || ^11.4.3", + "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6", + "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -13146,7 +13586,7 @@ ], "support": { "issues": "https://github.com/spatie/backtrace/issues", - "source": "https://github.com/spatie/backtrace/tree/1.2.1" + "source": "https://github.com/spatie/backtrace/tree/1.8.1" }, "funding": [ { @@ -13158,43 +13598,117 @@ "type": "other" } ], - "time": "2021-11-09T10:57:15+00:00" + "time": "2025-08-26T08:22:30+00:00" + }, + { + "name": "spatie/error-solutions", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/error-solutions.git", + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "illuminate/broadcasting": "^10.0|^11.0|^12.0", + "illuminate/cache": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "livewire/livewire": "^2.11|^3.5.20", + "openai-php/client": "^0.10.1", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "phpstan/phpstan": "^2.1", + "psr/simple-cache": "^3.0", + "psr/simple-cache-implementation": "^3.0", + "spatie/ray": "^1.28", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "legacy/ignition", + "Spatie\\ErrorSolutions\\": "src", + "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" + } + ], + "description": "This is my package error-solutions", + "homepage": "https://github.com/spatie/error-solutions", + "keywords": [ + "error-solutions", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/error-solutions/issues", + "source": "https://github.com/spatie/error-solutions/tree/1.1.3" + }, + "funding": [ + { + "url": "https://github.com/Spatie", + "type": "github" + } + ], + "time": "2025-02-14T12:29:50+00:00" }, { "name": "spatie/flare-client-php", - "version": "1.3.4", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "cac56c8730032660f2ff23906b7018e93d8f2d3f" + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/cac56c8730032660f2ff23906b7018e93d8f2d3f", - "reference": "cac56c8730032660f2ff23906b7018e93d8f2d3f", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f", + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f", "shasum": "" }, "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0", + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^8.0", - "spatie/backtrace": "^1.2", - "symfony/http-foundation": "^5.0|^6.0", - "symfony/mime": "^5.2|^6.0", - "symfony/process": "^5.2|^6.0", - "symfony/var-dumper": "^5.2|^6.0" + "spatie/backtrace": "^1.6.1", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" }, "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.3.0", - "pestphp/pest": "^1.20", + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0" + "spatie/pest-plugin-snapshots": "^1.0|^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.1.x-dev" + "dev-main": "1.3.x-dev" } }, "autoload": { @@ -13219,7 +13733,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.3.4" + "source": "https://github.com/spatie/flare-client-php/tree/1.10.1" }, "funding": [ { @@ -13227,42 +13741,51 @@ "type": "github" } ], - "time": "2023-01-23T15:31:39+00:00" + "time": "2025-02-14T13:42:06+00:00" }, { "name": "spatie/ignition", - "version": "1.4.3", + "version": "1.15.1", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "2cf3833220cfe8fcf639544f8d7067b6469a00b0" + "reference": "31f314153020aee5af3537e507fef892ffbf8c85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/2cf3833220cfe8fcf639544f8d7067b6469a00b0", - "reference": "2cf3833220cfe8fcf639544f8d7067b6469a00b0", + "url": "https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85", + "reference": "31f314153020aee5af3537e507fef892ffbf8c85", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", "php": "^8.0", - "spatie/flare-client-php": "^1.1", - "symfony/console": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "spatie/error-solutions": "^1.0", + "spatie/flare-client-php": "^1.7", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "require-dev": { + "illuminate/cache": "^9.52|^10.0|^11.0|^12.0", "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20", + "pestphp/pest": "^1.20|^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "symfony/process": "^5.4|^6.0" + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.2.x-dev" + "dev-main": "1.5.x-dev" } }, "autoload": { @@ -13301,55 +13824,56 @@ "type": "github" } ], - "time": "2023-01-23T15:28:32+00:00" + "time": "2025-02-21T14:31:39+00:00" }, { "name": "spatie/laravel-ignition", - "version": "1.6.4", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "1a2b4bd3d48c72526c0ba417687e5c56b5cf49bc" + "reference": "1baee07216d6748ebd3a65ba97381b051838707a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/1a2b4bd3d48c72526c0ba417687e5c56b5cf49bc", - "reference": "1a2b4bd3d48c72526c0ba417687e5c56b5cf49bc", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/1baee07216d6748ebd3a65ba97381b051838707a", + "reference": "1baee07216d6748ebd3a65ba97381b051838707a", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "illuminate/support": "^8.77|^9.27", - "monolog/monolog": "^2.3", - "php": "^8.0", - "spatie/flare-client-php": "^1.0.1", - "spatie/ignition": "^1.4.1", - "symfony/console": "^5.0|^6.0", - "symfony/var-dumper": "^5.0|^6.0" + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/ignition": "^1.15", + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" }, "require-dev": { - "filp/whoops": "^2.14", - "livewire/livewire": "^2.8|dev-develop", - "mockery/mockery": "^1.4", - "nunomaduro/larastan": "^1.0", - "orchestra/testbench": "^6.23|^7.0", - "pestphp/pest": "^1.20", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/laravel-ray": "^1.27" + "livewire/livewire": "^2.11|^3.3.5", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.8.1|^0.10", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.34|^3.7", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1.1|^2.0", + "phpstan/phpstan-phpunit": "^1.3.16|^2.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" }, "type": "library", "extra": { "laravel": { - "providers": [ - "Spatie\\LaravelIgnition\\IgnitionServiceProvider" - ], "aliases": { "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" - } + }, + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ] } }, "autoload": { @@ -13391,20 +13915,20 @@ "type": "github" } ], - "time": "2023-01-03T19:28:04+00:00" + "time": "2025-02-20T13:13:55+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.1", + "version": "3.13.2", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "5b5e3821314f947dd040c70f7992a64eac89025c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c", + "reference": "5b5e3821314f947dd040c70f7992a64eac89025c", "shasum": "" }, "require": { @@ -13414,11 +13938,11 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", "extra": { @@ -13433,111 +13957,62 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "time": "2022-06-18T07:21:10+00:00" - }, - { - "name": "symfony/config", - "version": "v6.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "ebf27792246165a2a0b6b69ec9c620cac8c5a2f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ebf27792246165a2a0b6b69ec9c620cac8c5a2f0", - "reference": "ebf27792246165a2a0b6b69ec9c620cac8c5a2f0", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^5.4|^6.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<5.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" + "role": "Former lead" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Juliette Reinders Folmer", + "role": "Current lead" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], "support": { - "source": "https://github.com/symfony/config/tree/v6.2.0" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/PHPCSStandards", + "type": "github" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/jrfnl", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2022-11-02T09:08:04+00:00" + "time": "2025-06-17T22:17:01+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.2.3", + "version": "v6.4.25", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "f2743e033dd05a62978ced0ad368022e82c9fab2" + "reference": "976302990f9f2a6d4c07206836dd4ca77cae9524" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/f2743e033dd05a62978ced0ad368022e82c9fab2", - "reference": "f2743e033dd05a62978ced0ad368022e82c9fab2", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/976302990f9f2a6d4c07206836dd4ca77cae9524", + "reference": "976302990f9f2a6d4c07206836dd4ca77cae9524", "shasum": "" }, "require": { @@ -13547,10 +14022,7 @@ "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0" - }, - "suggest": { - "symfony/css-selector": "" + "symfony/css-selector": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -13578,70 +14050,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.2.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-12-22T17:55:15+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v6.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "50b2523c874605cf3d4acf7a9e2b30b6a440a016" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/50b2523c874605cf3d4acf7a9e2b30b6a440a016", - "reference": "50b2523c874605cf3d4acf7a9e2b30b6a440a016", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.0" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.25" }, "funding": [ { @@ -13653,65 +14062,7 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-20T13:01:27+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v6.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7", - "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/service-contracts": "^1|^2|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -13719,20 +14070,20 @@ "type": "tidelift" } ], - "time": "2022-09-28T16:00:52+00:00" + "time": "2025-08-05T18:56:08+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -13761,7 +14112,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -13769,17 +14120,19 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], + "minimum-stability": "stable", + "stability-flags": { + "wouternl/laravel-drip": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.0" + "php": "^8.1" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php index b5d3ef9103..42e770538b 100644 --- a/config/app.php +++ b/config/app.php @@ -1,5 +1,6 @@ [ - - /* - * Laravel Framework Service Providers... - */ - Illuminate\Auth\AuthServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - Illuminate\Bus\BusServiceProvider::class, - Illuminate\Cache\CacheServiceProvider::class, - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - Illuminate\Cookie\CookieServiceProvider::class, - Illuminate\Database\DatabaseServiceProvider::class, - Illuminate\Encryption\EncryptionServiceProvider::class, - Illuminate\Filesystem\FilesystemServiceProvider::class, - Illuminate\Foundation\Providers\FoundationServiceProvider::class, - Illuminate\Hashing\HashServiceProvider::class, - Illuminate\Mail\MailServiceProvider::class, - Illuminate\Notifications\NotificationServiceProvider::class, - Illuminate\Pagination\PaginationServiceProvider::class, - Illuminate\Pipeline\PipelineServiceProvider::class, - Illuminate\Queue\QueueServiceProvider::class, - Illuminate\Redis\RedisServiceProvider::class, - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, - Illuminate\View\ViewServiceProvider::class, - + 'providers' => ServiceProvider::defaultProviders()->merge([ /* * Package Service Providers... */ @@ -194,7 +168,7 @@ App\Providers\ScheduleServiceProvider::class, Sentry\Laravel\ServiceProvider::class, App\Providers\OurSentryLogging::class, - ], + ])->toArray(), /* |-------------------------------------------------------------------------- diff --git a/config/auth.php b/config/auth.php index 2231b26732..0628b65087 100644 --- a/config/auth.php +++ b/config/auth.php @@ -86,16 +86,20 @@ | than one user table or model in the application and you want to have | separate password reset settings based on the specific user types. | - | The expire time is the number of minutes that each reset token will be + | The expiry time is the number of minutes that each reset token will be | considered valid. This security feature keeps tokens short-lived so | they have less time to be guessed. You may change this as needed. | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | */ 'passwords' => [ 'users' => [ 'provider' => 'users', - 'table' => 'password_resets', + 'table' => 'password_reset_tokens', 'expire' => 60, 'throttle' => 60, ], diff --git a/config/broadcasting.php b/config/broadcasting.php index 1688242447..2410485384 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -36,7 +36,8 @@ 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ - 'host' => env('PUSHER_HOST', 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', 'port' => env('PUSHER_PORT', 443), 'scheme' => env('PUSHER_SCHEME', 'https'), 'encrypted' => true, diff --git a/config/cache.php b/config/cache.php index 33bb29546e..d4171e2212 100644 --- a/config/cache.php +++ b/config/cache.php @@ -52,6 +52,7 @@ 'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), ], 'memcached' => [ diff --git a/config/database.php b/config/database.php index a09ab0f1cf..edbf228861 100644 --- a/config/database.php +++ b/config/database.php @@ -56,8 +56,6 @@ 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, - // We need strict = 'false' because we have some complex queries which fall foul of Laravel's requirements - // for use of GROUP BY. Note that Laravel Shift will try to set this back TRUE, but don't let it. 'strict' => false, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ @@ -111,6 +109,8 @@ 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), ], ], @@ -151,7 +151,8 @@ 'default' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), ], @@ -159,7 +160,8 @@ 'cache' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_CACHE_DB', '1'), ], diff --git a/config/hashing.php b/config/hashing.php index bcd3be4c28..c69faf990e 100644 --- a/config/hashing.php +++ b/config/hashing.php @@ -29,7 +29,9 @@ */ 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), + 'rounds' => env('BCRYPT_ROUNDS', 12), + // Set to false to allow legacy passwords created before Laravel 10 upgrade. + 'verify' => false, ], /* @@ -47,6 +49,7 @@ 'memory' => 65536, 'threads' => 1, 'time' => 4, + 'verify' => true, ], ]; diff --git a/config/logging.php b/config/logging.php index 51f308d943..5a5b2ad53f 100644 --- a/config/logging.php +++ b/config/logging.php @@ -1,5 +1,6 @@ 'single', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, ], 'daily' => [ @@ -68,6 +70,7 @@ 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, + 'replace_placeholders' => true, ], 'discourse' => [ @@ -83,6 +86,7 @@ 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, ], 'papertrail' => [ @@ -94,6 +98,7 @@ 'port' => env('PAPERTRAIL_PORT'), 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), ], + 'processors' => [PsrLogMessageProcessor::class], ], 'stderr' => [ @@ -104,16 +109,20 @@ 'with' => [ 'stream' => 'php://stderr', ], + 'processors' => [PsrLogMessageProcessor::class], ], 'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, ], 'errorlog' => [ 'driver' => 'errorlog', 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, ], 'null' => [ diff --git a/config/mail.php b/config/mail.php index 534395a369..e894b2e5f8 100644 --- a/config/mail.php +++ b/config/mail.php @@ -28,14 +28,15 @@ | sending an e-mail. You will specify which one you are using for your | mailers below. You are free to add additional mailers as required. | - | Supported: "smtp", "sendmail", "mailgun", "ses", - | "postmark", "log", "array", "failover" + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "log", "array", "failover", "roundrobin" | */ 'mailers' => [ 'smtp' => [ 'transport' => 'smtp', + 'url' => env('MAIL_URL'), 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'encryption' => env('MAIL_ENCRYPTION', 'tls'), @@ -49,12 +50,19 @@ 'transport' => 'ses', ], - 'mailgun' => [ - 'transport' => 'mailgun', - ], - 'postmark' => [ 'transport' => 'postmark', + // 'message_stream_id' => null, + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + // 'client' => [ + // 'timeout' => 5, + // ], ], 'sendmail' => [ @@ -78,6 +86,14 @@ 'log', ], ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], ], /* diff --git a/config/session.php b/config/session.php index fa3a0d33d4..1e490f78f7 100644 --- a/config/session.php +++ b/config/session.php @@ -198,4 +198,17 @@ 'same_site' => 'lax', + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => false, + ]; diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php index c8721c30c1..c2bf03c893 100644 --- a/database/factories/CategoryFactory.php +++ b/database/factories/CategoryFactory.php @@ -8,10 +8,8 @@ class CategoryFactory extends Factory { /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return []; } diff --git a/database/factories/DeviceFactory.php b/database/factories/DeviceFactory.php index bedcf4823d..74a73a06ca 100644 --- a/database/factories/DeviceFactory.php +++ b/database/factories/DeviceFactory.php @@ -10,10 +10,8 @@ class DeviceFactory extends Factory { /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return [ 'event' => Party::factory()->create()->idevents, diff --git a/database/factories/FaultcatFactory.php b/database/factories/FaultcatFactory.php index 374f4ea436..766ab1af67 100644 --- a/database/factories/FaultcatFactory.php +++ b/database/factories/FaultcatFactory.php @@ -8,10 +8,8 @@ class FaultcatFactory extends Factory { /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return []; } diff --git a/database/factories/GroupFactory.php b/database/factories/GroupFactory.php index 0160f7e5f5..43cde6417b 100644 --- a/database/factories/GroupFactory.php +++ b/database/factories/GroupFactory.php @@ -8,10 +8,8 @@ class GroupFactory extends Factory { /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return [ 'name' => $this->faker->unique()->company(), diff --git a/database/factories/GroupTagsFactory.php b/database/factories/GroupTagsFactory.php index 54eee54ab5..c5792bf450 100644 --- a/database/factories/GroupTagsFactory.php +++ b/database/factories/GroupTagsFactory.php @@ -8,10 +8,8 @@ class GroupTagsFactory extends Factory { /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return [ 'tag_name' => $this->faker->word(), diff --git a/database/factories/MisccatFactory.php b/database/factories/MisccatFactory.php index 948d6b594d..0e08072698 100644 --- a/database/factories/MisccatFactory.php +++ b/database/factories/MisccatFactory.php @@ -8,10 +8,8 @@ class MisccatFactory extends Factory { /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return []; } diff --git a/database/factories/NetworkFactory.php b/database/factories/NetworkFactory.php index f4a7cf277b..5cf42b58fa 100644 --- a/database/factories/NetworkFactory.php +++ b/database/factories/NetworkFactory.php @@ -8,10 +8,8 @@ class NetworkFactory extends Factory { /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return [ 'name' => $this->faker->unique()->company(), diff --git a/database/factories/PartyFactory.php b/database/factories/PartyFactory.php index 9adcbcccb0..ab2fddaec1 100644 --- a/database/factories/PartyFactory.php +++ b/database/factories/PartyFactory.php @@ -10,10 +10,8 @@ class PartyFactory extends Factory { /** * Configure the model factory. - * - * @return $this */ - public function configure() + public function configure(): static { return $this->afterMaking(function ($model) { @@ -50,10 +48,8 @@ public function configure() /** * Define the model's default state. - * - * @return array */ - public function definition() + public function definition(): array { return [ // Need to force the location otherwise the random one may not be geocodable and therefore the event may not diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index c151ae195e..d523e3eaba 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use Illuminate\Support\Facades\Hash; use Illuminate\Database\Eloquent\Factories\Factory; use App\Role; use App\User; @@ -25,13 +26,15 @@ class UserFactory extends Factory * * @return array */ - public function definition() + protected static ?string $password; + + public function definition(): array { return [ 'name' => $this->faker->name(), 'email' => $this->faker->unique()->safeEmail(), 'username' => $this->faker->userName(), - 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret + 'password' => static::$password ??= Hash::make('secret'), 'remember_token' => Str::random(10), 'consent_past_data' => new \DateTime(), 'consent_future_data' => new \DateTime(), diff --git a/database/migrations/2014_04_02_193005_create_translations_table.php b/database/migrations/2014_04_02_193005_create_translations_table.php index 034d183ca1..747850fe33 100644 --- a/database/migrations/2014_04_02_193005_create_translations_table.php +++ b/database/migrations/2014_04_02_193005_create_translations_table.php @@ -7,10 +7,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('ltm_translations', function (Blueprint $table) { $table->increments('id'); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::drop('ltm_translations'); } diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php index fcacb80b3e..4f42fe6909 100644 --- a/database/migrations/2014_10_12_100000_create_password_resets_table.php +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('password_resets', function (Blueprint $table) { $table->string('email')->index(); @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('password_resets'); } diff --git a/database/migrations/2018_04_19_102108_initialise_fixometer_db.php b/database/migrations/2018_04_19_102108_initialise_fixometer_db.php index e756425551..dbe77bfd06 100644 --- a/database/migrations/2018_04_19_102108_initialise_fixometer_db.php +++ b/database/migrations/2018_04_19_102108_initialise_fixometer_db.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { //Settings @@ -537,10 +535,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2018_04_19_135338_password_recovery.php b/database/migrations/2018_04_19_135338_password_recovery.php index c60fa80e62..3cd5e702c7 100644 --- a/database/migrations/2018_04_19_135338_password_recovery.php +++ b/database/migrations/2018_04_19_135338_password_recovery.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `users` ADD COLUMN `recovery` VARCHAR(45) NULL AFTER `role`, @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2018_04_19_135433_device_list_view.php b/database/migrations/2018_04_19_135433_device_list_view.php index 9c94da9125..594a4128c6 100644 --- a/database/migrations/2018_04_19_135433_device_list_view.php +++ b/database/migrations/2018_04_19_135433_device_list_view.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // DB::statement('CREATE OR REPLACE VIEW `view_devices_list` AS // SELECT @@ -41,10 +39,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2018_04_19_135527_device_age.php b/database/migrations/2018_04_19_135527_device_age.php index 3192a7abf7..095311e7cb 100644 --- a/database/migrations/2018_04_19_135527_device_age.php +++ b/database/migrations/2018_04_19_135527_device_age.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `devices` ADD COLUMN `age` VARCHAR(255) NULL COMMENT "// kept as free text to capture data type after research" AFTER `model`;' @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2018_04_19_135647_event_venue.php b/database/migrations/2018_04_19_135647_event_venue.php index 06e39fbe54..f11fa8d726 100644 --- a/database/migrations/2018_04_19_135647_event_venue.php +++ b/database/migrations/2018_04_19_135647_event_venue.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `events` ADD COLUMN `venue` VARCHAR(255) NULL AFTER `end`;' @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2018_04_19_135728_lang_pref.php b/database/migrations/2018_04_19_135728_lang_pref.php index 0eb570a73b..47fe08c1c8 100644 --- a/database/migrations/2018_04_19_135728_lang_pref.php +++ b/database/migrations/2018_04_19_135728_lang_pref.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `users` ADD COLUMN `language` VARCHAR(2) NOT NULL DEFAULT "en" AFTER `recovery_expires`;' @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2018_04_19_135801_website.php b/database/migrations/2018_04_19_135801_website.php index 39419fa152..532c5d39f2 100644 --- a/database/migrations/2018_04_19_135801_website.php +++ b/database/migrations/2018_04_19_135801_website.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `groups` ADD COLUMN `website` TEXT NULL DEFAULT NULL AFTER `free_text`;' @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2018_04_19_145002_users_auth.php b/database/migrations/2018_04_19_145002_users_auth.php index 0007ed0144..cf05393f60 100644 --- a/database/migrations/2018_04_19_145002_users_auth.php +++ b/database/migrations/2018_04_19_145002_users_auth.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->rememberToken(); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('remember_token'); diff --git a/database/migrations/2018_04_20_100516_users_location_age_gender.php b/database/migrations/2018_04_20_100516_users_location_age_gender.php index fca09e3952..ebe9050e2d 100644 --- a/database/migrations/2018_04_20_100516_users_location_age_gender.php +++ b/database/migrations/2018_04_20_100516_users_location_age_gender.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('location')->nullable(); @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('location'); diff --git a/database/migrations/2018_05_10_085751_rename_modified_at.php b/database/migrations/2018_05_10_085751_rename_modified_at.php index b7ba918de3..24a11a3cf1 100644 --- a/database/migrations/2018_05_10_085751_rename_modified_at.php +++ b/database/migrations/2018_05_10_085751_rename_modified_at.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->renameColumn('modified_at', 'updated_at'); @@ -29,10 +27,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->renameColumn('updated_at', 'modified_at'); diff --git a/database/migrations/2018_05_16_121333_rename_modified_at_images.php b/database/migrations/2018_05_16_121333_rename_modified_at_images.php index ffd9fad789..984d8348d6 100644 --- a/database/migrations/2018_05_16_121333_rename_modified_at_images.php +++ b/database/migrations/2018_05_16_121333_rename_modified_at_images.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('images', function (Blueprint $table) { $table->renameColumn('modified_at', 'updated_at'); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('images', function (Blueprint $table) { $table->renameColumn('updated_at', 'modified_at'); diff --git a/database/migrations/2018_06_01_142316_Create_Group_Tags.php b/database/migrations/2018_06_01_142316_Create_Group_Tags.php index 9a4e9f8b36..1c3130f60f 100644 --- a/database/migrations/2018_06_01_142316_Create_Group_Tags.php +++ b/database/migrations/2018_06_01_142316_Create_Group_Tags.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('group_tags', function (Blueprint $table) { $table->increments('id'); @@ -26,10 +24,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('group_tags'); Schema::table('groups', function (Blueprint $table) { diff --git a/database/migrations/2018_06_01_145539_Create_Brands.php b/database/migrations/2018_06_01_145539_Create_Brands.php index 711b4c9680..7d0a47e240 100644 --- a/database/migrations/2018_06_01_145539_Create_Brands.php +++ b/database/migrations/2018_06_01_145539_Create_Brands.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('brands', function (Blueprint $table) { $table->increments('id'); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('brands'); Schema::table('devices', function (Blueprint $table) { diff --git a/database/migrations/2018_06_01_152511_Create_Skills.php b/database/migrations/2018_06_01_152511_Create_Skills.php index b7e57793f5..b4a5868ce0 100644 --- a/database/migrations/2018_06_01_152511_Create_Skills.php +++ b/database/migrations/2018_06_01_152511_Create_Skills.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('skills', function (Blueprint $table) { $table->increments('id'); @@ -26,10 +24,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('skills'); Schema::table('users', function (Blueprint $table) { diff --git a/database/migrations/2018_06_06_160236_Create_Skills_Pivot.php b/database/migrations/2018_06_06_160236_Create_Skills_Pivot.php index 6f3507b809..46e414906f 100644 --- a/database/migrations/2018_06_06_160236_Create_Skills_Pivot.php +++ b/database/migrations/2018_06_06_160236_Create_Skills_Pivot.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('users_skills', function (Blueprint $table) { $table->increments('id'); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('users_skills'); Schema::table('users', function (Blueprint $table) { diff --git a/database/migrations/2018_06_06_160549_Create_Group_Tags_Pivot.php b/database/migrations/2018_06_06_160549_Create_Group_Tags_Pivot.php index e9a7b7845e..e3fad194ae 100644 --- a/database/migrations/2018_06_06_160549_Create_Group_Tags_Pivot.php +++ b/database/migrations/2018_06_06_160549_Create_Group_Tags_Pivot.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('grouptags_groups', function (Blueprint $table) { $table->increments('id'); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('grouptags_groups'); Schema::table('groups', function (Blueprint $table) { diff --git a/database/migrations/2018_06_07_144018_Add_New_Fields_Users.php b/database/migrations/2018_06_07_144018_Add_New_Fields_Users.php index c613aa6624..4287a8f41f 100644 --- a/database/migrations/2018_06_07_144018_Add_New_Fields_Users.php +++ b/database/migrations/2018_06_07_144018_Add_New_Fields_Users.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('country')->nullable(); @@ -26,10 +24,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('country'); diff --git a/database/migrations/2018_06_14_140315_Add_Number_Of_Logins.php b/database/migrations/2018_06_14_140315_Add_Number_Of_Logins.php index 9dd8c895ca..6b8e0f9682 100644 --- a/database/migrations/2018_06_14_140315_Add_Number_Of_Logins.php +++ b/database/migrations/2018_06_14_140315_Add_Number_Of_Logins.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->integer('number_of_logins')->default(0); @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('number_of_logins'); diff --git a/database/migrations/2018_06_19_091052_Add_Status_Role_User_Events.php b/database/migrations/2018_06_19_091052_Add_Status_Role_User_Events.php index 8d792cbb11..7166abe803 100644 --- a/database/migrations/2018_06_19_091052_Add_Status_Role_User_Events.php +++ b/database/migrations/2018_06_19_091052_Add_Status_Role_User_Events.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events_users', function (Blueprint $table) { $table->string('status', 50)->nullable(); @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events_users', function (Blueprint $table) { $table->dropColumn('status'); diff --git a/database/migrations/2018_06_27_000057_update_users_brands_registration.php b/database/migrations/2018_06_27_000057_update_users_brands_registration.php index 8f23146183..cf8fb3afc1 100644 --- a/database/migrations/2018_06_27_000057_update_users_brands_registration.php +++ b/database/migrations/2018_06_27_000057_update_users_brands_registration.php @@ -9,10 +9,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->timestamp('consent_past_data')->nullable(); @@ -41,10 +39,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('consent_gdpr'); diff --git a/database/migrations/2018_06_28_204857_create_sessions_table.php b/database/migrations/2018_06_28_204857_create_sessions_table.php index e36514b9e6..f10567c196 100644 --- a/database/migrations/2018_06_28_204857_create_sessions_table.php +++ b/database/migrations/2018_06_28_204857_create_sessions_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::rename('sessions', 'sessions_old'); @@ -27,10 +25,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::rename('sessions_old', 'sessions'); diff --git a/database/migrations/2018_07_01_201744_create_invites_table.php b/database/migrations/2018_07_01_201744_create_invites_table.php index 1d867dbc62..b0db64e656 100644 --- a/database/migrations/2018_07_01_201744_create_invites_table.php +++ b/database/migrations/2018_07_01_201744_create_invites_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('invites', function (Blueprint $table) { $table->increments('id'); @@ -24,10 +22,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('invites'); } diff --git a/database/migrations/2018_07_01_221529_Add_Status_Role_User_Groups.php b/database/migrations/2018_07_01_221529_Add_Status_Role_User_Groups.php index 932f1c3b97..57f3b3fdd3 100644 --- a/database/migrations/2018_07_01_221529_Add_Status_Role_User_Groups.php +++ b/database/migrations/2018_07_01_221529_Add_Status_Role_User_Groups.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users_groups', function (Blueprint $table) { $table->string('status', 50)->nullable(); @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users_groups', function (Blueprint $table) { $table->dropColumn('status'); diff --git a/database/migrations/2018_07_03_104638_user_table_updates.php b/database/migrations/2018_07_03_104638_user_table_updates.php index 689fa02454..077d9cc452 100644 --- a/database/migrations/2018_07_03_104638_user_table_updates.php +++ b/database/migrations/2018_07_03_104638_user_table_updates.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('gender')->nullable()->default(null)->change(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->string('gender')->nullable(false)->default('N/A')->change(); diff --git a/database/migrations/2018_07_04_082822_invite_type_column.php b/database/migrations/2018_07_04_082822_invite_type_column.php index 3daabd7480..64083733f8 100644 --- a/database/migrations/2018_07_04_082822_invite_type_column.php +++ b/database/migrations/2018_07_04_082822_invite_type_column.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('invites', function (Blueprint $table) { $table->string('type')->nullable(); @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('invites', function (Blueprint $table) { $table->dropColumn('type'); diff --git a/database/migrations/2018_07_04_215949_device_wiki_column.php b/database/migrations/2018_07_04_215949_device_wiki_column.php index 1c1925b9a9..19b767926d 100644 --- a/database/migrations/2018_07_04_215949_device_wiki_column.php +++ b/database/migrations/2018_07_04_215949_device_wiki_column.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('devices', function (Blueprint $table) { $table->integer('wiki')->after('repaired_by')->nullable(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('devices', function (Blueprint $table) { $table->dropColumn('wiki'); diff --git a/database/migrations/2018_07_06_221304_change_bio_length.php b/database/migrations/2018_07_06_221304_change_bio_length.php index 735718707b..2c94120248 100644 --- a/database/migrations/2018_07_06_221304_change_bio_length.php +++ b/database/migrations/2018_07_06_221304_change_bio_length.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->text('biography')->change(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->string('biography')->change(); diff --git a/database/migrations/2018_07_06_222838_make_group_tag_desc_nullable.php b/database/migrations/2018_07_06_222838_make_group_tag_desc_nullable.php index 2810ca7f2d..7eca492354 100644 --- a/database/migrations/2018_07_06_222838_make_group_tag_desc_nullable.php +++ b/database/migrations/2018_07_06_222838_make_group_tag_desc_nullable.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('group_tags', function (Blueprint $table) { $table->text('description')->nullable()->change(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('group_tags', function (Blueprint $table) { $table->string('description')->nullable(false)->change(); diff --git a/database/migrations/2018_07_12_110255_default_volunteers_value.php b/database/migrations/2018_07_12_110255_default_volunteers_value.php index dd032ce597..f33555c51b 100644 --- a/database/migrations/2018_07_12_110255_default_volunteers_value.php +++ b/database/migrations/2018_07_12_110255_default_volunteers_value.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->integer('volunteers')->nullable(false)->default(0)->change(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->integer('volunteers')->nullable()->change(); diff --git a/database/migrations/2018_07_17_221336_volunteer_event_users.php b/database/migrations/2018_07_17_221336_volunteer_event_users.php index 58ee6d518f..a9b882c780 100644 --- a/database/migrations/2018_07_17_221336_volunteer_event_users.php +++ b/database/migrations/2018_07_17_221336_volunteer_event_users.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events_users', function (Blueprint $table) { $table->string('full_name')->nullable(); @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events_users', function (Blueprint $table) { $table->dropColumn('full_name'); diff --git a/database/migrations/2018_07_26_172108_media_wiki.php b/database/migrations/2018_07_26_172108_media_wiki.php index db18776609..059bf4f350 100644 --- a/database/migrations/2018_07_26_172108_media_wiki.php +++ b/database/migrations/2018_07_26_172108_media_wiki.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->tinyInteger('mediawiki')->default(0); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('mediawiki'); diff --git a/database/migrations/2018_07_31_213315_media_wiki_username.php b/database/migrations/2018_07_31_213315_media_wiki_username.php index 900853237e..152b2a11a3 100644 --- a/database/migrations/2018_07_31_213315_media_wiki_username.php +++ b/database/migrations/2018_07_31_213315_media_wiki_username.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('mediawiki')->default(null)->nullable()->change(); @@ -24,10 +22,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->integer('mediawiki')->default(0)->change(); diff --git a/database/migrations/2018_09_03_091813_create_audits_table.php b/database/migrations/2018_09_03_091813_create_audits_table.php index dc7c72a80c..cd7073a320 100644 --- a/database/migrations/2018_09_03_091813_create_audits_table.php +++ b/database/migrations/2018_09_03_091813_create_audits_table.php @@ -20,10 +20,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('audits', function (Blueprint $table) { $table->increments('id'); @@ -45,10 +43,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::drop('audits'); } diff --git a/database/migrations/2018_09_04_110332_create_preferences_table.php b/database/migrations/2018_09_04_110332_create_preferences_table.php index cf53dece72..29e494ef86 100644 --- a/database/migrations/2018_09_04_110332_create_preferences_table.php +++ b/database/migrations/2018_09_04_110332_create_preferences_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('preferences', function (Blueprint $table) { $table->increments('id'); @@ -36,10 +34,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('users_preferences'); Schema::dropIfExists('preferences'); diff --git a/database/migrations/2018_09_13_114022_soft_delete_event.php b/database/migrations/2018_09_13_114022_soft_delete_event.php index f7a161b1d1..34fa930687 100644 --- a/database/migrations/2018_09_13_114022_soft_delete_event.php +++ b/database/migrations/2018_09_13_114022_soft_delete_event.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->softDeletes(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->dropColumn('deleted_at'); diff --git a/database/migrations/2018_09_18_101249_create_drop_permissions_tables.php b/database/migrations/2018_09_18_101249_create_drop_permissions_tables.php index 516f82a47d..811c49c7a4 100644 --- a/database/migrations/2018_09_18_101249_create_drop_permissions_tables.php +++ b/database/migrations/2018_09_18_101249_create_drop_permissions_tables.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::table('users_preferences')->delete(); DB::table('preferences')->delete(); @@ -48,10 +46,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('users_permissions'); } diff --git a/database/migrations/2018_09_20_120947_soft_delete_permissions.php b/database/migrations/2018_09_20_120947_soft_delete_permissions.php index 64e7bd83cb..a3aa381719 100644 --- a/database/migrations/2018_09_20_120947_soft_delete_permissions.php +++ b/database/migrations/2018_09_20_120947_soft_delete_permissions.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('permissions', function (Blueprint $table) { $table->softDeletes(); @@ -24,10 +22,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('permissions', function (Blueprint $table) { $table->dropColumn('deleted_at'); diff --git a/database/migrations/2018_10_02_162335_add_user_id_to_events_table.php b/database/migrations/2018_10_02_162335_add_user_id_to_events_table.php index 714d3c7d04..fe4ee4b835 100644 --- a/database/migrations/2018_10_02_162335_add_user_id_to_events_table.php +++ b/database/migrations/2018_10_02_162335_add_user_id_to_events_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->integer('user_id')->unsigned()->nullable()->after('volunteers'); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->dropColumn('user_id'); diff --git a/database/migrations/2018_10_04_095031_create_notifications_table.php b/database/migrations/2018_10_04_095031_create_notifications_table.php index 4357c9efa5..d73803223d 100644 --- a/database/migrations/2018_10_04_095031_create_notifications_table.php +++ b/database/migrations/2018_10_04_095031_create_notifications_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('notifications', function (Blueprint $table) { $table->uuid('id')->primary(); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('notifications'); } diff --git a/database/migrations/2018_10_31_145415_add_preferences.php b/database/migrations/2018_10_31_145415_add_preferences.php index 8b42ccc1eb..82e7106168 100644 --- a/database/migrations/2018_10_31_145415_add_preferences.php +++ b/database/migrations/2018_10_31_145415_add_preferences.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // Additional preferences DB::table('preferences')->insert([ @@ -70,10 +68,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::table('users_preferences')->delete(); DB::table('preferences')->truncate(); diff --git a/database/migrations/2018_11_05_190951_group_country_field.php b/database/migrations/2018_11_05_190951_group_country_field.php index ecf4b7a590..cc401fae0b 100644 --- a/database/migrations/2018_11_05_190951_group_country_field.php +++ b/database/migrations/2018_11_05_190951_group_country_field.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->string('country')->after('area')->nullable(); @@ -38,10 +36,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('country'); diff --git a/database/migrations/2018_11_12_135805_additional_device_fields.php b/database/migrations/2018_11_12_135805_additional_device_fields.php index c3a9d411ea..0830efcd2a 100644 --- a/database/migrations/2018_11_12_135805_additional_device_fields.php +++ b/database/migrations/2018_11_12_135805_additional_device_fields.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('barriers', function (Blueprint $table) { $table->increments('id'); @@ -55,10 +53,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('barriers'); Schema::dropIfExists('devices_urls'); diff --git a/database/migrations/2018_12_04_212544_increase_username_field_length.php b/database/migrations/2018_12_04_212544_increase_username_field_length.php index a3014d9234..5c39d8a0e9 100644 --- a/database/migrations/2018_12_04_212544_increase_username_field_length.php +++ b/database/migrations/2018_12_04_212544_increase_username_field_length.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('username', 50)->change(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->string('username', 20)->change(); diff --git a/database/migrations/2018_12_10_114941_create_jobs_table.php b/database/migrations/2018_12_10_114941_create_jobs_table.php index a786a89100..6098d9b123 100644 --- a/database/migrations/2018_12_10_114941_create_jobs_table.php +++ b/database/migrations/2018_12_10_114941_create_jobs_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('jobs', function (Blueprint $table) { $table->bigIncrements('id'); @@ -26,10 +24,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('jobs'); } diff --git a/database/migrations/2018_12_11_112533_create_failed_jobs_table.php b/database/migrations/2018_12_11_112533_create_failed_jobs_table.php index 23a0faa341..b1b6dfcd54 100644 --- a/database/migrations/2018_12_11_112533_create_failed_jobs_table.php +++ b/database/migrations/2018_12_11_112533_create_failed_jobs_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('failed_jobs', function (Blueprint $table) { $table->bigIncrements('id'); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('failed_jobs'); } diff --git a/database/migrations/2019_03_03_191008_add_last_login_field_to_users_table.php b/database/migrations/2019_03_03_191008_add_last_login_field_to_users_table.php index e2e35c3751..92e9399325 100644 --- a/database/migrations/2019_03_03_191008_add_last_login_field_to_users_table.php +++ b/database/migrations/2019_03_03_191008_add_last_login_field_to_users_table.php @@ -9,10 +9,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->datetime('last_login_at')->nullable(); @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('last_login_at'); diff --git a/database/migrations/2019_03_13_162745_add_access_key_column_to_users_table.php b/database/migrations/2019_03_13_162745_add_access_key_column_to_users_table.php index 647de7470d..b48674a36e 100644 --- a/database/migrations/2019_03_13_162745_add_access_key_column_to_users_table.php +++ b/database/migrations/2019_03_13_162745_add_access_key_column_to_users_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('access_key')->nullable()->unique(); @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('access_key'); diff --git a/database/migrations/2019_03_22_105152_repair_network_update.php b/database/migrations/2019_03_22_105152_repair_network_update.php index b3a51ba670..5a6e8eb309 100644 --- a/database/migrations/2019_03_22_105152_repair_network_update.php +++ b/database/migrations/2019_03_22_105152_repair_network_update.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->tinyInteger('repair_network')->default(1)->after('language'); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('repair_network'); diff --git a/database/migrations/2019_03_22_154657_add_unique_shareable_code_to_events_and_groups.php b/database/migrations/2019_03_22_154657_add_unique_shareable_code_to_events_and_groups.php index f6fae67a7e..4a267af07d 100644 --- a/database/migrations/2019_03_22_154657_add_unique_shareable_code_to_events_and_groups.php +++ b/database/migrations/2019_03_22_154657_add_unique_shareable_code_to_events_and_groups.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->string('shareable_code')->after('free_text')->nullable(); @@ -24,10 +22,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('shareable_code'); diff --git a/database/migrations/2019_04_06_143811_fix_event_name_in_devices_view.php b/database/migrations/2019_04_06_143811_fix_event_name_in_devices_view.php index 47e5450e5b..f55a62b2d9 100644 --- a/database/migrations/2019_04_06_143811_fix_event_name_in_devices_view.php +++ b/database/migrations/2019_04_06_143811_fix_event_name_in_devices_view.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('DROP VIEW IF EXISTS view_devices_list'); DB::statement('CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `view_devices_list` AS select `devices`.`iddevices` AS `id`,`categories`.`name` AS `category_name`,`categories`.`idcategories` AS `idcategory`,`devices`.`brand` AS `brand`,`devices`.`model` AS `model`,`devices`.`problem` AS `problem`,`groups`.`idgroups` AS `idgroup`,`groups`.`name` AS `group_name`,COALESCE(`events`.`venue`,`events`.`location`) AS event_name, `events`.`location` AS `event_location`,`events`.`latitude` AS `event_latitude`,`events`.`longitude` AS `event_longitude`,unix_timestamp(`events`.`event_date`) AS `event_date`,`users`.`name` AS `restarter`,`devices`.`repair_status` AS `repair_status`,`devices`.`created_at` AS `sorter` from ((((`devices` join `categories` on((`categories`.`idcategories` = `devices`.`category`))) join `events` on((`events`.`idevents` = `devices`.`event`))) join `groups` on((`groups`.`idgroups` = `events`.`group`))) join `users` on((`users`.`id` = `devices`.`repaired_by`)));'); @@ -19,10 +17,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::statement('DROP VIEW IF EXISTS view_devices_list'); DB::statement('CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `view_devices_list` AS select `devices`.`iddevices` AS `id`,`categories`.`name` AS `category_name`,`categories`.`idcategories` AS `idcategory`,`devices`.`brand` AS `brand`,`devices`.`model` AS `model`,`devices`.`problem` AS `problem`,`groups`.`idgroups` AS `idgroup`,`groups`.`name` AS `group_name`,`events`.`location` AS `event_location`,`events`.`latitude` AS `event_latitude`,`events`.`longitude` AS `event_longitude`,unix_timestamp(`events`.`event_date`) AS `event_date`,`users`.`name` AS `restarter`,`devices`.`repair_status` AS `repair_status`,`devices`.`created_at` AS `sorter` from ((((`devices` join `categories` on((`categories`.`idcategories` = `devices`.`category`))) join `events` on((`events`.`idevents` = `devices`.`event`))) join `groups` on((`groups`.`idgroups` = `events`.`group`))) join `users` on((`users`.`id` = `devices`.`repaired_by`)));'); diff --git a/database/migrations/2019_04_08_123743_alter_users_groups_default_role_to_restarter.php b/database/migrations/2019_04_08_123743_alter_users_groups_default_role_to_restarter.php index 2b536d4b77..b440cda54d 100644 --- a/database/migrations/2019_04_08_123743_alter_users_groups_default_role_to_restarter.php +++ b/database/migrations/2019_04_08_123743_alter_users_groups_default_role_to_restarter.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // Using raw SQL as tinyint columns can't be altered. // See https://laravel.com/docs/5.6/migrations#modifying-columns @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::statement("ALTER TABLE `users_groups` CHANGE `role` `role` TINYINT(4) NOT NULL DEFAULT '3'"); } diff --git a/database/migrations/2019_05_29_142932_add_drip_subscriber_id_to_users_table.php b/database/migrations/2019_05_29_142932_add_drip_subscriber_id_to_users_table.php index 319d0f9bec..2f60941b50 100644 --- a/database/migrations/2019_05_29_142932_add_drip_subscriber_id_to_users_table.php +++ b/database/migrations/2019_05_29_142932_add_drip_subscriber_id_to_users_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('drip_subscriber_id')->nullable()->after('newsletter')->unique(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('drip_subscriber_id'); diff --git a/database/migrations/2019_06_03_100102_add_wiki_sync_status_to_users_table.php b/database/migrations/2019_06_03_100102_add_wiki_sync_status_to_users_table.php index d5b0e6624b..d1247d6c66 100644 --- a/database/migrations/2019_06_03_100102_add_wiki_sync_status_to_users_table.php +++ b/database/migrations/2019_06_03_100102_add_wiki_sync_status_to_users_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->boolean('wiki_sync_status')->default(false); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('wiki_sync_status'); diff --git a/database/migrations/2019_06_03_112609_add_calendar_hash_to_users_table.php b/database/migrations/2019_06_03_112609_add_calendar_hash_to_users_table.php index ed303be157..aebbe7d767 100644 --- a/database/migrations/2019_06_03_112609_add_calendar_hash_to_users_table.php +++ b/database/migrations/2019_06_03_112609_add_calendar_hash_to_users_table.php @@ -9,10 +9,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('calendar_hash')->after('drip_subscriber_id')->unique()->nullable(); @@ -33,10 +31,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->dropColumn('calendar_hash'); diff --git a/database/migrations/2019_06_04_165318_add_admin_user_deleted_preference.php b/database/migrations/2019_06_04_165318_add_admin_user_deleted_preference.php index 20fd526822..e3f026f2ac 100644 --- a/database/migrations/2019_06_04_165318_add_admin_user_deleted_preference.php +++ b/database/migrations/2019_06_04_165318_add_admin_user_deleted_preference.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::table('preferences')->insert([ 'name' => 'Admin User Deleted', @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { $id = DB::table('preferences')->where('slug', 'admin-user-deleted')->pluck('id'); DB::table('users_preferences')->where('preference_id', $id)->delete(); diff --git a/database/migrations/2019_06_04_165426_add_admin_moderate_event_photos_preference.php b/database/migrations/2019_06_04_165426_add_admin_moderate_event_photos_preference.php index 6cfc04853d..48b91dfa30 100644 --- a/database/migrations/2019_06_04_165426_add_admin_moderate_event_photos_preference.php +++ b/database/migrations/2019_06_04_165426_add_admin_moderate_event_photos_preference.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::table('preferences')->insert([ 'name' => 'Admin Moderate Event Photos', @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { $id = DB::table('preferences')->where('slug', 'admin-moderate-event-photos')->pluck('id'); DB::table('users_preferences')->where('preference_id', $id)->delete(); diff --git a/database/migrations/2019_11_11_151415_rename_access_key_column.php b/database/migrations/2019_11_11_151415_rename_access_key_column.php index 658b047382..613a2083e2 100644 --- a/database/migrations/2019_11_11_151415_rename_access_key_column.php +++ b/database/migrations/2019_11_11_151415_rename_access_key_column.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->renameColumn('access_key', 'api_token'); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->renameColumn('api_token', 'access_key'); diff --git a/database/migrations/2019_12_01_191304_users_groups_soft_deletes.php b/database/migrations/2019_12_01_191304_users_groups_soft_deletes.php index 28b5c953b0..d77b5d7c93 100644 --- a/database/migrations/2019_12_01_191304_users_groups_soft_deletes.php +++ b/database/migrations/2019_12_01_191304_users_groups_soft_deletes.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users_groups', function (Blueprint $table) { $table->softDeletes(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { $table->dropSoftDeletes(); } diff --git a/database/migrations/2019_12_09_112009_add_updated_at_to_devices_faults_opinions_table.php b/database/migrations/2019_12_09_112009_add_updated_at_to_devices_faults_opinions_table.php index 8003c0344e..5bf71aeb94 100644 --- a/database/migrations/2019_12_09_112009_add_updated_at_to_devices_faults_opinions_table.php +++ b/database/migrations/2019_12_09_112009_add_updated_at_to_devices_faults_opinions_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (Schema::hasTable('devices_faults_opinions')) { if (! Schema::hasColumn('devices_faults_opinions', 'updated_at')) { @@ -36,10 +34,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('devices_faults_opinions', function (Blueprint $table) { $table->dropColumn('updated_at'); diff --git a/database/migrations/2019_12_13_110932_add_age_country_to_devices_faults_opinions_table.php b/database/migrations/2019_12_13_110932_add_age_country_to_devices_faults_opinions_table.php index d002a67f9c..c18acc8ab0 100644 --- a/database/migrations/2019_12_13_110932_add_age_country_to_devices_faults_opinions_table.php +++ b/database/migrations/2019_12_13_110932_add_age_country_to_devices_faults_opinions_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (Schema::hasTable('devices_faults_opinions')) { if (! Schema::hasColumn('devices_faults_opinions', 'age')) { @@ -41,10 +39,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('devices_faults_opinions', function (Blueprint $table) { $table->dropColumn('age'); diff --git a/database/migrations/2019_12_20_121135_create_microtask_demographics_table.php b/database/migrations/2019_12_20_121135_create_microtask_demographics_table.php index ba1650d040..dd34597a57 100644 --- a/database/migrations/2019_12_20_121135_create_microtask_demographics_table.php +++ b/database/migrations/2019_12_20_121135_create_microtask_demographics_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('microtask_demographics', function (Blueprint $table) { $table->increments('id'); @@ -30,10 +28,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('microtask_demographics'); } diff --git a/database/migrations/2020_02_10_182430_add_network_id_to_groups.php b/database/migrations/2020_02_10_182430_add_network_id_to_groups.php index f87259ddd3..64d6b054e3 100644 --- a/database/migrations/2020_02_10_182430_add_network_id_to_groups.php +++ b/database/migrations/2020_02_10_182430_add_network_id_to_groups.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->smallInteger('network_id') @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('network_id'); diff --git a/database/migrations/2020_02_10_184130_add_external_id_to_groups.php b/database/migrations/2020_02_10_184130_add_external_id_to_groups.php index 78ba2a3cb2..e0d5a4abff 100644 --- a/database/migrations/2020_02_10_184130_add_external_id_to_groups.php +++ b/database/migrations/2020_02_10_184130_add_external_id_to_groups.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->smallInteger('external_id') @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('external_id'); diff --git a/database/migrations/2020_02_10_200747_add_facebook_field_to_groups.php b/database/migrations/2020_02_10_200747_add_facebook_field_to_groups.php index 5e7b17e3e8..af4d596fa0 100644 --- a/database/migrations/2020_02_10_200747_add_facebook_field_to_groups.php +++ b/database/migrations/2020_02_10_200747_add_facebook_field_to_groups.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->text('facebook')->after('website'); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('facebook'); diff --git a/database/migrations/2020_02_17_100100_faultcat_refactor.php b/database/migrations/2020_02_17_100100_faultcat_refactor.php index 3f190f903b..af725a04cd 100644 --- a/database/migrations/2020_02_17_100100_faultcat_refactor.php +++ b/database/migrations/2020_02_17_100100_faultcat_refactor.php @@ -11,10 +11,8 @@ * * Includes missed migrations for tables * `devices_faults` and `devices_faults_opinions`. - * - * @return void */ - public function up() + public function up(): void { if (Schema::hasTable('devices_faults')) { Schema::rename('devices_faults', 'devices_faults_events'); @@ -81,10 +79,8 @@ public function up() * Reverse the migrations. * * DO NOT DROP `devices_faults` or `devices_faults_opinions`. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_faults_adjudicated'); diff --git a/database/migrations/2020_02_24_140951_create_misccat_tables.php b/database/migrations/2020_02_24_140951_create_misccat_tables.php index 3be0691f45..c587bb1c85 100644 --- a/database/migrations/2020_02_24_140951_create_misccat_tables.php +++ b/database/migrations/2020_02_24_140951_create_misccat_tables.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('devices_misc_opinions', function (Blueprint $table) { $table->increments('id'); @@ -39,10 +37,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_misc_opinions'); Schema::dropIfExists('devices_misc_adjudicated'); diff --git a/database/migrations/2020_03_11_164903_create_networks_table.php b/database/migrations/2020_03_11_164903_create_networks_table.php index b995781d83..a31b202d69 100644 --- a/database/migrations/2020_03_11_164903_create_networks_table.php +++ b/database/migrations/2020_03_11_164903_create_networks_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('networks', function (Blueprint $table) { $table->increments('id'); @@ -26,10 +24,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('networks'); } diff --git a/database/migrations/2020_03_11_175639_create_group_network_table.php b/database/migrations/2020_03_11_175639_create_group_network_table.php index ff409f6852..70cfbdbba1 100644 --- a/database/migrations/2020_03_11_175639_create_group_network_table.php +++ b/database/migrations/2020_03_11_175639_create_group_network_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('group_network', function (Blueprint $table) { $table->primary(['group_id', 'network_id']); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('group_network'); } diff --git a/database/migrations/2020_03_29_160723_add_wordpress_push_to_networks_table.php b/database/migrations/2020_03_29_160723_add_wordpress_push_to_networks_table.php index b511de95a4..6c70c40b25 100644 --- a/database/migrations/2020_03_29_160723_add_wordpress_push_to_networks_table.php +++ b/database/migrations/2020_03_29_160723_add_wordpress_push_to_networks_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('networks', function (Blueprint $table) { $table->boolean('events_push_to_wordpress')->notNullable()->default(false); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('networks', function (Blueprint $table) { $table->dropColumn('events_push_to_wordpress'); diff --git a/database/migrations/2020_03_29_200447_add_include_in_zapier_to_networks_table.php b/database/migrations/2020_03_29_200447_add_include_in_zapier_to_networks_table.php index eeb6d27df9..926d5203f7 100644 --- a/database/migrations/2020_03_29_200447_add_include_in_zapier_to_networks_table.php +++ b/database/migrations/2020_03_29_200447_add_include_in_zapier_to_networks_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('networks', function (Blueprint $table) { $table->boolean('include_in_zapier')->nullable(false)->default(false); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('networks', function (Blueprint $table) { $table->dropColumn('include_in_zapier'); diff --git a/database/migrations/2020_03_29_220513_add_shortname_to_networks_table.php b/database/migrations/2020_03_29_220513_add_shortname_to_networks_table.php index 7d2b86e601..f6c06cd159 100644 --- a/database/migrations/2020_03_29_220513_add_shortname_to_networks_table.php +++ b/database/migrations/2020_03_29_220513_add_shortname_to_networks_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('networks', function (Blueprint $table) { $table->string('shortname', 255)->nullable(false); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('networks', function (Blueprint $table) { $table->dropColumn('shortname'); diff --git a/database/migrations/2020_04_19_095514_add_networkcoordinator_to_roles_table.php b/database/migrations/2020_04_19_095514_add_networkcoordinator_to_roles_table.php index d1c223fd9a..4635b373a3 100644 --- a/database/migrations/2020_04_19_095514_add_networkcoordinator_to_roles_table.php +++ b/database/migrations/2020_04_19_095514_add_networkcoordinator_to_roles_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::table('roles')->insert([ 'role' => 'NetworkCoordinator', @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::delete("delete from roles where role = 'NetworkCoordinator'"); } diff --git a/database/migrations/2020_04_19_102144_create_user_network_table.php b/database/migrations/2020_04_19_102144_create_user_network_table.php index f0f1e3e4d8..0d81fd7ec0 100644 --- a/database/migrations/2020_04_19_102144_create_user_network_table.php +++ b/database/migrations/2020_04_19_102144_create_user_network_table.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('user_network', function (Blueprint $table) { $table->primary(['user_id', 'network_id']); @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('user_network'); } diff --git a/database/migrations/2020_04_27_175552_create_default_network.php b/database/migrations/2020_04_27_175552_create_default_network.php index 6198c3bb26..5ed7ed0d0b 100644 --- a/database/migrations/2020_04_27_175552_create_default_network.php +++ b/database/migrations/2020_04_27_175552_create_default_network.php @@ -10,10 +10,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // This is the default 'Restarters' network - that which // groups will be a member of by default, if not part of @@ -34,10 +32,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::table('networks')->where('id', 1)->delete(); } diff --git a/database/migrations/2020_04_28_094252_add_drip_push_column_to_networks.php b/database/migrations/2020_04_28_094252_add_drip_push_column_to_networks.php index 67db46aedf..1b409ed488 100644 --- a/database/migrations/2020_04_28_094252_add_drip_push_column_to_networks.php +++ b/database/migrations/2020_04_28_094252_add_drip_push_column_to_networks.php @@ -9,10 +9,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('networks', function (Blueprint $table) { $table->boolean('users_push_to_drip')->nullable(false)->default(false) @@ -24,10 +22,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('networks', function (Blueprint $table) { $table->dropColumn('users_push_to_drip'); diff --git a/database/migrations/2020_05_21_173538_add_online_flag_to_events.php b/database/migrations/2020_05_21_173538_add_online_flag_to_events.php index 6258fb212c..1b4c5089f5 100644 --- a/database/migrations/2020_05_21_173538_add_online_flag_to_events.php +++ b/database/migrations/2020_05_21_173538_add_online_flag_to_events.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->boolean('online') @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->dropColumn('online'); diff --git a/database/migrations/2020_05_26_130318_allow_null_location_details.php b/database/migrations/2020_05_26_130318_allow_null_location_details.php index aad571291a..e4ceffb899 100644 --- a/database/migrations/2020_05_26_130318_allow_null_location_details.php +++ b/database/migrations/2020_05_26_130318_allow_null_location_details.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->string('location', 255)->nullable()->change(); @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->string('location', 255)->nullable(false)->change(); diff --git a/database/migrations/2020_06_08_093140_add_discourse_group_to_networks.php b/database/migrations/2020_06_08_093140_add_discourse_group_to_networks.php index 7a992c1a44..9eee802682 100644 --- a/database/migrations/2020_06_08_093140_add_discourse_group_to_networks.php +++ b/database/migrations/2020_06_08_093140_add_discourse_group_to_networks.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('networks', function (Blueprint $table) { $table->string('discourse_group', 255)->nullable(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('networks', function (Blueprint $table) { $table->dropColumn('discourse_group'); diff --git a/database/migrations/2020_06_30_100100_mobifix_setup.php b/database/migrations/2020_06_30_100100_mobifix_setup.php index 86e5fa7c63..f55cc8cd8b 100644 --- a/database/migrations/2020_06_30_100100_mobifix_setup.php +++ b/database/migrations/2020_06_30_100100_mobifix_setup.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('devices_faults_mobiles_opinions', function (Blueprint $table) { $table->increments('id'); @@ -37,10 +35,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_faults_mobiles_adjudicated'); Schema::dropIfExists('devices_faults_mobiles_opinions'); diff --git a/database/migrations/2020_07_17_125259_add_event_deletion_notification_preference.php b/database/migrations/2020_07_17_125259_add_event_deletion_notification_preference.php index df09c2ad26..9ad261211f 100644 --- a/database/migrations/2020_07_17_125259_add_event_deletion_notification_preference.php +++ b/database/migrations/2020_07_17_125259_add_event_deletion_notification_preference.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::table('preferences')->insert([ 'name' => 'Event deletion notification', @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { $id = DB::table('preferences')->where('slug', 'delete-event-notification')->pluck('id'); DB::table('users_preferences')->where('preference_id', $id)->delete(); diff --git a/database/migrations/2020_08_01_110400_mobifix_ora_setup.php b/database/migrations/2020_08_01_110400_mobifix_ora_setup.php index 62bc4264d8..b50438bfc9 100644 --- a/database/migrations/2020_08_01_110400_mobifix_ora_setup.php +++ b/database/migrations/2020_08_01_110400_mobifix_ora_setup.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('devices_faults_mobiles_ora_opinions', function (Blueprint $table) { $table->increments('id'); @@ -238,10 +236,8 @@ protected function _FaultTypes() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_faults_mobiles_ora_adjudicated'); Schema::dropIfExists('devices_faults_mobiles_ora_opinions'); diff --git a/database/migrations/2020_08_11_130008_latitude_longitude_three_digits.php b/database/migrations/2020_08_11_130008_latitude_longitude_three_digits.php index 560e0fe4cc..cf7018698c 100644 --- a/database/migrations/2020_08_11_130008_latitude_longitude_three_digits.php +++ b/database/migrations/2020_08_11_130008_latitude_longitude_three_digits.php @@ -8,20 +8,16 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `users` CHANGE `longitude` `longitude` DECIMAL(10,7), CHANGE `latitude` `latitude` DECIMAL(10,7) NULL DEFAULT NULL;'); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::statement('ALTER TABLE `users` CHANGE `longitude` `longitude` DECIMAL(10,8), CHANGE `latitude` `latitude` DECIMAL(10,8) NULL DEFAULT NULL;'); } diff --git a/database/migrations/2020_08_26_110001_support_non_powered_items.php b/database/migrations/2020_08_26_110001_support_non_powered_items.php index 48d89e7a8e..da561e31bf 100644 --- a/database/migrations/2020_08_26_110001_support_non_powered_items.php +++ b/database/migrations/2020_08_26_110001_support_non_powered_items.php @@ -9,10 +9,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // New cluster for non-powered categories. DB::table('clusters')->insert([ @@ -60,10 +58,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('devices', function (Blueprint $table) { $table->dropColumn('item_type'); diff --git a/database/migrations/2020_10_21_121813_alter_table_charsets.php b/database/migrations/2020_10_21_121813_alter_table_charsets.php index 8151e3d35c..40d2e6f47b 100644 --- a/database/migrations/2020_10_21_121813_alter_table_charsets.php +++ b/database/migrations/2020_10_21_121813_alter_table_charsets.php @@ -11,10 +11,8 @@ /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Log::info('START MIGRATE AlterTableCharsets'); @@ -32,10 +30,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { $tables = $this->_tableCharsets(); foreach ($tables as $table) { @@ -135,10 +131,8 @@ private function _dataTables() /** * Report char issues. - * - * @return void */ - private function _report($prefix = '', $suffix = '') + private function _report($prefix = '', $suffix = ''): void { $tables = $this->_dataTables(); $format = 'SELECT @@ -151,7 +145,7 @@ private function _report($prefix = '', $suffix = '') $key = $fields['key']; foreach ($fields['fields'] as $field) { $qry = sprintf($format, $table, $field, $key); - $result = DB::select(DB::raw($qry)); + $result = DB::select($qry); $log = []; foreach ($result as $v) { $log[$v->id] = $v->val; diff --git a/database/migrations/2020_10_27_101759_repair_status_to_string_data.php b/database/migrations/2020_10_27_101759_repair_status_to_string_data.php index f3833f5a98..dd3b9ad375 100644 --- a/database/migrations/2020_10_27_101759_repair_status_to_string_data.php +++ b/database/migrations/2020_10_27_101759_repair_status_to_string_data.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (! Schema::hasColumn('devices', 'repair_status_str')) { Schema::table('devices', function (Blueprint $table) { @@ -33,35 +31,13 @@ public function up() DB::table('devices') ->where('repair_status', 0) ->update(['repair_status_str' => 'Unknown']); - DB::unprepared("CREATE TRIGGER `repair_status_str_up` -BEFORE UPDATE ON `devices` FOR EACH ROW -SET NEW.repair_status_str = CASE - WHEN NEW.repair_status = 1 THEN 'Fixed' - WHEN NEW.repair_status = 2 THEN 'Repairable' - WHEN NEW.repair_status = 3 THEN 'End of life' - ELSE 'Unknown' -END; -"); - DB::unprepared("CREATE TRIGGER `repair_status_str_in` -BEFORE INSERT ON `devices` FOR EACH ROW -SET NEW.repair_status_str = CASE - WHEN NEW.repair_status = 1 THEN 'Fixed' - WHEN NEW.repair_status = 2 THEN 'Repairable' - WHEN NEW.repair_status = 3 THEN 'End of life' - ELSE 'Unknown' -END; -"); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { - DB::unprepared('DROP TRIGGER IF EXISTS `repair_status_str_in`'); - DB::unprepared('DROP TRIGGER IF EXISTS `repair_status_str_up`'); if (Schema::hasColumn('devices', 'repair_status_str')) { Schema::table('devices', function (Blueprint $table) { $table->dropColumn('repair_status_str'); diff --git a/database/migrations/2021_01_11_161917_cancellations.php b/database/migrations/2021_01_11_161917_cancellations.php index 5779b8c0e3..b3e1808371 100644 --- a/database/migrations/2021_01_11_161917_cancellations.php +++ b/database/migrations/2021_01_11_161917_cancellations.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->boolean('cancelled')->after('deleted_at')->default(false); @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->dropColumn('cancelled'); diff --git a/database/migrations/2021_03_22_092800_tabicat_ora_setup.php b/database/migrations/2021_03_22_092800_tabicat_ora_setup.php index fc90afe418..19e5a4b3d4 100755 --- a/database/migrations/2021_03_22_092800_tabicat_ora_setup.php +++ b/database/migrations/2021_03_22_092800_tabicat_ora_setup.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (! Schema::hasTable('devices_faults_tablets_ora_opinions')) { Schema::create('devices_faults_tablets_ora_opinions', function (Blueprint $table) { @@ -237,10 +235,8 @@ protected function _FaultTypes() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_faults_tablets_ora_adjudicated'); Schema::dropIfExists('devices_faults_tablets_ora_opinions'); diff --git a/database/migrations/2021_04_06_113426_printcat_ora_setup.php b/database/migrations/2021_04_06_113426_printcat_ora_setup.php index 85aebaaff2..59c0e3fc83 100644 --- a/database/migrations/2021_04_06_113426_printcat_ora_setup.php +++ b/database/migrations/2021_04_06_113426_printcat_ora_setup.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (! Schema::hasTable('devices_faults_printers_ora_opinions')) { Schema::create('devices_faults_printers_ora_opinions', function (Blueprint $table) { @@ -222,10 +220,8 @@ protected function _FaultTypes() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_faults_printers_ora_adjudicated'); Schema::dropIfExists('devices_faults_printers_ora_opinions'); diff --git a/database/migrations/2021_04_16_095410_aggregate_categories.php b/database/migrations/2021_04_16_095410_aggregate_categories.php index d73882b367..2b2a92e991 100644 --- a/database/migrations/2021_04_16_095410_aggregate_categories.php +++ b/database/migrations/2021_04_16_095410_aggregate_categories.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('categories', function (Blueprint $table) { $table->boolean('aggregate'); @@ -37,10 +35,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('categories', function (Blueprint $table) { $table->dropColumn('aggregate'); diff --git a/database/migrations/2021_04_26_115247_add_postcode.php b/database/migrations/2021_04_26_115247_add_postcode.php index a5c51e307e..d5b1fc26d9 100644 --- a/database/migrations/2021_04_26_115247_add_postcode.php +++ b/database/migrations/2021_04_26_115247_add_postcode.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->string('postcode', 32); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('postcode'); diff --git a/database/migrations/2021_05_05_151211_audit_issue.php b/database/migrations/2021_05_05_151211_audit_issue.php index 9a9697863d..a2d98eb551 100644 --- a/database/migrations/2021_05_05_151211_audit_issue.php +++ b/database/migrations/2021_05_05_151211_audit_issue.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('audits', function (Blueprint $table) { $table->string('old_values', '4294967295')->change(); @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('audits', function (Blueprint $table) { $table->string('old_values', '16777215')->change(); diff --git a/database/migrations/2021_05_11_130314_create_microtask_surveys.php b/database/migrations/2021_05_11_130314_create_microtask_surveys.php index c7720d1ff6..374c6aa9dc 100644 --- a/database/migrations/2021_05_11_130314_create_microtask_surveys.php +++ b/database/migrations/2021_05_11_130314_create_microtask_surveys.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (! Schema::hasTable('microtask_surveys')) { Schema::create( @@ -33,10 +31,8 @@ function (Blueprint $table) { /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('microtask_surveys'); } diff --git a/database/migrations/2021_05_14_105028_devices_updated_at.php b/database/migrations/2021_05_14_105028_devices_updated_at.php index 6ffdde3d6b..031e11e209 100644 --- a/database/migrations/2021_05_14_105028_devices_updated_at.php +++ b/database/migrations/2021_05_14_105028_devices_updated_at.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->datetime('devices_updated_at')->nullable(); @@ -24,10 +22,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->dropColumn('devices_updated_at'); diff --git a/database/migrations/2021_05_14_173108_repairdir_role.php b/database/migrations/2021_05_14_173108_repairdir_role.php index ace6d03d97..5077ca6f25 100644 --- a/database/migrations/2021_05_14_173108_repairdir_role.php +++ b/database/migrations/2021_05_14_173108_repairdir_role.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (! Schema::hasColumn('users', 'repairdir_role')) { Schema::table('users', function (Blueprint $table) { @@ -22,10 +20,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2021_05_21_130659_discourse_thread.php b/database/migrations/2021_05_21_130659_discourse_thread.php index fcc485b701..13f64d49ec 100644 --- a/database/migrations/2021_05_21_130659_discourse_thread.php +++ b/database/migrations/2021_05_21_130659_discourse_thread.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->string('discourse_thread', 255)->nullable(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->dropColumn('discourse_thread'); diff --git a/database/migrations/2021_06_09_164834_no_null_problems.php b/database/migrations/2021_06_09_164834_no_null_problems.php index 713bd5a197..4ef02511f3 100644 --- a/database/migrations/2021_06_09_164834_no_null_problems.php +++ b/database/migrations/2021_06_09_164834_no_null_problems.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // See https://github.com/doctrine/dbal/issues/3161. DB::connection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::connection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); diff --git a/database/migrations/2021_06_21_105938_battcat_ora_setup.php b/database/migrations/2021_06_21_105938_battcat_ora_setup.php index 229c1e69c2..5836575576 100644 --- a/database/migrations/2021_06_21_105938_battcat_ora_setup.php +++ b/database/migrations/2021_06_21_105938_battcat_ora_setup.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('devices_faults_batteries_ora_opinions', function (Blueprint $table) { $table->increments('id'); @@ -138,10 +136,8 @@ protected function _FaultTypes() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_faults_batteries_ora_adjudicated'); Schema::dropIfExists('devices_faults_batteries_ora_opinions'); diff --git a/database/migrations/2021_07_14_125845_battcat_ora_changes.php b/database/migrations/2021_07_14_125845_battcat_ora_changes.php index a786fe4330..9731c11797 100644 --- a/database/migrations/2021_07_14_125845_battcat_ora_changes.php +++ b/database/migrations/2021_07_14_125845_battcat_ora_changes.php @@ -6,10 +6,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::table('fault_types_batteries')->where('id', '=', 14)->update([ 'title' => 'Unrepairable corrosion or leakage', @@ -68,10 +66,8 @@ protected function _FaultTypes() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { } }; diff --git a/database/migrations/2021_08_06_234516_drop_view_waste_emission_ratio.php b/database/migrations/2021_08_06_234516_drop_view_waste_emission_ratio.php index b12335e55f..49a97b9987 100644 --- a/database/migrations/2021_08_06_234516_drop_view_waste_emission_ratio.php +++ b/database/migrations/2021_08_06_234516_drop_view_waste_emission_ratio.php @@ -8,20 +8,16 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('DROP VIEW IF EXISTS `view_waste_emission_ratio`;'); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // } diff --git a/database/migrations/2021_08_13_000439_update_lca_unpowered_categories.php b/database/migrations/2021_08_13_000439_update_lca_unpowered_categories.php index 65ba5580b2..1ecc0da9ff 100644 --- a/database/migrations/2021_08_13_000439_update_lca_unpowered_categories.php +++ b/database/migrations/2021_08_13_000439_update_lca_unpowered_categories.php @@ -26,10 +26,8 @@ c2.footprint as footprint_old FROM `restarters_db_test`.categories c1 RIGHT JOIN `restarters.test`.categories c2 ON c2.idcategories = c1.idcategories - * - * @return void */ - public function up() + public function up(): void { DB::statement('SET foreign_key_checks=0'); DB::table('categories')->insert([ @@ -149,15 +147,13 @@ public function up() 'aggregate' => 1, ]); - DB::statement(DB::raw('UPDATE categories SET revision=2')); + DB::statement('UPDATE categories SET revision=2'); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::statement('SET foreign_key_checks=0'); DB::table('categories')->where('idcategories', 6)->delete(); @@ -224,6 +220,6 @@ public function down() 'aggregate' => 0, ]); - DB::statement(DB::raw('UPDATE categories SET revision=1')); + DB::statement('UPDATE categories SET revision=1'); } }; diff --git a/database/migrations/2021_08_16_133342_event_link.php b/database/migrations/2021_08_16_133342_event_link.php index 79fbe55384..5810679edc 100644 --- a/database/migrations/2021_08_16_133342_event_link.php +++ b/database/migrations/2021_08_16_133342_event_link.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('events', function (Blueprint $table) { $table->string('link')->nullable(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('events', function (Blueprint $table) { $table->dropColumn('link'); diff --git a/database/migrations/2021_09_10_093142_autoapprove_events.php b/database/migrations/2021_09_10_093142_autoapprove_events.php index 3946288e4f..45af2e9cfd 100644 --- a/database/migrations/2021_09_10_093142_autoapprove_events.php +++ b/database/migrations/2021_09_10_093142_autoapprove_events.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('networks', function (Blueprint $table) { $table->boolean('auto_approve_events')->default(false); @@ -27,10 +25,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('networks', function (Blueprint $table) { $table->dropColumn('auto_approve_events'); diff --git a/database/migrations/2021_10_04_124708_fix_category_names.php b/database/migrations/2021_10_04_124708_fix_category_names.php index b12ba07d98..9ac3f7e339 100644 --- a/database/migrations/2021_10_04_124708_fix_category_names.php +++ b/database/migrations/2021_10_04_124708_fix_category_names.php @@ -6,10 +6,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { $cats = [ 19 => 'PC accessory', @@ -27,10 +25,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { $cats = [ 19 => 'PC Accessory', diff --git a/database/migrations/2021_10_27_093744_group_discourse_group.php b/database/migrations/2021_10_27_093744_group_discourse_group.php index 9ff618c9eb..2f4b94e9f7 100644 --- a/database/migrations/2021_10_27_093744_group_discourse_group.php +++ b/database/migrations/2021_10_27_093744_group_discourse_group.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->string('discourse_group', 255)->nullable(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('discourse_group'); diff --git a/database/migrations/2021_12_08_100326_longer_language.php b/database/migrations/2021_12_08_100326_longer_language.php index 651655a874..5613347866 100644 --- a/database/migrations/2021_12_08_100326_longer_language.php +++ b/database/migrations/2021_12_08_100326_longer_language.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('users', function (Blueprint $table) { $table->string('language', 5)->change(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('users', function (Blueprint $table) { $table->string('language', 2)->change(); diff --git a/database/migrations/2022_01_04_123128_group_discourse_logo.php b/database/migrations/2022_01_04_123128_group_discourse_logo.php index 863d5267a8..2e747fd503 100644 --- a/database/migrations/2022_01_04_123128_group_discourse_logo.php +++ b/database/migrations/2022_01_04_123128_group_discourse_logo.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->integer('discourse_logo')->default(null)->nullable()->comment('ID of last Laraval Group image applied to Discourse Group'); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('discourse_group'); diff --git a/database/migrations/2022_01_24_101405_timezones.php b/database/migrations/2022_01_24_101405_timezones.php index 83d01cb831..0e54592213 100644 --- a/database/migrations/2022_01_24_101405_timezones.php +++ b/database/migrations/2022_01_24_101405_timezones.php @@ -5,15 +5,14 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; use App\Party; +use Illuminate\Support\Facades\DB; return new class extends Migration { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { # Timezones for groups and events. Schema::table('groups', function (Blueprint $table) { @@ -31,9 +30,9 @@ public function up() }); # Back up the existing data. - DB::statement(DB::raw('UPDATE events SET event_date_old = event_date')); - DB::statement(DB::raw('UPDATE events SET start_old = start')); - DB::statement(DB::raw('UPDATE events SET end_old = end')); + DB::statement('UPDATE events SET event_date_old = event_date'); + DB::statement('UPDATE events SET start_old = start'); + DB::statement('UPDATE events SET end_old = end'); # Set up the new timestamps. Currently event_start/time/end are all implicitly localised to the timezone # of the group. @@ -53,7 +52,7 @@ public function up() error_log("Event {$event->idevents} {$atts['event_date']} {$atts['start']}-{$atts['end']} => $event_start_utc - $event_end_utc"); - DB::statement(DB::raw("UPDATE events SET timezone = '$tz', event_start_utc = '$event_start_utc', event_end_utc = '$event_end_utc' WHERE idevents = {$event->idevents}")); + DB::statement("UPDATE events SET timezone = '$tz', event_start_utc = '$event_start_utc', event_end_utc = '$event_end_utc' WHERE idevents = {$event->idevents}"); } # Set up virtual generated columns which replicate event_date/start/end but generated from the new timestamps. @@ -73,10 +72,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { # Restore the event_date/state/end fields. Schema::table('events', function (Blueprint $table) { @@ -91,9 +88,9 @@ public function down() $table->time('end'); }); - DB::statement(DB::raw('UPDATE events SET event_date= event_date_old')); - DB::statement(DB::raw('UPDATE events SET start = start_old')); - DB::statement(DB::raw('UPDATE events SET start = end_old')); + DB::statement('UPDATE events SET event_date= event_date_old'); + DB::statement('UPDATE events SET start = start_old'); + DB::statement('UPDATE events SET start = end_old'); Schema::table('groups', function (Blueprint $table) { $table->dropColumn('timezone'); diff --git a/database/migrations/2022_02_04_132146_category_descriptions.php b/database/migrations/2022_02_04_132146_category_descriptions.php index 87b60affd8..f27e2b397b 100644 --- a/database/migrations/2022_02_04_132146_category_descriptions.php +++ b/database/migrations/2022_02_04_132146_category_descriptions.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('categories', function (Blueprint $table) { $table->string('description_short', 255); @@ -77,10 +75,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('categories', function (Blueprint $table) { $table->dropColumn('description_short'); diff --git a/database/migrations/2022_02_04_140651_refactor_estimate_column.php b/database/migrations/2022_02_04_140651_refactor_estimate_column.php index 63a2ed28af..2707d285c6 100644 --- a/database/migrations/2022_02_04_140651_refactor_estimate_column.php +++ b/database/migrations/2022_02_04_140651_refactor_estimate_column.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `devices` ADD `estimate_old` VARCHAR(10) AFTER `estimate`'); DB::statement('UPDATE devices SET `estimate_old` = `estimate`'); @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::statement('ALTER TABLE `devices` DROP `estimate`'); DB::statement('ALTER TABLE `devices` CHANGE `estimate_old` `estimate` VARCHAR(10)'); diff --git a/database/migrations/2022_02_16_085124_refactor_age_column.php b/database/migrations/2022_02_16_085124_refactor_age_column.php index dccf7999d8..8617e0a520 100644 --- a/database/migrations/2022_02_16_085124_refactor_age_column.php +++ b/database/migrations/2022_02_16_085124_refactor_age_column.php @@ -6,10 +6,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { DB::statement('ALTER TABLE `devices` ADD `age_old` VARCHAR(10) AFTER `age`'); DB::statement('UPDATE devices SET `age_old` = `age`'); @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { DB::statement('ALTER TABLE `devices` DROP `age`'); DB::statement('ALTER TABLE `devices` CHANGE `age_old` `age` VARCHAR(10)'); diff --git a/database/migrations/2022_03_02_102531_dustup_ora_setup.php b/database/migrations/2022_03_02_102531_dustup_ora_setup.php index 31bb91809d..11d41f4c48 100644 --- a/database/migrations/2022_03_02_102531_dustup_ora_setup.php +++ b/database/migrations/2022_03_02_102531_dustup_ora_setup.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { if (!Schema::hasTable('devices_faults_vacuums_ora_opinions')) { Schema::create('devices_faults_vacuums_ora_opinions', function (Blueprint $table) { @@ -211,10 +209,8 @@ protected function _FaultTypes() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::dropIfExists('devices_faults_vacuums_ora_adjudicated'); Schema::dropIfExists('devices_faults_vacuums_ora_opinions'); diff --git a/database/migrations/2022_07_19_093250_add_brand_indexes.php b/database/migrations/2022_07_19_093250_add_brand_indexes.php index 151ea004cd..34040b03fa 100644 --- a/database/migrations/2022_07_19_093250_add_brand_indexes.php +++ b/database/migrations/2022_07_19_093250_add_brand_indexes.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('brands', function (Blueprint $table) { $table->index('brand_name'); @@ -23,10 +21,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('devices', function (Blueprint $table) { $table->dropIndex('devices_brand_index'); diff --git a/database/migrations/2022_08_10_091731_unique_network_names.php b/database/migrations/2022_08_10_091731_unique_network_names.php index 71fd433587..3a71308bc3 100644 --- a/database/migrations/2022_08_10_091731_unique_network_names.php +++ b/database/migrations/2022_08_10_091731_unique_network_names.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // Make networks table unique on name Schema::table('networks', function (Blueprint $table) { @@ -21,10 +19,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // Restore networks table to be non-unique Schema::table('networks', function (Blueprint $table) { diff --git a/database/migrations/2022_09_19_135345_add_group_phone.php b/database/migrations/2022_09_19_135345_add_group_phone.php index 7b570125cc..2405c389c3 100644 --- a/database/migrations/2022_09_19_135345_add_group_phone.php +++ b/database/migrations/2022_09_19_135345_add_group_phone.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->string('phone', 40)->nullable(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('phone'); diff --git a/database/migrations/2022_10_06_162442_network_logo.php b/database/migrations/2022_10_06_162442_network_logo.php index f0ed57f2c9..d3e9a982a5 100644 --- a/database/migrations/2022_10_06_162442_network_logo.php +++ b/database/migrations/2022_10_06_162442_network_logo.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('networks', function (Blueprint $table) { $table->string('logo', 255)->nullable(); @@ -36,10 +34,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('networks', function (Blueprint $table) { $table->dropColumn('logo'); diff --git a/database/migrations/2022_11_07_152558_record_approval.php b/database/migrations/2022_11_07_152558_record_approval.php index 7464b73a10..4e862af38f 100644 --- a/database/migrations/2022_11_07_152558_record_approval.php +++ b/database/migrations/2022_11_07_152558_record_approval.php @@ -3,15 +3,14 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\DB; -class RecordApproval extends Migration +return new class extends Migration { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->boolean('approved')->default(false); @@ -21,18 +20,16 @@ public function up() $table->boolean('approved')->default(false); }); - DB::statement(DB::raw("UPDATE `groups` SET approved = wordpress_post_id IS NOT NULL")); - DB::statement(DB::raw("UPDATE `events` SET approved = wordpress_post_id IS NOT NULL")); - DB::statement(DB::raw("UPDATE `groups` SET wordpress_post_id = NULL WHERE wordpress_post_id = '99999'")); - DB::statement(DB::raw("UPDATE `events` SET wordpress_post_id = NULL WHERE wordpress_post_id = '99999'")); + DB::statement("UPDATE `groups` SET approved = wordpress_post_id IS NOT NULL"); + DB::statement("UPDATE `events` SET approved = wordpress_post_id IS NOT NULL"); + DB::statement("UPDATE `groups` SET wordpress_post_id = NULL WHERE wordpress_post_id = '99999'"); + DB::statement("UPDATE `events` SET wordpress_post_id = NULL WHERE wordpress_post_id = '99999'"); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('approved'); @@ -42,4 +39,4 @@ public function down() $table->dropColumn('approved'); }); } -} +}; diff --git a/database/migrations/2022_11_30_000000_add_uuid_to_failed_jobs_table.php b/database/migrations/2022_11_30_000000_add_uuid_to_failed_jobs_table.php index f6048bb3a9..68c816c691 100644 --- a/database/migrations/2022_11_30_000000_add_uuid_to_failed_jobs_table.php +++ b/database/migrations/2022_11_30_000000_add_uuid_to_failed_jobs_table.php @@ -10,10 +10,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('failed_jobs', function (Blueprint $table) { $table->string('uuid')->after('id')->nullable()->unique(); @@ -28,10 +26,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('failed_jobs', function (Blueprint $table) { $table->dropColumn('uuid'); diff --git a/database/migrations/2023_04_19_153453_network_data.php b/database/migrations/2023_04_19_153453_network_data.php index 3a7c7db8fc..767e8d0fee 100644 --- a/database/migrations/2023_04_19_153453_network_data.php +++ b/database/migrations/2023_04_19_153453_network_data.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { // Add JSON columns. In older versions of MySQL these will be LONGTEXT rather than JSON, so // if we ever want to do extraction/query/indexing on them we might need to migrate them at that point. @@ -25,10 +23,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('network_data'); diff --git a/database/migrations/2023_05_09_132601_useful_urls.php b/database/migrations/2023_05_09_132601_useful_urls.php index 9e944fe8f2..02fd874ed4 100644 --- a/database/migrations/2023_05_09_132601_useful_urls.php +++ b/database/migrations/2023_05_09_132601_useful_urls.php @@ -8,20 +8,16 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::drop('devices_urls'); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::create('devices_urls', function (Blueprint $table) { $table->increments('id'); diff --git a/database/migrations/2023_06_07_130653_new_zealand.php b/database/migrations/2023_06_07_130653_new_zealand.php index e2d196a888..ab25f6adca 100644 --- a/database/migrations/2023_06_07_130653_new_zealand.php +++ b/database/migrations/2023_06_07_130653_new_zealand.php @@ -3,26 +3,23 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\DB; return new class extends Migration { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { - DB::statement(DB::raw("update `groups` set country = 'Aotearoa New Zealand' where country = 'New Zealand';")); + DB::statement("update `groups` set country = 'Aotearoa New Zealand' where country = 'New Zealand';"); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { - DB::statement(DB::raw("update `groups` set country = 'New Zealand' where country = 'Aotearoa New Zealand';")); + DB::statement("update `groups` set country = 'New Zealand' where country = 'Aotearoa New Zealand';"); } }; diff --git a/database/migrations/2023_06_12_153317_country_codes.php b/database/migrations/2023_06_12_153317_country_codes.php index 789b2a855c..682bb254a9 100644 --- a/database/migrations/2023_06_12_153317_country_codes.php +++ b/database/migrations/2023_06_12_153317_country_codes.php @@ -9,15 +9,13 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { $countries = array_flip(App\Helpers\Fixometer::getAllCountries('en')); // Users has country column which is a code, except for GBR; fix the contents and rename it. - DB::update(DB::raw("UPDATE users SET country = 'GB' WHERE country = 'GBR'")); + DB::update("UPDATE users SET country = 'GB' WHERE country = 'GBR'"); Schema::table('users', function (Blueprint $table) { $table->renameColumn('country', 'country_code'); @@ -30,7 +28,7 @@ public function up() $table->string('country_code', 2)->after('area')->nullable(); }); - $groups = DB::select(DB::raw('SELECT idgroups, country FROM `groups`')); + $groups = DB::select('SELECT idgroups, country FROM `groups`'); foreach ($groups as $g) { // Countries are stored in English. @@ -46,10 +44,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('country_code'); @@ -59,6 +55,6 @@ public function down() $table->renameColumn('country_code', 'country'); }); - DB::update(DB::raw("UPDATE users SET country = 'GBR' WHERE country = 'GB'")); + DB::update("UPDATE users SET country = 'GBR' WHERE country = 'GB'"); } }; diff --git a/database/migrations/2023_08_02_183803_item_type_collation.php b/database/migrations/2023_08_02_183803_item_type_collation.php index fa7003b823..923a1b9037 100644 --- a/database/migrations/2023_08_02_183803_item_type_collation.php +++ b/database/migrations/2023_08_02_183803_item_type_collation.php @@ -3,26 +3,23 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\DB; return new class extends Migration { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { - DB::statement(DB::raw("ALTER TABLE `devices` CHANGE `item_type` `item_type` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL;")); + DB::statement("ALTER TABLE `devices` CHANGE `item_type` `item_type` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL;"); } /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { - DB::statement(DB::raw("ALTER TABLE `devices` CHANGE `item_type` `item_type` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;")); + DB::statement("ALTER TABLE `devices` CHANGE `item_type` `item_type` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;"); } }; diff --git a/database/migrations/2023_08_14_112539_group_email.php b/database/migrations/2023_08_14_112539_group_email.php index 8fed6d9480..229cba61b0 100644 --- a/database/migrations/2023_08_14_112539_group_email.php +++ b/database/migrations/2023_08_14_112539_group_email.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->string('email', 255)->nullable(); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('email'); diff --git a/database/migrations/2023_12_19_161808_customisable_banners.php b/database/migrations/2023_12_19_161808_customisable_banners.php index 26b039c36a..76fcbf0416 100644 --- a/database/migrations/2023_12_19_161808_customisable_banners.php +++ b/database/migrations/2023_12_19_161808_customisable_banners.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::create('alerts', function (Blueprint $table) { $table->increments('id'); @@ -28,10 +26,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::drop('alerts'); } diff --git a/database/migrations/2024_08_27_123452_group_archive.php b/database/migrations/2024_08_27_123452_group_archive.php index 573e813a95..dcd5026a8a 100644 --- a/database/migrations/2024_08_27_123452_group_archive.php +++ b/database/migrations/2024_08_27_123452_group_archive.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { Schema::table('groups', function (Blueprint $table) { $table->date('archived_at')->default(null)->nullable()->comment('Date the group was archived'); @@ -20,10 +18,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { Schema::table('groups', function (Blueprint $table) { $table->dropColumn('archived_at'); diff --git a/database/migrations/2024_09_16_093650_inactive_groups.php b/database/migrations/2024_09_16_093650_inactive_groups.php index 37db481257..62085a3f7a 100644 --- a/database/migrations/2024_09_16_093650_inactive_groups.php +++ b/database/migrations/2024_09_16_093650_inactive_groups.php @@ -8,10 +8,8 @@ { /** * Run the migrations. - * - * @return void */ - public function up() + public function up(): void { $groups = \App\Group::join('grouptags_groups', 'groups.idgroups', '=', 'grouptags_groups.group') ->join('group_tags', 'grouptags_groups.group_tag', '=', 'group_tags.id') @@ -30,10 +28,8 @@ public function up() /** * Reverse the migrations. - * - * @return void */ - public function down() + public function down(): void { // Add [INACTIVE] into all groups with archived_at. $groups = \App\Group::whereNotNull('archived_at')->get(); diff --git a/database/migrations/2025_01_08_000001_drop_repair_status_triggers.php b/database/migrations/2025_01_08_000001_drop_repair_status_triggers.php new file mode 100644 index 0000000000..3edf06a2e0 --- /dev/null +++ b/database/migrations/2025_01_08_000001_drop_repair_status_triggers.php @@ -0,0 +1,28 @@ +tables as $table) { diff --git a/database/migrations/2025_04_19_000000_rename_password_resets_table.php b/database/migrations/2025_04_19_000000_rename_password_resets_table.php new file mode 100644 index 0000000000..f0ad37571b --- /dev/null +++ b/database/migrations/2025_04_19_000000_rename_password_resets_table.php @@ -0,0 +1,24 @@ +truncate(); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 625878c49a..927de3d65b 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -8,10 +8,8 @@ class DatabaseSeeder extends Seeder { /** * Seed the application's database. - * - * @return void */ - public function run() + public function run(): void { $this->call(DefaultSkills::class); $this->call(BrandList::class); diff --git a/database/seeders/DefaultSkills.php b/database/seeders/DefaultSkills.php index 5198f39d6b..6df89611eb 100644 --- a/database/seeders/DefaultSkills.php +++ b/database/seeders/DefaultSkills.php @@ -9,10 +9,8 @@ class DefaultSkills extends Seeder { /** * Run the database seeds. - * - * @return void */ - public function run() + public function run(): void { DB::table('skills')->truncate(); diff --git a/database/seeders/NetworksTableSeeder.php b/database/seeders/NetworksTableSeeder.php index ae5650bf73..66e04101dc 100644 --- a/database/seeders/NetworksTableSeeder.php +++ b/database/seeders/NetworksTableSeeder.php @@ -10,10 +10,8 @@ class NetworksTableSeeder extends Seeder { /** * Run the database seeds. - * - * @return void */ - public function run() + public function run(): void { // Restarters network is REQUIRED, so is created as part of the database // migrations with id = 1. diff --git a/docker-compose.yml b/docker-compose.yml index b6da74a10a..4e8272dcad 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,10 +3,6 @@ # - Restarters web server: http://www.example.com:8001 (Admin: jane@bloggs.net/passw0rd) # - A Database: Exposed on port 3306 internally # -# TODO The domain name could be better but needs some configuration on the Discourse images which is hard. -# TODO It doesn't yet include the wiki. -# TODO If your host is Linux, this probably only works if you run as root. -# # On the machine where you will be using your browser to access the Restarters / Discourse sites once set up on Docker, # add a record to your hosts file to point the domain www.example.com to the machine. # @@ -23,7 +19,6 @@ # # Then: # - edit .env and set GOOGLE_API_CONSOLE_KEY to the dev key. -# TODO This isn't checked in to the codebase, but once this works on Circle then we can put it in an env variable and edit it in via docker_run.sh. # - log in to the restarters container using: docker exec -it restarters bash # - run UT using: export DB_TEST_HOST=restarters_db; php vendor/phpunit/phpunit/phpunit --configuration ./phpunit.xml # @@ -66,11 +61,6 @@ # Database Access: # To connect to Discourse's PostgreSQL database from the restarters container: # psql -h postgresql -U bn_discourse -p 5432 -w bitnami_discourse -# -# TODO This is stock Discourse - no theme. Would be nice to have the theme, but that doesn't matter so far as -# testing the integration. - -version: '3' services: # Core services - always enabled @@ -83,8 +73,8 @@ services: context: . dockerfile: Dockerfile args: - UID: ${UID} - GID: ${GID} + UID: ${UID:-1000} + GID: ${GID:-1000} container_name: restarters restart: unless-stopped tty: true @@ -93,7 +83,10 @@ services: SERVICE_TAGS: dev UID: ${UID} GID: ${GID} + CIRCLECI: ${CIRCLECI:-false} working_dir: /var/www + ports: + - "5173:5173" volumes: # We share the current folder into /var/www. This means code changes on the host will get picked up # by the client. @@ -119,7 +112,7 @@ services: restarters_db: profiles: ["core", "debug", "discourse"] - image: mysql:5.7.33 + image: mysql:8.0 container_name: restarters_db restart: unless-stopped tty: true @@ -168,6 +161,23 @@ services: networks: - app-network + # Playwright testing service + playwright: + profiles: ["core", "debug", "discourse"] + image: mcr.microsoft.com/playwright:v1.55.1-noble + container_name: restarters_playwright + working_dir: /var/www + volumes: + - ./:/var/www:rw + networks: + - app-network + depends_on: + - restarters_nginx + environment: + - PLAYWRIGHT_BASE_URL=http://restarters_nginx + # Install Playwright browsers after npm install to ensure version match + command: /bin/sh -c "npx playwright install chromium && tail -f /dev/null" + # From here, it's stuff that Discourse needs. # # The other Docker images hardcode the name of the postgresql server in some places, so we can't prefix that. @@ -176,7 +186,7 @@ services: # psql -h postgresql -U bn_discourse -p 5432 -w bitnami_discourse postgresql: profiles: ["discourse"] - image: docker.io/bitnami/postgresql:11 + image: docker.io/bitnamilegacy/postgresql:11 container_name: postgresql volumes: - 'postgresql_data:/bitnami/postgresql' @@ -189,7 +199,7 @@ services: restarters_discourse_redis: profiles: ["discourse"] - image: docker.io/bitnami/redis:6.0 + image: docker.io/bitnamilegacy/redis:6.0 container_name: restarters_discourse_redis environment: - ALLOW_EMPTY_PASSWORD=yes @@ -200,7 +210,7 @@ services: restarters_discourse: profiles: ["discourse"] - image: docker.io/bitnami/discourse:2 + image: docker.io/bitnamilegacy/discourse:2 container_name: restarters_discourse ports: - '8003:80' @@ -229,7 +239,7 @@ services: sidekiq: profiles: ["discourse"] - image: docker.io/bitnami/discourse:2 + image: docker.io/bitnamilegacy/discourse:2 container_name: restarters_discourse_sidekiq depends_on: - restarters_discourse diff --git a/docker_run.sh b/docker_run.sh index 66ad6babda..cac991d258 100644 --- a/docker_run.sh +++ b/docker_run.sh @@ -3,7 +3,6 @@ # # We install composer dependencies in here rather than during the build step so that if we switch branches # and restart the container, it works. - USER_ID=${UID:-1000} GROUP_ID=${GID:-1000} @@ -32,14 +31,27 @@ sed -i 's/DISCOURSE_SECRET=.*$/DISCOURSE_SECRET=mustbetencharacters/g' .env sed -i 's/SESSION_DOMAIN=.*$/SESSION_DOMAIN=/g' phpunit.xml sed -i 's/DB_TEST_HOST=.*$/DB_TEST_HOST=restarters_db/g' phpunit.xml -echo "Fixing file permissions with ${USER_ID}:${GROUP_ID}" -# Only change ownership of directories that need it, excluding .git and other system files -# This prevents permission errors on files owned by the host system -for dir in storage bootstrap/cache vendor node_modules public/uploads; do - if [ -d "$dir" ]; then - chown -R ${USER_ID}:${GROUP_ID} "$dir" 2>/dev/null || true +# Generic wait function that takes: service_name, check_command, max_attempts, sleep_interval +wait_for_service() { + local service_name="$1" + local check_command="$2" + local max_attempts="$3" + local sleep_interval="$4" + + echo "Waiting for $service_name..." + local attempt=0 + while [ $attempt -lt $max_attempts ]; do + if eval "$check_command" >/dev/null 2>&1; then + echo "✓ $service_name is ready" + return 0 fi -done + echo " $service_name not ready, waiting... (attempt $((attempt + 1))/$max_attempts)" + sleep "$sleep_interval" + attempt=$((attempt + 1)) + done + echo "❌ $service_name failed to start after $max_attempts attempts" + exit 1 +} # Ensure storage directories exist and have correct permissions mkdir -p storage/framework/cache/data @@ -47,19 +59,43 @@ mkdir -p storage/framework/sessions mkdir -p storage/framework/views mkdir -p storage/logs mkdir -p bootstrap/cache +mkdir -p uploads +mkdir -p public/uploads + +# Only change ownership of directories that need it, excluding .git and other system files +# This prevents permission errors on files owned by the host system +echo "Fixing file permissions with ${USER_ID}:${GROUP_ID}" +for dir in storage bootstrap/cache vendor node_modules uploads public/uploads; do + if [ -d "$dir" ]; then + chown -R ${USER_ID}:${GROUP_ID} "$dir" 2>/dev/null || true + fi +done + +# Wait for MySQL database to be ready before running migrations +wait_for_service "MySQL database" "nc -z restarters_db 3306" 60 5 -php artisan migrate +php artisan migrate:fresh --seed npm install --legacy-peer-deps npm rebuild node-sass -php artisan lang:js --no-lib resources/js/translations.js -npm run watch-poll& +# Install Playwright for testing (system deps already in Dockerfile) +npm install -D @playwright/test +npx playwright install + +# Start Vite dev server in the background with logging +echo "Starting Vite dev server..." +nohup npm run dev > /tmp/vite.log 2>&1 & +echo "Vite dev server started with PID $!" + php artisan key:generate php artisan cache:clear php artisan config:clear +# Generate OpenAPI documentation needed for tests +php artisan l5-swagger:generate + # Ensure we have the admin user -echo "User::create(['name'=>'Jane Bloggs','email'=>'jane@bloggs.net','password'=>Hash::make('passw0rd'),'role'=>2,'consent_past_data'=>'2021-01-01','consent_future_data'=>'2021-01-01','consent_gdpr'=>'2021-01-01']);" | php artisan tinker +echo "User::firstOrCreate(['email'=>'jane@bloggs.net'], ['name'=>'Jane Bloggs','password'=>Hash::make('passw0rd'),'role'=>2,'consent_past_data'=>'2021-01-01','consent_future_data'=>'2021-01-01','consent_gdpr'=>'2021-01-01']);" | php artisan tinker php-fpm diff --git a/docs/Index.html b/docs/Index.html deleted file mode 100644 index 4fa7681e71..0000000000 --- a/docs/Index.html +++ /dev/null @@ -1,548 +0,0 @@ - - - - - - Features - - - - - - - - - - - - -
- Loading... -
- - - - - - - - - - - - -
-
-
-
-
-
-
-
- -
- - -
- -
Generated on:
-
-
-
- -
-
-
-
- - - - -
-

-
-
- -
-
-
-

Background:

-
-
    -
    -
    - -
    -
    - - - - - -
    - -
    -
    - -
    -

    -
    -
    - -
    - -
      - -
        -
      • -
        - - - - - - -
        -
        - : -
        -
        -
        -
      • -
      - -
      - - - Get Link for Scenario - -
      -
      -
      - - -
      - - -
      -
      - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/css/bootstrap.min.css b/docs/css/bootstrap.min.css deleted file mode 100644 index 86ba477d93..0000000000 --- a/docs/css/bootstrap.min.css +++ /dev/null @@ -1,965 +0,0 @@ -/*! - * Bootstrap v2.2.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;} -.clearfix:after{clear:both;} -.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} -.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} -article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} -audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} -audio:not([controls]){display:none;} -html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} -a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -a:hover,a:active{outline:0;} -sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} -sup{top:-0.5em;} -sub{bottom:-0.25em;} -img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} -#map_canvas img,.google-maps img{max-width:none;} -button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} -button,input{*overflow:visible;line-height:normal;} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} -button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;} -input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} -input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} -textarea{overflow:auto;vertical-align:top;} -body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;} -a{color:#0088cc;text-decoration:none;} -a:hover{color:#005580;text-decoration:underline;} -.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);} -.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} -.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} -.row:after{clear:both;} -[class*="span"]{float:left;min-height:1px;margin-left:20px;} -.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.span12{width:940px;} -.span11{width:860px;} -.span10{width:780px;} -.span9{width:700px;} -.span8{width:620px;} -.span7{width:540px;} -.span6{width:460px;} -.span5{width:380px;} -.span4{width:300px;} -.span3{width:220px;} -.span2{width:140px;} -.span1{width:60px;} -.offset12{margin-left:980px;} -.offset11{margin-left:900px;} -.offset10{margin-left:820px;} -.offset9{margin-left:740px;} -.offset8{margin-left:660px;} -.offset7{margin-left:580px;} -.offset6{margin-left:500px;} -.offset5{margin-left:420px;} -.offset4{margin-left:340px;} -.offset3{margin-left:260px;} -.offset2{margin-left:180px;} -.offset1{margin-left:100px;} -.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} -.row-fluid:after{clear:both;} -.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} -.row-fluid [class*="span"]:first-child{margin-left:0;} -.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;} -.row-fluid .span12{width:100%;*width:99.94680851063829%;} -.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} -.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} -.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} -.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} -.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} -.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} -.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} -.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} -.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} -.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} -.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} -.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} -.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} -.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} -.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} -.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} -.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} -.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} -.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} -.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} -.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} -.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} -.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} -.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} -.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} -.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} -.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} -.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} -.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} -.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} -.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} -.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} -.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} -.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} -.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} -[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;} -[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;} -.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;} -.container:after{clear:both;} -.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;} -.container-fluid:after{clear:both;} -p{margin:0 0 10px;} -.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;} -small{font-size:85%;} -strong{font-weight:bold;} -em{font-style:italic;} -cite{font-style:normal;} -.muted{color:#999999;} -.text-warning{color:#c09853;} -a.text-warning:hover{color:#a47e3c;} -.text-error{color:#b94a48;} -a.text-error:hover{color:#953b39;} -.text-info{color:#3a87ad;} -a.text-info:hover{color:#2d6987;} -.text-success{color:#468847;} -a.text-success:hover{color:#356635;} -h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;} -h1,h2,h3{line-height:40px;} -h1{font-size:38.5px;} -h2{font-size:31.5px;} -h3{font-size:24.5px;} -h4{font-size:17.5px;} -h5{font-size:14px;} -h6{font-size:11.9px;} -h1 small{font-size:24.5px;} -h2 small{font-size:17.5px;} -h3 small{font-size:14px;} -h4 small{font-size:14px;} -.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} -ul,ol{padding:0;margin:0 0 10px 25px;} -ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} -li{line-height:20px;} -ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} -dl{margin-bottom:20px;} -dt,dd{line-height:20px;} -dt{font-weight:bold;} -dd{margin-left:10px;} -.dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;} -.dl-horizontal:after{clear:both;} -.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} -.dl-horizontal dd{margin-left:180px;} -hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} -abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;} -abbr.initialism{font-size:90%;text-transform:uppercase;} -blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;} -blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} -blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} -blockquote.pull-right small:before{content:'';} -blockquote.pull-right small:after{content:'\00A0 \2014';} -q:before,q:after,blockquote:before,blockquote:after{content:"";} -address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} -code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} -pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;} -pre code{padding:0;color:inherit;background-color:transparent;border:0;} -.pre-scrollable{max-height:340px;overflow-y:scroll;} -.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} -.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} -a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} -.label-important,.badge-important{background-color:#b94a48;} -.label-important[href],.badge-important[href]{background-color:#953b39;} -.label-warning,.badge-warning{background-color:#f89406;} -.label-warning[href],.badge-warning[href]{background-color:#c67605;} -.label-success,.badge-success{background-color:#468847;} -.label-success[href],.badge-success[href]{background-color:#356635;} -.label-info,.badge-info{background-color:#3a87ad;} -.label-info[href],.badge-info[href]{background-color:#2d6987;} -.label-inverse,.badge-inverse{background-color:#333333;} -.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} -.btn .label,.btn .badge{position:relative;top:-1px;} -.btn-mini .label,.btn-mini .badge{top:0;} -table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} -.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} -.table th{font-weight:bold;} -.table thead th{vertical-align:bottom;} -.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} -.table tbody+tbody{border-top:2px solid #dddddd;} -.table-condensed th,.table-condensed td{padding:4px 5px;} -.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} -.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} -.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} -.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} -.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;} -.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;} -.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} -.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} -.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} -.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;} -table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;} -.table td.span1,.table th.span1{float:none;width:44px;margin-left:0;} -.table td.span2,.table th.span2{float:none;width:124px;margin-left:0;} -.table td.span3,.table th.span3{float:none;width:204px;margin-left:0;} -.table td.span4,.table th.span4{float:none;width:284px;margin-left:0;} -.table td.span5,.table th.span5{float:none;width:364px;margin-left:0;} -.table td.span6,.table th.span6{float:none;width:444px;margin-left:0;} -.table td.span7,.table th.span7{float:none;width:524px;margin-left:0;} -.table td.span8,.table th.span8{float:none;width:604px;margin-left:0;} -.table td.span9,.table th.span9{float:none;width:684px;margin-left:0;} -.table td.span10,.table th.span10{float:none;width:764px;margin-left:0;} -.table td.span11,.table th.span11{float:none;width:844px;margin-left:0;} -.table td.span12,.table th.span12{float:none;width:924px;margin-left:0;} -.table tbody tr.success td{background-color:#dff0d8;} -.table tbody tr.error td{background-color:#f2dede;} -.table tbody tr.warning td{background-color:#fcf8e3;} -.table tbody tr.info td{background-color:#d9edf7;} -.table-hover tbody tr.success:hover td{background-color:#d0e9c6;} -.table-hover tbody tr.error:hover td{background-color:#ebcccc;} -.table-hover tbody tr.warning:hover td{background-color:#faf2cc;} -.table-hover tbody tr.info:hover td{background-color:#c4e3f3;} -form{margin:0 0 20px;} -fieldset{padding:0;margin:0;border:0;} -legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;} -label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;} -input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} -label{display:block;margin-bottom:5px;} -select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;} -input,textarea,.uneditable-input{width:206px;} -textarea{height:auto;} -textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);} -input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer;} -input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;} -select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} -select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} -select[multiple],select[size]{height:auto;} -select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} -.uneditable-input{overflow:hidden;white-space:nowrap;} -.uneditable-textarea{width:auto;height:auto;} -input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;} -input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;} -input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;} -.radio,.checkbox{min-height:20px;padding-left:20px;} -.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;} -.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} -.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} -.input-mini{width:60px;} -.input-small{width:90px;} -.input-medium{width:150px;} -.input-large{width:210px;} -.input-xlarge{width:270px;} -.input-xxlarge{width:530px;} -input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} -.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;} -input,textarea,.uneditable-input{margin-left:0;} -.controls-row [class*="span"]+[class*="span"]{margin-left:20px;} -input.span12, textarea.span12, .uneditable-input.span12{width:926px;} -input.span11, textarea.span11, .uneditable-input.span11{width:846px;} -input.span10, textarea.span10, .uneditable-input.span10{width:766px;} -input.span9, textarea.span9, .uneditable-input.span9{width:686px;} -input.span8, textarea.span8, .uneditable-input.span8{width:606px;} -input.span7, textarea.span7, .uneditable-input.span7{width:526px;} -input.span6, textarea.span6, .uneditable-input.span6{width:446px;} -input.span5, textarea.span5, .uneditable-input.span5{width:366px;} -input.span4, textarea.span4, .uneditable-input.span4{width:286px;} -input.span3, textarea.span3, .uneditable-input.span3{width:206px;} -input.span2, textarea.span2, .uneditable-input.span2{width:126px;} -input.span1, textarea.span1, .uneditable-input.span1{width:46px;} -.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;} -.controls-row:after{clear:both;} -.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;} -.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} -input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} -.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} -.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;} -.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;} -.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} -.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} -.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;} -.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;} -.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} -.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} -.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;} -.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;} -.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} -.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;} -.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;} -.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;} -.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} -input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} -.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;} -.form-actions:after{clear:both;} -.help-block,.help-inline{color:#595959;} -.help-block{display:block;margin-bottom:10px;} -.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} -.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px;} -.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;} -.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} -.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;} -.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} -.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn,.input-append select+.btn-group .btn,.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;} -.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-prepend.input-append .btn-group:first-child{margin-left:0;} -input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} -.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} -.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} -.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} -.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} -.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} -.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;} -.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} -.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} -.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} -.control-group{margin-bottom:10px;} -legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} -.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;} -.form-horizontal .control-group:after{clear:both;} -.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} -.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;} -.form-horizontal .help-block{margin-bottom:0;} -.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px;} -.form-horizontal .form-actions{padding-left:180px;} -.btn{display:inline-block;*border-bottom: 0 none #a2a2a2; - display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*-webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); -**border-left-style: none; - border-left-color: inherit; - border-left-width: 0; - border-right-style: none; - border-right-color: inherit; - border-right-width: 0; - border-top-style: none; - border-top-color: inherit; - border-top-width: 0; -}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} -.btn:active,.btn.active{background-color:#cccccc \9;} -.btn:first-child{*margin-left:0;} -.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} -.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} -.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:2px;} -.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;} -.btn-mini{padding:1px 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} -.btn-block+.btn-block{margin-top:5px;} -input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;} -.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} -.btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);} -.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #0088cc, #0044cc); - border-left-color: #0044cc; - border-right-color: #0044cc; - border-top-color: #0044cc; - border-bottom-color: #002a80; -}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} -.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} -.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #fbb450, #f89406); - border-left-color: #f89406; - border-right-color: #f89406; - border-top-color: #f89406; - border-bottom-color: #ad6704; -}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} -.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} -.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - border-left-color: #bd362f; - border-right-color: #bd362f; - border-top-color: #bd362f; - border-bottom-color: #802420; -}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} -.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} -.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #62c462, #51a351); - border-left-color: #51a351; - border-right-color: #51a351; - border-top-color: #51a351; - border-bottom-color: #387038; -}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} -.btn-success:active,.btn-success.active{background-color:#408140 \9;} -.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - border-left-color: #2f96b4; - border-right-color: #2f96b4; - border-top-color: #2f96b4; - border-bottom-color: #1f6377; -}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} -.btn-info:active,.btn-info.active{background-color:#24748c \9;} -.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #444444, #222222); - border-left-color: #222222; - border-right-color: #222222; - border-top-color: #222222; - border-bottom-color: #000000; -}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} -.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} -button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} -button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} -button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} -button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} -.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent;} -.btn-link[disabled]:hover{color:#333333;text-decoration:none;} -[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;} -.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");} -.icon-glass{background-position:0 0;} -.icon-music{background-position:-24px 0;} -.icon-search{background-position:-48px 0;} -.icon-envelope{background-position:-72px 0;} -.icon-heart{background-position:-96px 0;} -.icon-star{background-position:-120px 0;} -.icon-star-empty{background-position:-144px 0;} -.icon-user{background-position:-168px 0;} -.icon-film{background-position:-192px 0;} -.icon-th-large{background-position:-216px 0;} -.icon-th{background-position:-240px 0;} -.icon-th-list{background-position:-264px 0;} -.icon-ok{background-position:-288px 0;} -.icon-remove{background-position:-312px 0;} -.icon-zoom-in{background-position:-336px 0;} -.icon-zoom-out{background-position:-360px 0;} -.icon-off{background-position:-384px 0;} -.icon-signal{background-position:-408px 0;} -.icon-cog{background-position:-432px 0;} -.icon-trash{background-position:-456px 0;} -.icon-home{background-position:0 -24px;} -.icon-file{background-position:-24px -24px;} -.icon-time{background-position:-48px -24px;} -.icon-road{background-position:-72px -24px;} -.icon-download-alt{background-position:-96px -24px;} -.icon-download{background-position:-120px -24px;} -.icon-upload{background-position:-144px -24px;} -.icon-inbox{background-position:-168px -24px;} -.icon-play-circle{background-position:-192px -24px;} -.icon-repeat{background-position:-216px -24px;} -.icon-refresh{background-position:-240px -24px;} -.icon-list-alt{background-position:-264px -24px;} -.icon-lock{background-position:-287px -24px;} -.icon-flag{background-position:-312px -24px;} -.icon-headphones{background-position:-336px -24px;} -.icon-volume-off{background-position:-360px -24px;} -.icon-volume-down{background-position:-384px -24px;} -.icon-volume-up{background-position:-408px -24px;} -.icon-qrcode{background-position:-432px -24px;} -.icon-barcode{background-position:-456px -24px;} -.icon-tag{background-position:0 -48px;} -.icon-tags{background-position:-25px -48px;} -.icon-book{background-position:-48px -48px;} -.icon-bookmark{background-position:-72px -48px;} -.icon-print{background-position:-96px -48px;} -.icon-camera{background-position:-120px -48px;} -.icon-font{background-position:-144px -48px;} -.icon-bold{background-position:-167px -48px;} -.icon-italic{background-position:-192px -48px;} -.icon-text-height{background-position:-216px -48px;} -.icon-text-width{background-position:-240px -48px;} -.icon-align-left{background-position:-264px -48px;} -.icon-align-center{background-position:-288px -48px;} -.icon-align-right{background-position:-312px -48px;} -.icon-align-justify{background-position:-336px -48px;} -.icon-list{background-position:-360px -48px;} -.icon-indent-left{background-position:-384px -48px;} -.icon-indent-right{background-position:-408px -48px;} -.icon-facetime-video{background-position:-432px -48px;} -.icon-picture{background-position:-456px -48px;} -.icon-pencil{background-position:0 -72px;} -.icon-map-marker{background-position:-24px -72px;} -.icon-adjust{background-position:-48px -72px;} -.icon-tint{background-position:-72px -72px;} -.icon-edit{background-position:-96px -72px;} -.icon-share{background-position:-120px -72px;} -.icon-check{background-position:-144px -72px;} -.icon-move{background-position:-168px -72px;} -.icon-step-backward{background-position:-192px -72px;} -.icon-fast-backward{background-position:-216px -72px;} -.icon-backward{background-position:-240px -72px;} -.icon-play{background-position:-264px -72px;} -.icon-pause{background-position:-288px -72px;} -.icon-stop{background-position:-312px -72px;} -.icon-forward{background-position:-336px -72px;} -.icon-fast-forward{background-position:-360px -72px;} -.icon-step-forward{background-position:-384px -72px;} -.icon-eject{background-position:-408px -72px;} -.icon-chevron-left{background-position:-432px -72px;} -.icon-chevron-right{background-position:-456px -72px;} -.icon-plus-sign{background-position:0 -96px;} -.icon-minus-sign{background-position:-24px -96px;} -.icon-remove-sign{background-position:-48px -96px;} -.icon-ok-sign{background-position:-72px -96px;} -.icon-question-sign{background-position:-96px -96px;} -.icon-info-sign{background-position:-120px -96px;} -.icon-screenshot{background-position:-144px -96px;} -.icon-remove-circle{background-position:-168px -96px;} -.icon-ok-circle{background-position:-192px -96px;} -.icon-ban-circle{background-position:-216px -96px;} -.icon-arrow-left{background-position:-240px -96px;} -.icon-arrow-right{background-position:-264px -96px;} -.icon-arrow-up{background-position:-289px -96px;} -.icon-arrow-down{background-position:-312px -96px;} -.icon-share-alt{background-position:-336px -96px;} -.icon-resize-full{background-position:-360px -96px;} -.icon-resize-small{background-position:-384px -96px;} -.icon-plus{background-position:-408px -96px;} -.icon-minus{background-position:-433px -96px;} -.icon-asterisk{background-position:-456px -96px;} -.icon-exclamation-sign{background-position:0 -120px;} -.icon-gift{background-position:-24px -120px;} -.icon-leaf{background-position:-48px -120px;} -.icon-fire{background-position:-72px -120px;} -.icon-eye-open{background-position:-96px -120px;} -.icon-eye-close{background-position:-120px -120px;} -.icon-warning-sign{background-position:-144px -120px;} -.icon-plane{background-position:-168px -120px;} -.icon-calendar{background-position:-192px -120px;} -.icon-random{background-position:-216px -120px;width:16px;} -.icon-comment{background-position:-240px -120px;} -.icon-magnet{background-position:-264px -120px;} -.icon-chevron-up{background-position:-288px -120px;} -.icon-chevron-down{background-position:-313px -119px;} -.icon-retweet{background-position:-336px -120px;} -.icon-shopping-cart{background-position:-360px -120px;} -.icon-folder-close{background-position:-384px -120px;} -.icon-folder-open{background-position:-408px -120px;width:16px;} -.icon-resize-vertical{background-position:-432px -119px;} -.icon-resize-horizontal{background-position:-456px -118px;} -.icon-hdd{background-position:0 -144px;} -.icon-bullhorn{background-position:-24px -144px;} -.icon-bell{background-position:-48px -144px;} -.icon-certificate{background-position:-72px -144px;} -.icon-thumbs-up{background-position:-96px -144px;} -.icon-thumbs-down{background-position:-120px -144px;} -.icon-hand-right{background-position:-144px -144px;} -.icon-hand-left{background-position:-168px -144px;} -.icon-hand-up{background-position:-192px -144px;} -.icon-hand-down{background-position:-216px -144px;} -.icon-circle-arrow-right{background-position:-240px -144px;} -.icon-circle-arrow-left{background-position:-264px -144px;} -.icon-circle-arrow-up{background-position:-288px -144px;} -.icon-circle-arrow-down{background-position:-312px -144px;} -.icon-globe{background-position:-336px -144px;} -.icon-wrench{background-position:-360px -144px;} -.icon-tasks{background-position:-384px -144px;} -.icon-filter{background-position:-408px -144px;} -.icon-briefcase{background-position:-432px -144px;} -.icon-fullscreen{background-position:-456px -144px;} -.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;} -.btn-group+.btn-group{margin-left:5px;} -.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px;} -.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group>.btn+.btn{margin-left:-1px;} -.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px;} -.btn-group>.btn-mini{font-size:11px;} -.btn-group>.btn-small{font-size:12px;} -.btn-group>.btn-large{font-size:16px;} -.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} -.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} -.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;} -.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} -.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} -.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} -.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} -.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} -.btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} -.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} -.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} -.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} -.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} -.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} -.btn .caret{margin-top:8px;margin-left:0;} -.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;} -.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} -.dropup .btn-large .caret{border-bottom-width:5px;} -.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} -.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} -.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px;} -.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} -.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} -.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;} -.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} -.nav{margin-left:0;margin-bottom:20px;list-style:none;} -.nav>li>a{display:block;} -.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} -.nav>.pull-right{float:right;} -.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} -.nav li+.nav-header{margin-top:9px;} -.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} -.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} -.nav-list>li>a{padding:3px 15px;} -.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} -.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;} -.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} -.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;} -.nav-tabs:after,.nav-pills:after{clear:both;} -.nav-tabs>li,.nav-pills>li{float:left;} -.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} -.nav-tabs{border-bottom:1px solid #ddd;} -.nav-tabs>li{margin-bottom:-1px;} -.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} -.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} -.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;} -.nav-stacked>li{float:none;} -.nav-stacked>li>a{margin-right:0;} -.nav-tabs.nav-stacked{border-bottom:0;} -.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} -.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} -.nav-pills.nav-stacked>li>a{margin-bottom:3px;} -.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} -.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} -.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} -.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} -.nav-tabs .dropdown-toggle .caret{margin-top:8px;} -.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} -.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} -.nav>.dropdown.active>a:hover{cursor:pointer;} -.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} -.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} -.tabs-stacked .open>a:hover{border-color:#999999;} -.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;} -.tabbable:after{clear:both;} -.tab-content{overflow:auto;} -.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} -.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} -.tab-content>.active,.pill-content>.active{display:block;} -.tabs-below>.nav-tabs{border-top:1px solid #ddd;} -.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} -.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} -.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;} -.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} -.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} -.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} -.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} -.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} -.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} -.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} -.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} -.nav>.disabled>a{color:#999999;} -.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;} -.navbar{overflow:visible;margin-bottom:20px;color:#777777;*position:relative;*z-index:2;} -.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - zoom: 1; - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); -}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;} -.navbar-inner:after{clear:both;} -.navbar .container{width:auto;} -.nav-collapse.collapse{height:auto;overflow:visible;} -.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;} -.navbar-text{margin-bottom:0;line-height:40px;} -.navbar-link{color:#777777;}.navbar-link:hover{color:#333333;} -.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} -.navbar .btn,.navbar .btn-group{margin-top:5px;} -.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0;} -.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;} -.navbar-form:after{clear:both;} -.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} -.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} -.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} -.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} -.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;} -.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} -.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.navbar-fixed-top{top:0;} -.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);} -.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);} -.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} -.navbar .nav.pull-right{float:right;margin-right:0;} -.navbar .nav>li{float:left;} -.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} -.navbar .nav .dropdown-toggle .caret{margin-top:8px;} -.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} -.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} -.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .075); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - border-left-color: #e5e5e5; - border-right-color: #e5e5e5; - border-top-color: #e5e5e5; - border-bottom-color: #bfbfbf; -}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} -.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;} -.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} -.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} -.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} -.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} -.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} -.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} -.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} -.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} -.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} -.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} -.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} -.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} -.navbar-inverse{color:#999999;}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-repeat: repeat-x; - border-color: #252525; - background-image: linear-gradient(to bottom, #222222, #111111); -} -.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;} -.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} -.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} -.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;} -.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} -.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} -.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} -.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} -.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} -.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #151515, #040404); - border-left-color: #040404; - border-right-color: #040404; - border-top-color: #040404; - border-bottom-color: #000000; -}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} -.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;} -.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;} -.breadcrumb .divider{padding:0 5px;color:#ccc;} -.breadcrumb .active{color:#999999;} -.pagination{margin:20px 0;} -.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} -.pagination ul>li{display:inline;} -.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} -.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;} -.pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;} -.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999999;background-color:transparent;cursor:default;} -.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.pagination-centered{text-align:center;} -.pagination-right{text-align:right;} -.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px;} -.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;} -.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;} -.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px;} -.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:1px 6px;font-size:10.5px;} -.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;} -.pager:after{clear:both;} -.pager li{display:inline;} -.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.pager li>a:hover{text-decoration:none;background-color:#f5f5f5;} -.pager .next>a,.pager .next>span{float:right;} -.pager .previous>a,.pager .previous>span{float:left;} -.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;} -.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;} -.thumbnails:after{clear:both;} -.row-fluid .thumbnails{margin-left:0;} -.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} -.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} -a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} -.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} -.thumbnail .caption{padding:9px;color:#555555;} -.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;} -.alert h4{margin:0;} -.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} -.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} -.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} -.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} -.alert-block{padding-top:14px;padding-bottom:14px;} -.alert-block>p,.alert-block>ul{margin-bottom:0;} -.alert-block p+p{margin-top:5px;} -@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-repeat: repeat-x; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); -} -.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-repeat: repeat-x; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; - background-image: linear-gradient(to bottom, #149bdf, #0480be); -} -.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);} -.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} -.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} -.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); -} -.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #62c462, #57a957); -} -.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); -} -.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #fbb450, #f89406); -} -.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} -.hero-unit li{line-height:30px;} -.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} -.media,.media .media{margin-top:15px;} -.media:first-child{margin-top:0;} -.media-object{display:block;} -.media-heading{margin:0 0 5px;} -.media .pull-left{margin-right:10px;} -.media .pull-right{margin-left:10px;} -.media-list{margin-left:0;list-style:none;} -.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} -.tooltip.top{margin-top:-3px;} -.tooltip.right{margin-left:3px;} -.tooltip.bottom{margin-top:3px;} -.tooltip.left{margin-left:-3px;} -.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;} -.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;} -.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;} -.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;} -.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;} -.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);}.popover.top{margin-top:-10px;} -.popover.right{margin-left:10px;} -.popover.bottom{margin-top:10px;} -.popover.left{margin-left:-10px;} -.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;} -.popover-content{padding:9px 14px;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} -.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid;} -.popover .arrow:after{content:"";z-index:-1;} -.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#ffffff;}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0, 0, 0, 0.25);bottom:-1px;left:-11px;} -.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#ffffff;}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0, 0, 0, 0.25);bottom:-11px;left:-1px;} -.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#ffffff;}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0, 0, 0, 0.25);top:-1px;left:-11px;} -.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#ffffff;}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0, 0, 0, 0.25);bottom:-11px;right:-1px;} -.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} -.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} -.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} -.modal.fade.in{top:50%;} -.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} -.modal-header h3{margin:0;line-height:30px;} -.modal-body{overflow-y:auto;max-height:400px;padding:15px;} -.modal-form{margin-bottom:0;} -.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;} -.modal-footer:after{clear:both;} -.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} -.modal-footer .btn-group .btn+.btn{margin-left:-1px;} -.modal-footer .btn-block+.btn-block{margin-left:0;} -.dropup,.dropdown{position:relative;} -.dropdown-toggle{*margin-bottom:-3px;} -.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} -.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";} -.dropdown .caret{margin-top:8px;margin-left:2px;} -.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;} -.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} -.dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;} -.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #0088cc, #0077b3); -} -.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#333333;text-decoration:none;outline:0;background-color:#0081c2;background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #0088cc, #0077b3); -} -.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999999;} -.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:default;} -.open{*z-index:1000;}.open >.dropdown-menu{display:block;} -.pull-right>.dropdown-menu{right:0;left:auto;} -.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";} -.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} -.dropdown-submenu{position:relative;} -.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} -.dropdown-submenu:hover>.dropdown-menu{display:block;} -.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;} -.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} -.dropdown-submenu:hover>a:after{border-left-color:#ffffff;} -.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} -.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;} -.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion{margin-bottom:20px;} -.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion-heading{border-bottom:0;} -.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} -.accordion-toggle{cursor:pointer;} -.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} -.carousel{position:relative;margin-bottom:20px;line-height:1;} -.carousel-inner{overflow:hidden;width:100%;position:relative;} -.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} -.carousel .item>img{display:block;line-height:1;} -.carousel .active,.carousel .next,.carousel .prev{display:block;} -.carousel .active{left:0;} -.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} -.carousel .next{left:100%;} -.carousel .prev{left:-100%;} -.carousel .next.left,.carousel .prev.right{left:0;} -.carousel .active.left{left:-100%;} -.carousel .active.right{left:100%;} -.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} -.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} -.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);} -.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;} -.carousel-caption h4{margin:0 0 5px;} -.carousel-caption p{margin-bottom:0;} -.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} -.media,.media .media{margin-top:15px;} -.media:first-child{margin-top:0;} -.media-object{display:block;} -.media-heading{margin:0 0 5px;} -.media .pull-left{margin-right:10px;} -.media .pull-right{margin-left:10px;} -.media-list{margin-left:0;list-style:none;} -.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} -.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} -button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} -.pull-right{float:right;} -.pull-left{float:left;} -.hide{display:none;} -.show{display:block;} -.invisible{visibility:hidden;} -.affix{position:fixed;} -.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;} -.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} -.hidden{display:none;visibility:hidden;} -.visible-phone{display:none !important;} -.visible-tablet{display:none !important;} -.hidden-desktop{display:none !important;} -.visible-desktop{display:inherit !important;} -@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12, textarea.span12, .uneditable-input.span12{width:710px;} input.span11, textarea.span11, .uneditable-input.span11{width:648px;} input.span10, textarea.span10, .uneditable-input.span10{width:586px;} input.span9, textarea.span9, .uneditable-input.span9{width:524px;} input.span8, textarea.span8, .uneditable-input.span8{width:462px;} input.span7, textarea.span7, .uneditable-input.span7{width:400px;} input.span6, textarea.span6, .uneditable-input.span6{width:338px;} input.span5, textarea.span5, .uneditable-input.span5{width:276px;} input.span4, textarea.span4, .uneditable-input.span4{width:214px;} input.span3, textarea.span3, .uneditable-input.span3{width:152px;} input.span2, textarea.span2, .uneditable-input.span2{width:90px;} input.span1, textarea.span1, .uneditable-input.span1{width:28px;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12, textarea.span12, .uneditable-input.span12{width:1156px;} input.span11, textarea.span11, .uneditable-input.span11{width:1056px;} input.span10, textarea.span10, .uneditable-input.span10{width:956px;} input.span9, textarea.span9, .uneditable-input.span9{width:856px;} input.span8, textarea.span8, .uneditable-input.span8{width:756px;} input.span7, textarea.span7, .uneditable-input.span7{width:656px;} input.span6, textarea.span6, .uneditable-input.span6{width:556px;} input.span5, textarea.span5, .uneditable-input.span5{width:456px;} input.span4, textarea.span4, .uneditable-input.span4{width:356px;} input.span3, textarea.span3, .uneditable-input.span3{width:256px;} input.span2, textarea.span2, .uneditable-input.span2{width:156px;} input.span1, textarea.span1, .uneditable-input.span1{width:56px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;} .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}} diff --git a/docs/css/print.css b/docs/css/print.css deleted file mode 100644 index f62e7b8bd8..0000000000 --- a/docs/css/print.css +++ /dev/null @@ -1 +0,0 @@ -#FolderNav, #TopNav { display: none !important; } diff --git a/docs/css/styles.css b/docs/css/styles.css deleted file mode 100644 index 083d4f838e..0000000000 --- a/docs/css/styles.css +++ /dev/null @@ -1,301 +0,0 @@ -body { - padding-top: 60px; - padding-bottom: 40px; -} - -.sidebar-nav { - padding: 9px 0; -} - -#featureDetails .description { - font-size: larger; -} - -.feature-folder-header { - font-size: small; - font-weight: bolder; - margin-top: 5px; -} - - .feature-folder-header span { - cursor: pointer; - } - -.feature-folder-contents { - margin-left: 15px; -} - -.navbar .overview { - padding-top: 8px; - font-weight: bolder; -} - -.navbar-below { - margin-top: -1px; - margin-left: 10px; - border-top: 0; - -ms-border-bottom-left-radius: 10px; - border-bottom-left-radius: 10px; - -ms-border-bottom-right-radius: 10px; - border-bottom-right-radius: 10px; - width: 180px; - background-color: black; - color: rgb(173, 173, 173); - -webkit-transition: height 400ms; - transition: height 400ms; - overflow: hidden; -} - - .navbar-below div { - display: inline-block; - padding-left: 8px; - padding-right: 8px; - cursor: pointer; - } - -#scenarios, .steps { - list-style-type: none; - margin: 0; - padding: 0; -} - -.scenario { - transition: border-color 1s ease; - background-color: #F5F5F5; - border: 1px solid #D0D0D0; - margin: 6px 0px 28px 0px; - padding: 6px; -} - -.scenario-name { - font-weight: bolder; - font-size: 1.1em; -} - -.scenario-active { - border-color: #B21515; -} - -#clipboardText { - width: 100%; - padding: 0; - border: none; - outline: none; - box-shadow: none; - background: transparent; - cursor: pointer; - text-decoration: underline; - color: blue; -} - -.scenario a.scenario-link { - float: right; - margin-top: -25px; - width: 32px; -} - -li.step { - list-style-type: none; - margin: 6px 0px 6px 0px; - padding: 0; -} - -.comment { - font-weight: bold; - color: #0088CC; -} - -.keyword { - font-weight: bold; - color: #0000FF; -} - -.tags { - color: #44546a; - font-style: italic; - font-weight: normal; -} - -.steps table { - margin-bottom: 0px; -} - - .steps table td { - color: #B21515; - } - - .steps table th { - font-style: italic; - } - -#SearchButton { - margin-top: 0; -} - -.nav .nav-tabs .nav-stacked .active { - background-color: #0088CC; - color: white; -} - -#FolderNav { - border-right: 1px lightgrey solid; -} - - #FolderNav a:hover { - background-color: #EEEEEE; - color: #1A668C; - text-decoration: none; - } - -.feature { - padding: 5px; -} - - .feature:hover { - background-color: #EEEEEE; - cursor: pointer; - color: #1A668C; - } - -.canHighlight { -} - -.highlight { - background-color: yellow; -} - -.inconclusive, .failed, .passed { - font-size: 300%; -} - -.pre { - border-color: #fff; - margin: 0; - padding: 0; - overflow: auto; - white-space: pre-wrap; - font-style: italic; -} - -.selected { - text-decoration: underline; -} - -#Content { - margin: 0px 0px 0px 10px; -} - -#HideIt { - float: right; - position: relative; - left: 0px; - top: 0px; - cursor: pointer; -} - -#ShowIt { - float: left; - position: absolute; - left: 0px; - top: 60px; - cursor: pointer; -} - -#SutInfo { - margin-top: 30px; - border-top: 1px lightgrey solid; -} - -.clickable { - cursor: pointer; -} - -.table { - width: auto; - max-width: 90%; -} - -.table-condensed th, -.table-condensed td { - padding: 5px 8px; -} - -/* Overview Styles */ -.modal-host { - display: block; - width: 100%; -} - -.modal-overlay { - margin-top: 40px; - background: white; - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; - z-index: -1; - opacity: 0; - overflow: hidden; - -ms-transform: scale(0.5); - transform: scale(0.5); - -webkit-transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); - transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); - overflow-y: auto; -} - -.modal-overlay-visible { - opacity: 1; - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - -webkit-transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); - transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); - z-index: 10; -} - -.modal-box { - padding: 1em .75em; - position: relative; - margin: 1em auto; - width: 95%; -} - -.modal-dialog .btn { - background-image: none !important; -} - -#overallCompleteCanvas-container, #overallCompleteSummary { - width: 50%; -} - -#overallCompleteSummary ul { - font-size: 1.3em; - list-style: none; -} - -#overallCompleteSummary ul * { - vertical-align: middle; -} - -#overallCompleteSummary span { - display: inline-block; - margin: 5px; - text-align: center; -} - -#overallCompleteSummary .color-key { - background-color: lightyellow; - display: inline-block; - padding: 0px 10px; - min-width: 25px; - line-height: 42px; -} - -h3.header { - text-align: center; - margin: 20px 0px 5px 0px; - line-height: 32px; -} - - diff --git a/docs/email__new-group-near-you.png b/docs/email__new-group-near-you.png deleted file mode 100644 index 6f2a90c6fc..0000000000 Binary files a/docs/email__new-group-near-you.png and /dev/null differ diff --git a/docs/img/glyphicons-halflings-white.png b/docs/img/glyphicons-halflings-white.png deleted file mode 100644 index a001c35f8c..0000000000 Binary files a/docs/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/docs/img/glyphicons-halflings.png b/docs/img/glyphicons-halflings.png deleted file mode 100644 index f15c257ee9..0000000000 Binary files a/docs/img/glyphicons-halflings.png and /dev/null differ diff --git a/docs/img/link.png b/docs/img/link.png deleted file mode 100644 index 68fc43b7c6..0000000000 Binary files a/docs/img/link.png and /dev/null differ diff --git a/docs/invitation-email-not-on-platform.jpg b/docs/invitation-email-not-on-platform.jpg deleted file mode 100644 index 86d98d0fd2..0000000000 Binary files a/docs/invitation-email-not-on-platform.jpg and /dev/null differ diff --git a/docs/js/Chart.StackedBar.js b/docs/js/Chart.StackedBar.js deleted file mode 100644 index 6c0689a34e..0000000000 --- a/docs/js/Chart.StackedBar.js +++ /dev/null @@ -1,556 +0,0 @@ -(function (factory) { - "use strict"; - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['chart.js'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS - module.exports = factory(require('chart.js')); - } else { - // Global browser - factory(Chart); - } -}(function (Chart) { - "use strict"; - - var helpers = Chart.helpers; - - var defaultConfig = { - scaleBeginAtZero : true, - - //Boolean - Whether grid lines are shown across the chart - scaleShowGridLines : true, - - //String - Colour of the grid lines - scaleGridLineColor : "rgba(0,0,0,.05)", - - //Number - Width of the grid lines - scaleGridLineWidth : 1, - - //Boolean - Whether to show horizontal lines (except X axis) - scaleShowHorizontalLines: true, - - //Boolean - Whether to show vertical lines (except Y axis) - scaleShowVerticalLines: true, - - //Boolean - If there is a stroke on each bar - barShowStroke : true, - - //Number - Pixel width of the bar stroke - barStrokeWidth : 2, - - //Number - Spacing between each of the X value sets - barValueSpacing : 5, - - //Boolean - Whether bars should be rendered on a percentage base - relativeBars : false, - - //String - A legend template - legendTemplate : "", - - //Boolean - Show total legend - showTotal: false, - - //String - Color of total legend - totalColor: '#fff', - - //String - Total Label - totalLabel: 'Total', - - //Boolean - Hide labels with value set to 0 - tooltipHideZero: false - }; - - Chart.Type.extend({ - name: "StackedBar", - defaults : defaultConfig, - initialize: function(data){ - //Expose options as a scope variable here so we can access it in the ScaleClass - var options = this.options; - - // Save data as a source for updating of values & methods - this.data = data; - - this.ScaleClass = Chart.Scale.extend({ - offsetGridLines : true, - calculateBarX : function(barIndex){ - return this.calculateX(barIndex); - }, - calculateBarY : function(datasets, dsIndex, barIndex, value){ - var offset = 0, - sum = 0; - - for(var i = 0; i < datasets.length; i++) { - sum += datasets[i].bars[barIndex].value; - } - for(i = dsIndex; i < datasets.length; i++) { - if(i === dsIndex && value) { - offset += value; - } else { - offset = +offset + +datasets[i].bars[barIndex].value; - } - } - - if(options.relativeBars) { - offset = offset / sum * 100; - } - - return this.calculateY(offset); - }, - calculateBaseWidth : function(){ - return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing); - }, - calculateBaseHeight : function(){ - return (this.calculateY(1) - this.calculateY(0)); - }, - calculateBarWidth : function(datasetCount){ - //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset - return this.calculateBaseWidth(); - }, - calculateBarHeight : function(datasets, dsIndex, barIndex, value) { - var sum = 0; - - for(var i = 0; i < datasets.length; i++) { - sum += datasets[i].bars[barIndex].value; - } - - if(!value) { - value = datasets[dsIndex].bars[barIndex].value; - } - - if(options.relativeBars) { - value = value / sum * 100; - } - - return this.calculateY(value); - } - }); - - this.datasets = []; - - //Set up tooltip events on the chart - if (this.options.showTooltips){ - helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ - var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; - - this.eachBars(function(bar){ - bar.restore(['fillColor', 'strokeColor']); - }); - helpers.each(activeBars, function(activeBar){ - activeBar.fillColor = activeBar.highlightFill; - activeBar.strokeColor = activeBar.highlightStroke; - }); - this.showTooltip(activeBars); - }); - } - - //Declare the extension of the default point, to cater for the options passed in to the constructor - this.BarClass = Chart.Rectangle.extend({ - strokeWidth : this.options.barStrokeWidth, - showStroke : this.options.barShowStroke, - ctx : this.chart.ctx - }); - - //Iterate through each of the datasets, and build this into a property of the chart - helpers.each(data.datasets,function(dataset,datasetIndex){ - - var datasetObject = { - label : dataset.label || null, - fillColor : dataset.fillColor, - strokeColor : dataset.strokeColor, - bars : [] - }; - - this.datasets.push(datasetObject); - - helpers.each(dataset.data,function(dataPoint,index){ - if(!helpers.isNumber(dataPoint)){ - dataPoint = 0; - } - //Add a new point for each piece of data, passing any required data to draw. - //Add 0 as value if !isNumber (e.g. empty values are useful when 0 values should be hidden in tooltip) - datasetObject.bars.push(new this.BarClass({ - value : dataPoint, - label : data.labels[index], - datasetLabel: dataset.label, - strokeColor : dataset.strokeColor, - fillColor : dataset.fillColor, - highlightFill : dataset.highlightFill || dataset.fillColor, - highlightStroke : dataset.highlightStroke || dataset.strokeColor - })); - },this); - - },this); - - this.buildScale(data.labels); - - this.eachBars(function(bar, index, datasetIndex){ - helpers.extend(bar, { - base: this.scale.endPoint, - height: 0, - width : this.scale.calculateBarWidth(this.datasets.length), - x: this.scale.calculateBarX(index), - y: this.scale.endPoint - }); - bar.save(); - }, this); - - this.render(); - }, - showTooltip : function(ChartElements, forceRedraw){ - // Only redraw the chart if we've actually changed what we're hovering on. - if (typeof this.activeElements === 'undefined') this.activeElements = []; - - helpers = Chart.helpers; - - var isChanged = (function(Elements){ - var changed = false; - - if (Elements.length !== this.activeElements.length){ - changed = true; - return changed; - } - - helpers.each(Elements, function(element, index){ - if (element !== this.activeElements[index]){ - changed = true; - } - }, this); - return changed; - }).call(this, ChartElements); - - if (!isChanged && !forceRedraw){ - return; - } - else{ - this.activeElements = ChartElements; - } - this.draw(); - if(this.options.customTooltips){ - this.options.customTooltips(false); - } - if (ChartElements.length > 0){ - // If we have multiple datasets, show a MultiTooltip for all of the data points at that index - if (this.datasets && this.datasets.length > 1) { - var dataArray, - dataIndex; - - for (var i = this.datasets.length - 1; i >= 0; i--) { - dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; - dataIndex = helpers.indexOf(dataArray, ChartElements[0]); - if (dataIndex !== -1){ - break; - } - } - var tooltipLabels = [], - tooltipColors = [], - medianPosition = (function(index) { - - // Get all the points at that particular index - var Elements = [], - dataCollection, - xPositions = [], - yPositions = [], - xMax, - yMax, - xMin, - yMin; - helpers.each(this.datasets, function(dataset){ - dataCollection = dataset.points || dataset.bars || dataset.segments; - if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){ - Elements.push(dataCollection[dataIndex]); - } - }); - - var total = { - datasetLabel: this.options.totalLabel, - value: 0, - fillColor: this.options.totalColor, - strokeColor: this.options.totalColor - }; - - helpers.each(Elements, function(element) { - if (this.options.tooltipHideZero && element.value === 0) { - return; - } - - xPositions.push(element.x); - yPositions.push(element.y); - - total.value += element.value; - - //Include any colour information about the element - tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); - tooltipColors.push({ - fill: element._saved.fillColor || element.fillColor, - stroke: element._saved.strokeColor || element.strokeColor - }); - - }, this); - - if (this.options.showTotal) { - tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, total)); - tooltipColors.push({ - fill: total.fillColor, - stroke: total.strokeColor - }); - } - - yMin = helpers.min(yPositions); - yMax = helpers.max(yPositions); - - xMin = helpers.min(xPositions); - xMax = helpers.max(xPositions); - - return { - x: (xMin > this.chart.width/2) ? xMin : xMax, - y: (yMin + yMax)/2 - }; - }).call(this, dataIndex); - - new Chart.MultiTooltip({ - x: medianPosition.x, - y: medianPosition.y, - xPadding: this.options.tooltipXPadding, - yPadding: this.options.tooltipYPadding, - xOffset: this.options.tooltipXOffset, - fillColor: this.options.tooltipFillColor, - textColor: this.options.tooltipFontColor, - fontFamily: this.options.tooltipFontFamily, - fontStyle: this.options.tooltipFontStyle, - fontSize: this.options.tooltipFontSize, - titleTextColor: this.options.tooltipTitleFontColor, - titleFontFamily: this.options.tooltipTitleFontFamily, - titleFontStyle: this.options.tooltipTitleFontStyle, - titleFontSize: this.options.tooltipTitleFontSize, - cornerRadius: this.options.tooltipCornerRadius, - labels: tooltipLabels, - legendColors: tooltipColors, - legendColorBackground : this.options.multiTooltipKeyBackground, - title: ChartElements[0].label, - chart: this.chart, - ctx: this.chart.ctx, - custom: this.options.customTooltips - }).draw(); - - } else { - helpers.each(ChartElements, function(Element) { - var tooltipPosition = Element.tooltipPosition(); - new Chart.Tooltip({ - x: Math.round(tooltipPosition.x), - y: Math.round(tooltipPosition.y), - xPadding: this.options.tooltipXPadding, - yPadding: this.options.tooltipYPadding, - fillColor: this.options.tooltipFillColor, - textColor: this.options.tooltipFontColor, - fontFamily: this.options.tooltipFontFamily, - fontStyle: this.options.tooltipFontStyle, - fontSize: this.options.tooltipFontSize, - caretHeight: this.options.tooltipCaretSize, - cornerRadius: this.options.tooltipCornerRadius, - text: helpers.template(this.options.tooltipTemplate, Element), - chart: this.chart, - custom: this.options.customTooltips - }).draw(); - }, this); - } - } - return this; - }, - update : function(){ - - //Iterate through each of the datasets, and build this into a property of the chart - helpers.each(this.datasets,function(dataset,datasetIndex){ - - helpers.extend(this.datasets[datasetIndex], { - label : dataset.label || null, - fillColor : dataset.fillColor, - strokeColor : dataset.strokeColor, - }); - - helpers.each(dataset.data,function(dataPoint,index){ - helpers.extend(this.datasets[datasetIndex].bars[index], { - value : dataPoint, - label : this.data.labels[index], - datasetLabel: dataset.label, - strokeColor : dataset.strokeColor, - fillColor : dataset.fillColor, - highlightFill : dataset.highlightFill || dataset.fillColor, - highlightStroke : dataset.highlightStroke || dataset.strokeColor - }); - },this); - - },this); - - - this.scale.update(); - // Reset any highlight colours before updating. - helpers.each(this.activeElements, function(activeElement){ - activeElement.restore(['fillColor', 'strokeColor']); - }); - - this.eachBars(function(bar){ - bar.save(); - }); - this.render(); - }, - eachBars : function(callback){ - helpers.each(this.datasets,function(dataset, datasetIndex){ - helpers.each(dataset.bars, callback, this, datasetIndex); - },this); - }, - getBarsAtEvent : function(e){ - var barsArray = [], - eventPosition = helpers.getRelativePosition(e), - datasetIterator = function(dataset){ - barsArray.push(dataset.bars[barIndex]); - }, - barIndex; - - for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { - for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { - if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){ - helpers.each(this.datasets, datasetIterator); - return barsArray; - } - } - } - - return barsArray; - }, - buildScale : function(labels){ - var self = this; - - var dataTotal = function(){ - var values = []; - helpers.each(self.datasets, function(dataset) { - helpers.each(dataset.bars, function(bar, barIndex) { - if(!values[barIndex]) values[barIndex] = 0; - if(self.options.relativeBars) { - values[barIndex] = 100; - } else { - values[barIndex] = +values[barIndex] + +bar.value; - } - }); - }); - return values; - }; - - var scaleOptions = { - templateString : this.options.scaleLabel, - height : this.chart.height, - width : this.chart.width, - ctx : this.chart.ctx, - textColor : this.options.scaleFontColor, - fontSize : this.options.scaleFontSize, - fontStyle : this.options.scaleFontStyle, - fontFamily : this.options.scaleFontFamily, - valuesCount : labels.length, - beginAtZero : this.options.scaleBeginAtZero, - integersOnly : this.options.scaleIntegersOnly, - calculateYRange: function(currentHeight){ - var updatedRanges = helpers.calculateScaleRange( - dataTotal(), - currentHeight, - this.fontSize, - this.beginAtZero, - this.integersOnly - ); - helpers.extend(this, updatedRanges); - }, - xLabels : this.options.xLabels || labels, - font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), - lineWidth : this.options.scaleLineWidth, - lineColor : this.options.scaleLineColor, - gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, - gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", - showHorizontalLines : this.options.scaleShowHorizontalLines, - showVerticalLines : this.options.scaleShowVerticalLines, - padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, - showLabels : this.options.scaleShowLabels, - display : this.options.showScale - }; - - if (this.options.scaleOverride){ - helpers.extend(scaleOptions, { - calculateYRange: helpers.noop, - steps: this.options.scaleSteps, - stepValue: this.options.scaleStepWidth, - min: this.options.scaleStartValue, - max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) - }); - } - - this.scale = new this.ScaleClass(scaleOptions); - }, - addData : function(valuesArray,label){ - //Map the values array for each of the datasets - helpers.each(valuesArray,function(value,datasetIndex){ - if (helpers.isNumber(value)){ - //Add a new point for each piece of data, passing any required data to draw. - //Add 0 as value if !isNumber (e.g. empty values are useful when 0 values should be hidden in tooltip) - this.datasets[datasetIndex].bars.push(new this.BarClass({ - value : helpers.isNumber(value)?value:0, - label : label, - x: this.scale.calculateBarX(this.scale.valuesCount+1), - y: this.scale.endPoint, - width : this.scale.calculateBarWidth(this.datasets.length), - base : this.scale.endPoint, - strokeColor : this.datasets[datasetIndex].strokeColor, - fillColor : this.datasets[datasetIndex].fillColor - })); - } - },this); - - this.scale.addXLabel(label); - //Then re-render the chart. - this.update(); - }, - removeData : function(){ - this.scale.removeXLabel(); - //Then re-render the chart. - helpers.each(this.datasets,function(dataset){ - dataset.bars.shift(); - },this); - this.update(); - }, - reflow : function(){ - helpers.extend(this.BarClass.prototype,{ - y: this.scale.endPoint, - base : this.scale.endPoint - }); - var newScaleProps = helpers.extend({ - height : this.chart.height, - width : this.chart.width - }); - this.scale.update(newScaleProps); - }, - draw : function(ease){ - var easingDecimal = ease || 1; - this.clear(); - - var ctx = this.chart.ctx; - - this.scale.draw(easingDecimal); - - //Draw all the bars for each dataset - helpers.each(this.datasets,function(dataset,datasetIndex){ - helpers.each(dataset.bars,function(bar,index){ - var y = this.scale.calculateBarY(this.datasets, datasetIndex, index, bar.value), - height = this.scale.calculateBarHeight(this.datasets, datasetIndex, index, bar.value); - - //Transition then draw - if(bar.value > 0) { - bar.transition({ - base : this.scale.endPoint - (Math.abs(height) - Math.abs(y)), - x : this.scale.calculateBarX(index), - y : Math.abs(y), - height : Math.abs(height), - width : this.scale.calculateBarWidth(this.datasets.length) - }, easingDecimal).draw(); - } - },this); - },this); - } - }); -})); diff --git a/docs/js/Chart.min.js b/docs/js/Chart.min.js deleted file mode 100644 index 28cdf38f52..0000000000 --- a/docs/js/Chart.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * Chart.js - * http://chartjs.org/ - * Version: 1.0.2 - * - * Copyright 2015 Nick Downie - * Released under the MIT license - * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md - */ -(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width")||t.canvas.width,n=this.height=i(t.canvas,"Height")||t.canvas.height;return e=this.width=t.canvas.width,n=this.height=t.canvas.height,this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipTitleTemplate:"<%= label%>",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= datasetLabel %>: <%= value %>",multiTooltipKeyBackground:"#fff",segmentColorDefault:["#A6CEE3","#1F78B4","#B2DF8A","#33A02C","#FB9A99","#E31A1C","#FDBF6F","#FF7F00","#CAB2D6","#6A3D9A","#B4B482","#B15928"],segmentHighlightColorDefaults:["#CEF6FF","#47A0DC","#DAFFB2","#5BC854","#FFC2C1","#FF4244","#FFE797","#FFA728","#F2DAFE","#9265C2","#DCDCAA","#D98150"],onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){if(t%1!==0&&f(t)){var i=t.toString();if(i.indexOf("e-")<0)return i.split(".")[1].length;if(i.indexOf(".")<0)return parseInt(i.split("e-")[1]);var e=i.split(".")[1].split("e-");return e[0].length+parseInt(e[1])}return 0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,o){var a=2,h=Math.floor(i/(1.5*e)),l=a>=h,r=[];n(t,function(t){null==t||r.push(t)});var c=m(r),u=g(r);u===c&&(u+=.5,c>=.5&&!s?c-=.5:u+=.5);for(var d=Math.abs(u-c),p=y(d),f=Math.ceil(u/(1*Math.pow(10,p)))*Math.pow(10,p),v=s?0:Math.floor(c/(1*Math.pow(10,p)))*Math.pow(10,p),S=f-v,x=Math.pow(10,p),C=Math.round(S/x);(C>h||h>2*C)&&!l;)if(C>h)x*=2,C=Math.round(S/x),C%1!==0&&(l=!0);else if(o&&p>=0){if(x/2%1!==0)break;x/=2,C=Math.round(S/x)}else x/=2,C=Math.round(S/x);return l&&(C=a,x=S/C),{steps:C,stepValue:x,min:v,max:v+C*x}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),b=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return t&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*(s*Math.pow(2,10*(t-=1))*Math.sin((1*t-i)*(2*Math.PI)/e)):s*Math.pow(2,-10*(t-=1))*Math.sin((1*t-i)*(2*Math.PI)/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*(t*t*(((i*=1.525)+1)*t-i)):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-b.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*b.easeInBounce(2*t):.5*b.easeOutBounce(2*t-1)+.5}}),w=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=(s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),s.animationLoop=function(t,i,e,s,n,o){var a=0,h=b[e]||b.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=w(l):n.apply(o)};w(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),L=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},k=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},P(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){L(t.chart.canvas,e,i)})}),F=s.getMaximumWidth=function(t){var i=t.parentNode,e=parseInt(R(i,"padding-left"))+parseInt(R(i,"padding-right"));return i?i.clientWidth-e:0},A=s.getMaximumHeight=function(t){var i=t.parentNode,e=parseInt(R(i,"padding-bottom"))+parseInt(R(i,"padding-top"));return i?i.clientHeight-e:0},R=s.getStyle=function(t,i){return t.currentStyle?t.currentStyle[i]:document.defaultView.getComputedStyle(t,null).getPropertyValue(i)},T=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return e.animationService.cancelAnimation(this),this},resize:function(t){this.stop();var i=this.chart.canvas,e=F(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:A(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,T(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){if(t&&this.reflow(),this.options.animation&&!t){var i=new e.Animation;i.numSteps=this.options.animationSteps,i.easing=this.options.animationEasing,i.render=function(t,i){var e=s.easingEffects[i.easing],n=i.currentStep/i.numSteps,o=e(n);t.draw(o,n,i.currentStep)},i.onAnimationProgress=this.options.onAnimationProgress,i.onAnimationComplete=this.options.onAnimationComplete,e.animationService.addAnimation(this,i)}else this.draw(),this.options.onAnimationComplete.call(this);return this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),k(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(t){var i,e,n,o,a,l=[],r=[],d=[];return s.each(this.datasets,function(t){i=t.points||t.bars||t.segments,i[h]&&i[h].hasValue()&&l.push(i[h])}),s.each(l,function(t){r.push(t.x),d.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),a=m(d),n=g(d),o=m(r),e=g(r),{x:o>this.chart.width/2?o:e,y:(a+n)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:C(this.options.tooltipTitleTemplate,t[0]),chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)a?a>=n||n>=o:n>=o&&a>=n,l=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return h&&l},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius<0?0:this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius<0?0:this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Animation=e.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.titleHeight=this.title?1.5*this.titleFontSize:0,this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+this.titleHeight,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleHeight/3:i+(1.5*this.fontSize*e+this.fontSize/2)+this.titleHeight},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels)+10:0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint,e=this.endPoint-this.startPoint;for(this.calculateYRange(e),this.buildYLabels(),this.calculateXLabelRotation();e>this.endPoint-this.startPoint;)e=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(e),this.buildYLabels(),tthis.yLabelWidth?e/2:this.yLabelWidth,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){var e=null,s=null;if(this.angleLineWidth>0&&(e=this.calculateCenterOffset(this.max),s=this.getPointPosition(i,e),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(s.x,s.y),t.stroke(),t.closePath()),this.backgroundColors&&this.backgroundColors.length==this.valuesCount){null==e&&(e=this.calculateCenterOffset(this.max)),null==s&&(s=this.getPointPosition(i,e));var o=this.getPointPosition(0===i?this.valuesCount-1:i-1,e),a=this.getPointPosition(i===this.valuesCount-1?0:i+1,e),h={x:(o.x+s.x)/2,y:(o.y+s.y)/2},l={x:(s.x+a.x)/2,y:(s.y+a.y)/2};t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(h.x,h.y),t.lineTo(s.x,s.y),t.lineTo(l.x,l.y),t.fillStyle=this.backgroundColors[i],t.fill(),t.closePath()}var r=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var c=this.labels.length,u=this.labels.length/2,d=u/2,p=d>i||i>c-d,f=i===d||i===c-d;0===i?t.textAlign="center":i===u?t.textAlign="center":u>i?t.textAlign="left":t.textAlign="right",f?t.textBaseline="middle":p?t.textBaseline="bottom":t.textBaseline="top",t.fillText(this.labels[i],r.x,r.y)}}}}}),e.animationService={frameDuration:17,animations:[],dropFrames:0,addAnimation:function(t,i){for(var e=0;e1&&(i=Math.floor(this.dropFrames),this.dropFrames-=i);for(var e=0;ethis.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.currentStep=this.animations[e].animationObject.numSteps),this.animations[e].animationObject.render(this.animations[e].chartInstance,this.animations[e].animationObject),this.animations[e].animationObject.currentStep==this.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.onAnimationComplete.call(this.animations[e].chartInstance),this.animations.splice(e,1),e--);var n=Date.now(),o=n-t-this.frameDuration,a=o/this.frameDuration;a>1&&(this.dropFrames+=a),this.animations.length>0&&s.requestAnimFrame.call(window,this.digestWrapper)}},s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define("Chart",[],function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
        <% for (var i=0; i
      • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
      • <%}%>
      '};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing; -return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i,s){var n={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(n),e.each(i.data,function(e,s){n.bars.push(new this.BarClass({value:e,label:t.labels[s],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
    • <%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(i,e){i.color||(i.color="hsl("+360*e/t.length+", 100%, 50%)"),this.addData(i,e,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,e,s){var n=void 0!==e?e:this.segments.length;"undefined"==typeof t.color&&(t.color=i.defaults.global.segmentColorDefault[n%i.defaults.global.segmentColorDefault.length],t.highlight=i.defaults.global.segmentHighlightColorDefaults[n%i.defaults.global.segmentHighlightColorDefaults.length]),this.segments.splice(n,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),s||(this.reflow(),this.update())},calculateCircumference:function(t){return this.total>0?2*Math.PI*(t/this.total):0},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
    • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>',offsetGridLines:!1};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({offsetGridLines:this.options.offsetGridLines,strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)0&&ithis.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.ythis.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this))}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
        <% for (var i=0; i
      • <%if(segments[i].label){%><%=segments[i].label%><%}%>
      • <%}%>
      '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
    • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backgroundColors:this.options.scaleBackgroundColors,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,datasetLabel:this.datasets[e].label,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,this.options.datasetFill&&s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); \ No newline at end of file diff --git a/docs/js/Markdown.Converter.js b/docs/js/Markdown.Converter.js deleted file mode 100644 index e8d9a1e85e..0000000000 --- a/docs/js/Markdown.Converter.js +++ /dev/null @@ -1,1400 +0,0 @@ -var Markdown; - -if (typeof exports === "object" && typeof require === "function") // we're in a CommonJS (e.g. Node.js) module - Markdown = exports; -else - Markdown = {}; - -// The following text is included for historical reasons, but should -// be taken with a pinch of salt; it's not all true anymore. - -// -// Wherever possible, Showdown is a straight, line-by-line port -// of the Perl version of Markdown. -// -// This is not a normal parser design; it's basically just a -// series of string substitutions. It's hard to read and -// maintain this way, but keeping Showdown close to the original -// design makes it easier to port new features. -// -// More importantly, Showdown behaves like markdown.pl in most -// edge cases. So web applications can do client-side preview -// in Javascript, and then build identical HTML on the server. -// -// This port needs the new RegExp functionality of ECMA 262, -// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers -// should do fine. Even with the new regular expression features, -// We do a lot of work to emulate Perl's regex functionality. -// The tricky changes in this file mostly have the "attacklab:" -// label. Major or self-explanatory changes don't. -// -// Smart diff tools like Araxis Merge will be able to match up -// this file with markdown.pl in a useful way. A little tweaking -// helps: in a copy of markdown.pl, replace "#" with "//" and -// replace "$text" with "text". Be sure to ignore whitespace -// and line endings. -// - - -// -// Usage: -// -// var text = "Markdown *rocks*."; -// -// var converter = new Markdown.Converter(); -// var html = converter.makeHtml(text); -// -// alert(html); -// -// Note: move the sample code to the bottom of this -// file before uncommenting it. -// - -(function () { - - function identity(x) { return x; } - function returnFalse(x) { return false; } - - function HookCollection() { } - - HookCollection.prototype = { - - chain: function (hookname, func) { - var original = this[hookname]; - if (!original) - throw new Error("unknown hook " + hookname); - - if (original === identity) - this[hookname] = func; - else - this[hookname] = function (text) { - var args = Array.prototype.slice.call(arguments, 0); - args[0] = original.apply(null, args); - return func.apply(null, args); - }; - }, - set: function (hookname, func) { - if (!this[hookname]) - throw new Error("unknown hook " + hookname); - this[hookname] = func; - }, - addNoop: function (hookname) { - this[hookname] = identity; - }, - addFalse: function (hookname) { - this[hookname] = returnFalse; - } - }; - - Markdown.HookCollection = HookCollection; - - // g_urls and g_titles allow arbitrary user-entered strings as keys. This - // caused an exception (and hence stopped the rendering) when the user entered - // e.g. [push] or [__proto__]. Adding a prefix to the actual key prevents this - // (since no builtin property starts with "s_"). See - // http://meta.stackoverflow.com/questions/64655/strange-wmd-bug - // (granted, switching from Array() to Object() alone would have left only __proto__ - // to be a problem) - function SaveHash() { } - SaveHash.prototype = { - set: function (key, value) { - this["s_" + key] = value; - }, - get: function (key) { - return this["s_" + key]; - } - }; - - Markdown.Converter = function () { - var pluginHooks = this.hooks = new HookCollection(); - - // given a URL that was encountered by itself (without markup), should return the link text that's to be given to this link - pluginHooks.addNoop("plainLinkText"); - - // called with the orignal text as given to makeHtml. The result of this plugin hook is the actual markdown source that will be cooked - pluginHooks.addNoop("preConversion"); - - // called with the text once all normalizations have been completed (tabs to spaces, line endings, etc.), but before any conversions have - pluginHooks.addNoop("postNormalization"); - - // Called with the text before / after creating block elements like code blocks and lists. Note that this is called recursively - // with inner content, e.g. it's called with the full text, and then only with the content of a blockquote. The inner - // call will receive outdented text. - pluginHooks.addNoop("preBlockGamut"); - pluginHooks.addNoop("postBlockGamut"); - - // called with the text of a single block element before / after the span-level conversions (bold, code spans, etc.) have been made - pluginHooks.addNoop("preSpanGamut"); - pluginHooks.addNoop("postSpanGamut"); - - // called with the final cooked HTML code. The result of this plugin hook is the actual output of makeHtml - pluginHooks.addNoop("postConversion"); - - // - // Private state of the converter instance: - // - - // Global hashes, used by various utility routines - var g_urls; - var g_titles; - var g_html_blocks; - - // Used to track when we're inside an ordered or unordered list - // (see _ProcessListItems() for details): - var g_list_level; - - this.makeHtml = function (text) { - - // - // Main function. The order in which other subs are called here is - // essential. Link and image substitutions need to happen before - // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the - // and tags get encoded. - // - - // This will only happen if makeHtml on the same converter instance is called from a plugin hook. - // Don't do that. - if (g_urls) - throw new Error("Recursive call to converter.makeHtml"); - - // Create the private state objects. - g_urls = new SaveHash(); - g_titles = new SaveHash(); - g_html_blocks = []; - g_list_level = 0; - - text = pluginHooks.preConversion(text); - - // attacklab: Replace ~ with ~T - // This lets us use tilde as an escape char to avoid md5 hashes - // The choice of character is arbitray; anything that isn't - // magic in Markdown will work. - text = text.replace(/~/g, "~T"); - - // attacklab: Replace $ with ~D - // RegExp interprets $ as a special character - // when it's in a replacement string - text = text.replace(/\$/g, "~D"); - - // Standardize line endings - text = text.replace(/\r\n/g, "\n"); // DOS to Unix - text = text.replace(/\r/g, "\n"); // Mac to Unix - - // Make sure text begins and ends with a couple of newlines: - text = "\n\n" + text + "\n\n"; - - // Convert all tabs to spaces. - text = _Detab(text); - - // Strip any lines consisting only of spaces and tabs. - // This makes subsequent regexen easier to write, because we can - // match consecutive blank lines with /\n+/ instead of something - // contorted like /[ \t]*\n+/ . - text = text.replace(/^[ \t]+$/mg, ""); - - text = pluginHooks.postNormalization(text); - - // Turn block-level HTML blocks into hash entries - text = _HashHTMLBlocks(text); - - // Strip link definitions, store in hashes. - text = _StripLinkDefinitions(text); - - text = _RunBlockGamut(text); - - text = _UnescapeSpecialChars(text); - - // attacklab: Restore dollar signs - text = text.replace(/~D/g, "$$"); - - // attacklab: Restore tildes - text = text.replace(/~T/g, "~"); - - text = pluginHooks.postConversion(text); - - g_html_blocks = g_titles = g_urls = null; - - return text; - }; - - function _StripLinkDefinitions(text) { - // - // Strips link definitions from text, stores the URLs and titles in - // hash references. - // - - // Link defs are in the form: ^[id]: url "optional title" - - /* - text = text.replace(/ - ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1 - [ \t]* - \n? // maybe *one* newline - [ \t]* - ? // url = $2 - (?=\s|$) // lookahead for whitespace instead of the lookbehind removed below - [ \t]* - \n? // maybe one newline - [ \t]* - ( // (potential) title = $3 - (\n*) // any lines skipped = $4 attacklab: lookbehind removed - [ \t]+ - ["(] - (.+?) // title = $5 - [")] - [ \t]* - )? // title is optional - (?:\n+|$) - /gm, function(){...}); - */ - - text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm, - function (wholeMatch, m1, m2, m3, m4, m5) { - m1 = m1.toLowerCase(); - g_urls.set(m1, _EncodeAmpsAndAngles(m2)); // Link IDs are case-insensitive - if (m4) { - // Oops, found blank lines, so it's not a title. - // Put back the parenthetical statement we stole. - return m3; - } else if (m5) { - g_titles.set(m1, m5.replace(/"/g, """)); - } - - // Completely remove the definition from the text - return ""; - } - ); - - return text; - } - - function _HashHTMLBlocks(text) { - - // Hashify HTML blocks: - // We only want to do this for block-level HTML tags, such as headers, - // lists, and tables. That's because we still want to wrap

      s around - // "paragraphs" that are wrapped in non-block-level tags, such as anchors, - // phrase emphasis, and spans. The list of tags we're looking for is - // hard-coded: - var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del" - var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math" - - // First, look for nested blocks, e.g.: - //

      - //
      - // tags for inner block must be indented. - //
      - //
      - // - // The outermost tags must start at the left margin for this to match, and - // the inner nested divs must be indented. - // We need to do this before the next, more liberal match, because the next - // match will start at the first `
      ` and stop at the first `
      `. - - // attacklab: This regex can be expensive when it fails. - - /* - text = text.replace(/ - ( // save in $1 - ^ // start of line (with /m) - <($block_tags_a) // start tag = $2 - \b // word break - // attacklab: hack around khtml/pcre bug... - [^\r]*?\n // any number of lines, minimally matching - // the matching end tag - [ \t]* // trailing spaces/tabs - (?=\n+) // followed by a newline - ) // attacklab: there are sentinel newlines at end of document - /gm,function(){...}}; - */ - text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, hashElement); - - // - // Now match more liberally, simply from `\n` to `\n` - // - - /* - text = text.replace(/ - ( // save in $1 - ^ // start of line (with /m) - <($block_tags_b) // start tag = $2 - \b // word break - // attacklab: hack around khtml/pcre bug... - [^\r]*? // any number of lines, minimally matching - .* // the matching end tag - [ \t]* // trailing spaces/tabs - (?=\n+) // followed by a newline - ) // attacklab: there are sentinel newlines at end of document - /gm,function(){...}}; - */ - text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm, hashElement); - - // Special case just for
      . It was easier to make a special case than - // to make the other regex more complicated. - - /* - text = text.replace(/ - \n // Starting after a blank line - [ ]{0,3} - ( // save in $1 - (<(hr) // start tag = $2 - \b // word break - ([^<>])*? - \/?>) // the matching end tag - [ \t]* - (?=\n{2,}) // followed by a blank line - ) - /g,hashElement); - */ - text = text.replace(/\n[ ]{0,3}((<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, hashElement); - - // Special case for standalone HTML comments: - - /* - text = text.replace(/ - \n\n // Starting after a blank line - [ ]{0,3} // attacklab: g_tab_width - 1 - ( // save in $1 - -]|-[^>])(?:[^-]|-[^-])*)--) // see http://www.w3.org/TR/html-markup/syntax.html#comments and http://meta.stackoverflow.com/q/95256 - > - [ \t]* - (?=\n{2,}) // followed by a blank line - ) - /g,hashElement); - */ - text = text.replace(/\n\n[ ]{0,3}(-]|-[^>])(?:[^-]|-[^-])*)--)>[ \t]*(?=\n{2,}))/g, hashElement); - - // PHP and ASP-style processor instructions ( and <%...%>) - - /* - text = text.replace(/ - (?: - \n\n // Starting after a blank line - ) - ( // save in $1 - [ ]{0,3} // attacklab: g_tab_width - 1 - (?: - <([?%]) // $2 - [^\r]*? - \2> - ) - [ \t]* - (?=\n{2,}) // followed by a blank line - ) - /g,hashElement); - */ - text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, hashElement); - - return text; - } - - function hashElement(wholeMatch, m1) { - var blockText = m1; - - // Undo double lines - blockText = blockText.replace(/^\n+/, ""); - - // strip trailing blank lines - blockText = blockText.replace(/\n+$/g, ""); - - // Replace the element text with a marker ("~KxK" where x is its key) - blockText = "\n\n~K" + (g_html_blocks.push(blockText) - 1) + "K\n\n"; - - return blockText; - } - - var blockGamutHookCallback = function (t) { return _RunBlockGamut(t); } - - function _RunBlockGamut(text, doNotUnhash) { - // - // These are all the transformations that form block-level - // tags like paragraphs, headers, and list items. - // - - text = pluginHooks.preBlockGamut(text, blockGamutHookCallback); - - text = _DoHeaders(text); - - // Do Horizontal Rules: - var replacement = "
      \n"; - text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, replacement); - text = text.replace(/^[ ]{0,2}([ ]?-[ ]?){3,}[ \t]*$/gm, replacement); - text = text.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm, replacement); - - text = _DoLists(text); - text = _DoCodeBlocks(text); - text = _DoBlockQuotes(text); - - text = pluginHooks.postBlockGamut(text, blockGamutHookCallback); - - // We already ran _HashHTMLBlocks() before, in Markdown(), but that - // was to escape raw HTML in the original Markdown source. This time, - // we're escaping the markup we've just created, so that we don't wrap - //

      tags around block-level tags. - text = _HashHTMLBlocks(text); - text = _FormParagraphs(text, doNotUnhash); - - return text; - } - - function _RunSpanGamut(text) { - // - // These are all the transformations that occur *within* block-level - // tags like paragraphs, headers, and list items. - // - - text = pluginHooks.preSpanGamut(text); - - text = _DoCodeSpans(text); - text = _EscapeSpecialCharsWithinTagAttributes(text); - text = _EncodeBackslashEscapes(text); - - // Process anchor and image tags. Images must come first, - // because ![foo][f] looks like an anchor. - text = _DoImages(text); - text = _DoAnchors(text); - - // Make links out of things like `` - // Must come after _DoAnchors(), because you can use < and > - // delimiters in inline links like [this](). - text = _DoAutoLinks(text); - - text = text.replace(/~P/g, "://"); // put in place to prevent autolinking; reset now - - text = _EncodeAmpsAndAngles(text); - text = _DoItalicsAndBold(text); - - // Do hard breaks: - text = text.replace(/ +\n/g, "
      \n"); - - text = pluginHooks.postSpanGamut(text); - - return text; - } - - function _EscapeSpecialCharsWithinTagAttributes(text) { - // - // Within tags -- meaning between < and > -- encode [\ ` * _] so they - // don't conflict with their use in Markdown for code, italics and strong. - // - - // Build a regex to find HTML tags and comments. See Friedl's - // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. - - // SE: changed the comment part of the regex - - var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|-]|-[^>])(?:[^-]|-[^-])*)--)>)/gi; - - text = text.replace(regex, function (wholeMatch) { - var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, "$1`"); - tag = escapeCharacters(tag, wholeMatch.charAt(1) == "!" ? "\\`*_/" : "\\`*_"); // also escape slashes in comments to prevent autolinking there -- http://meta.stackoverflow.com/questions/95987 - return tag; - }); - - return text; - } - - function _DoAnchors(text) { - // - // Turn Markdown link shortcuts into XHTML
      tags. - // - // - // First, handle reference-style links: [link text] [id] - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - \[ - ( - (?: - \[[^\]]*\] // allow brackets nested one level - | - [^\[] // or anything else - )* - ) - \] - - [ ]? // one optional space - (?:\n[ ]*)? // one optional newline followed by spaces - - \[ - (.*?) // id = $3 - \] - ) - ()()()() // pad remaining backreferences - /g, writeAnchorTag); - */ - text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag); - - // - // Next, inline-style links: [link text](url "optional title") - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - \[ - ( - (?: - \[[^\]]*\] // allow brackets nested one level - | - [^\[\]] // or anything else - )* - ) - \] - \( // literal paren - [ \t]* - () // no id, so leave $3 empty - ? - [ \t]* - ( // $5 - (['"]) // quote char = $6 - (.*?) // Title = $7 - \6 // matching quote - [ \t]* // ignore any spaces/tabs between closing quote and ) - )? // title is optional - \) - ) - /g, writeAnchorTag); - */ - - text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag); - - // - // Last, handle reference-style shortcuts: [link text] - // These must come last in case you've also got [link test][1] - // or [link test](/foo) - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - \[ - ([^\[\]]+) // link text = $2; can't contain '[' or ']' - \] - ) - ()()()()() // pad rest of backreferences - /g, writeAnchorTag); - */ - text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag); - - return text; - } - - function writeAnchorTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) { - if (m7 == undefined) m7 = ""; - var whole_match = m1; - var link_text = m2.replace(/:\/\//g, "~P"); // to prevent auto-linking withing the link. will be converted back after the auto-linker runs - var link_id = m3.toLowerCase(); - var url = m4; - var title = m7; - - if (url == "") { - if (link_id == "") { - // lower-case and turn embedded newlines into spaces - link_id = link_text.toLowerCase().replace(/ ?\n/g, " "); - } - url = "#" + link_id; - - if (g_urls.get(link_id) != undefined) { - url = g_urls.get(link_id); - if (g_titles.get(link_id) != undefined) { - title = g_titles.get(link_id); - } - } - else { - if (whole_match.search(/\(\s*\)$/m) > -1) { - // Special case for explicit empty url - url = ""; - } else { - return whole_match; - } - } - } - url = encodeProblemUrlChars(url); - url = escapeCharacters(url, "*_"); - var result = ""; - - return result; - } - - function _DoImages(text) { - // - // Turn Markdown image shortcuts into tags. - // - - // - // First, handle reference-style labeled images: ![alt text][id] - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - !\[ - (.*?) // alt text = $2 - \] - - [ ]? // one optional space - (?:\n[ ]*)? // one optional newline followed by spaces - - \[ - (.*?) // id = $3 - \] - ) - ()()()() // pad rest of backreferences - /g, writeImageTag); - */ - text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag); - - // - // Next, handle inline images: ![alt text](url "optional title") - // Don't forget: encode * and _ - - /* - text = text.replace(/ - ( // wrap whole match in $1 - !\[ - (.*?) // alt text = $2 - \] - \s? // One optional whitespace character - \( // literal paren - [ \t]* - () // no id, so leave $3 empty - ? // src url = $4 - [ \t]* - ( // $5 - (['"]) // quote char = $6 - (.*?) // title = $7 - \6 // matching quote - [ \t]* - )? // title is optional - \) - ) - /g, writeImageTag); - */ - text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeImageTag); - - return text; - } - - function attributeEncode(text) { - // unconditionally replace angle brackets here -- what ends up in an attribute (e.g. alt or title) - // never makes sense to have verbatim HTML in it (and the sanitizer would totally break it) - return text.replace(/>/g, ">").replace(/" + _RunSpanGamut(m1) + "\n\n"; } - ); - - text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, - function (matchFound, m1) { return "

      " + _RunSpanGamut(m1) + "

      \n\n"; } - ); - - // atx-style headers: - // # Header 1 - // ## Header 2 - // ## Header 2 with closing hashes ## - // ... - // ###### Header 6 - // - - /* - text = text.replace(/ - ^(\#{1,6}) // $1 = string of #'s - [ \t]* - (.+?) // $2 = Header text - [ \t]* - \#* // optional closing #'s (not counted) - \n+ - /gm, function() {...}); - */ - - text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, - function (wholeMatch, m1, m2) { - var h_level = m1.length; - return "" + _RunSpanGamut(m2) + "\n\n"; - } - ); - - return text; - } - - function _DoLists(text) { - // - // Form HTML ordered (numbered) and unordered (bulleted) lists. - // - - // attacklab: add sentinel to hack around khtml/safari bug: - // http://bugs.webkit.org/show_bug.cgi?id=11231 - text += "~0"; - - // Re-usable pattern to match any entirel ul or ol list: - - /* - var whole_list = / - ( // $1 = whole list - ( // $2 - [ ]{0,3} // attacklab: g_tab_width - 1 - ([*+-]|\d+[.]) // $3 = first list item marker - [ \t]+ - ) - [^\r]+? - ( // $4 - ~0 // sentinel for workaround; should be $ - | - \n{2,} - (?=\S) - (?! // Negative lookahead for another list item marker - [ \t]* - (?:[*+-]|\d+[.])[ \t]+ - ) - ) - ) - /g - */ - var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; - - if (g_list_level) { - text = text.replace(whole_list, function (wholeMatch, m1, m2) { - var list = m1; - var list_type = (m2.search(/[*+-]/g) > -1) ? "ul" : "ol"; - - var result = _ProcessListItems(list, list_type); - - // Trim any trailing whitespace, to put the closing `` - // up on the preceding line, to get it past the current stupid - // HTML block parser. This is a hack to work around the terrible - // hack that is the HTML block parser. - result = result.replace(/\s+$/, ""); - result = "<" + list_type + ">" + result + "\n"; - return result; - }); - } else { - whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; - text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) { - var runup = m1; - var list = m2; - - var list_type = (m3.search(/[*+-]/g) > -1) ? "ul" : "ol"; - var result = _ProcessListItems(list, list_type); - result = runup + "<" + list_type + ">\n" + result + "\n"; - return result; - }); - } - - // attacklab: strip sentinel - text = text.replace(/~0/, ""); - - return text; - } - - var _listItemMarkers = { ol: "\\d+[.]", ul: "[*+-]" }; - - function _ProcessListItems(list_str, list_type) { - // - // Process the contents of a single ordered or unordered list, splitting it - // into individual list items. - // - // list_type is either "ul" or "ol". - - // The $g_list_level global keeps track of when we're inside a list. - // Each time we enter a list, we increment it; when we leave a list, - // we decrement. If it's zero, we're not in a list anymore. - // - // We do this because when we're not inside a list, we want to treat - // something like this: - // - // I recommend upgrading to version - // 8. Oops, now this line is treated - // as a sub-list. - // - // As a single paragraph, despite the fact that the second line starts - // with a digit-period-space sequence. - // - // Whereas when we're inside a list (or sub-list), that line will be - // treated as the start of a sub-list. What a kludge, huh? This is - // an aspect of Markdown's syntax that's hard to parse perfectly - // without resorting to mind-reading. Perhaps the solution is to - // change the syntax rules such that sub-lists must start with a - // starting cardinal number; e.g. "1." or "a.". - - g_list_level++; - - // trim trailing blank lines: - list_str = list_str.replace(/\n{2,}$/, "\n"); - - // attacklab: add sentinel to emulate \z - list_str += "~0"; - - // In the original attacklab showdown, list_type was not given to this function, and anything - // that matched /[*+-]|\d+[.]/ would just create the next
    • , causing this mismatch: - // - // Markdown rendered by WMD rendered by MarkdownSharp - // ------------------------------------------------------------------ - // 1. first 1. first 1. first - // 2. second 2. second 2. second - // - third 3. third * third - // - // We changed this to behave identical to MarkdownSharp. This is the constructed RegEx, - // with {MARKER} being one of \d+[.] or [*+-], depending on list_type: - - /* - list_str = list_str.replace(/ - (^[ \t]*) // leading whitespace = $1 - ({MARKER}) [ \t]+ // list marker = $2 - ([^\r]+? // list item text = $3 - (\n+) - ) - (?= - (~0 | \2 ({MARKER}) [ \t]+) - ) - /gm, function(){...}); - */ - - var marker = _listItemMarkers[list_type]; - var re = new RegExp("(^[ \\t]*)(" + marker + ")[ \\t]+([^\\r]+?(\\n+))(?=(~0|\\1(" + marker + ")[ \\t]+))", "gm"); - var last_item_had_a_double_newline = false; - list_str = list_str.replace(re, - function (wholeMatch, m1, m2, m3) { - var item = m3; - var leading_space = m1; - var ends_with_double_newline = /\n\n$/.test(item); - var contains_double_newline = ends_with_double_newline || item.search(/\n{2,}/) > -1; - - if (contains_double_newline || last_item_had_a_double_newline) { - item = _RunBlockGamut(_Outdent(item), /* doNotUnhash = */true); - } - else { - // Recursion for sub-lists: - item = _DoLists(_Outdent(item)); - item = item.replace(/\n$/, ""); // chomp(item) - item = _RunSpanGamut(item); - } - last_item_had_a_double_newline = ends_with_double_newline; - return "
    • " + item + "
    • \n"; - } - ); - - // attacklab: strip sentinel - list_str = list_str.replace(/~0/g, ""); - - g_list_level--; - return list_str; - } - - function _DoCodeBlocks(text) { - // - // Process Markdown `
      ` blocks.
      -            //  
      -
      -            /*
      -            text = text.replace(/
      -                (?:\n\n|^)
      -                (                               // $1 = the code block -- one or more lines, starting with a space/tab
      -                    (?:
      -                        (?:[ ]{4}|\t)           // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
      -                        .*\n+
      -                    )+
      -                )
      -                (\n*[ ]{0,3}[^ \t\n]|(?=~0))    // attacklab: g_tab_width
      -            /g ,function(){...});
      -            */
      -
      -            // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
      -            text += "~0";
      -
      -            text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
      -                function (wholeMatch, m1, m2) {
      -                    var codeblock = m1;
      -                    var nextChar = m2;
      -
      -                    codeblock = _EncodeCode(_Outdent(codeblock));
      -                    codeblock = _Detab(codeblock);
      -                    codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines
      -                    codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace
      -
      -                    codeblock = "
      " + codeblock + "\n
      "; - - return "\n\n" + codeblock + "\n\n" + nextChar; - } - ); - - // attacklab: strip sentinel - text = text.replace(/~0/, ""); - - return text; - } - - function hashBlock(text) { - text = text.replace(/(^\n+|\n+$)/g, ""); - return "\n\n~K" + (g_html_blocks.push(text) - 1) + "K\n\n"; - } - - function _DoCodeSpans(text) { - // - // * Backtick quotes are used for spans. - // - // * You can use multiple backticks as the delimiters if you want to - // include literal backticks in the code span. So, this input: - // - // Just type ``foo `bar` baz`` at the prompt. - // - // Will translate to: - // - //

      Just type foo `bar` baz at the prompt.

      - // - // There's no arbitrary limit to the number of backticks you - // can use as delimters. If you need three consecutive backticks - // in your code, use four for delimiters, etc. - // - // * You can use spaces to get literal backticks at the edges: - // - // ... type `` `bar` `` ... - // - // Turns to: - // - // ... type `bar` ... - // - - /* - text = text.replace(/ - (^|[^\\]) // Character before opening ` can't be a backslash - (`+) // $2 = Opening run of ` - ( // $3 = The code block - [^\r]*? - [^`] // attacklab: work around lack of lookbehind - ) - \2 // Matching closer - (?!`) - /gm, function(){...}); - */ - - text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, - function (wholeMatch, m1, m2, m3, m4) { - var c = m3; - c = c.replace(/^([ \t]*)/g, ""); // leading whitespace - c = c.replace(/[ \t]*$/g, ""); // trailing whitespace - c = _EncodeCode(c); - c = c.replace(/:\/\//g, "~P"); // to prevent auto-linking. Not necessary in code *blocks*, but in code spans. Will be converted back after the auto-linker runs. - return m1 + "" + c + ""; - } - ); - - return text; - } - - function _EncodeCode(text) { - // - // Encode/escape certain characters inside Markdown code runs. - // The point is that in code, these characters are literals, - // and lose their special Markdown meanings. - // - // Encode all ampersands; HTML entities are not - // entities within a Markdown code span. - text = text.replace(/&/g, "&"); - - // Do the angle bracket song and dance: - text = text.replace(//g, ">"); - - // Now, escape characters that are magic in Markdown: - text = escapeCharacters(text, "\*_{}[]\\", false); - - // jj the line above breaks this: - //--- - - //* Item - - // 1. Subitem - - // special char: * - //--- - - return text; - } - - function _DoItalicsAndBold(text) { - - // must go first: - text = text.replace(/([\W_]|^)(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\2([\W_]|$)/g, - "$1$3$4"); - - text = text.replace(/([\W_]|^)(\*|_)(?=\S)([^\r\*_]*?\S)\2([\W_]|$)/g, - "$1$3$4"); - - return text; - } - - function _DoBlockQuotes(text) { - - /* - text = text.replace(/ - ( // Wrap whole match in $1 - ( - ^[ \t]*>[ \t]? // '>' at the start of a line - .+\n // rest of the first line - (.+\n)* // subsequent consecutive lines - \n* // blanks - )+ - ) - /gm, function(){...}); - */ - - text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, - function (wholeMatch, m1) { - var bq = m1; - - // attacklab: hack around Konqueror 3.5.4 bug: - // "----------bug".replace(/^-/g,"") == "bug" - - bq = bq.replace(/^[ \t]*>[ \t]?/gm, "~0"); // trim one level of quoting - - // attacklab: clean up hack - bq = bq.replace(/~0/g, ""); - - bq = bq.replace(/^[ \t]+$/gm, ""); // trim whitespace-only lines - bq = _RunBlockGamut(bq); // recurse - - bq = bq.replace(/(^|\n)/g, "$1 "); - // These leading spaces screw with
       content, so we need to fix that:
      -                    bq = bq.replace(
      -                            /(\s*
      [^\r]+?<\/pre>)/gm,
      -                        function (wholeMatch, m1) {
      -                            var pre = m1;
      -                            // attacklab: hack around Konqueror 3.5.4 bug:
      -                            pre = pre.replace(/^  /mg, "~0");
      -                            pre = pre.replace(/~0/g, "");
      -                            return pre;
      -                        });
      -
      -                    return hashBlock("
      \n" + bq + "\n
      "); - } - ); - return text; - } - - function _FormParagraphs(text, doNotUnhash) { - // - // Params: - // $text - string to process with html

      tags - // - - // Strip leading and trailing lines: - text = text.replace(/^\n+/g, ""); - text = text.replace(/\n+$/g, ""); - - var grafs = text.split(/\n{2,}/g); - var grafsOut = []; - - var markerRe = /~K(\d+)K/; - - // - // Wrap

      tags. - // - var end = grafs.length; - for (var i = 0; i < end; i++) { - var str = grafs[i]; - - // if this is an HTML marker, copy it - if (markerRe.test(str)) { - grafsOut.push(str); - } - else if (/\S/.test(str)) { - str = _RunSpanGamut(str); - str = str.replace(/^([ \t]*)/g, "

      "); - str += "

      " - grafsOut.push(str); - } - - } - // - // Unhashify HTML blocks - // - if (!doNotUnhash) { - end = grafsOut.length; - for (var i = 0; i < end; i++) { - var foundAny = true; - while (foundAny) { // we may need several runs, since the data may be nested - foundAny = false; - grafsOut[i] = grafsOut[i].replace(/~K(\d+)K/g, function (wholeMatch, id) { - foundAny = true; - return g_html_blocks[id]; - }); - } - } - } - return grafsOut.join("\n\n"); - } - - function _EncodeAmpsAndAngles(text) { - // Smart processing for ampersands and angle brackets that need to be encoded. - - // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: - // http://bumppo.net/projects/amputator/ - text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&"); - - // Encode naked <'s - text = text.replace(/<(?![a-z\/?!]|~D)/gi, "<"); - - return text; - } - - function _EncodeBackslashEscapes(text) { - // - // Parameter: String. - // Returns: The string, with after processing the following backslash - // escape sequences. - // - - // attacklab: The polite way to do this is with the new - // escapeCharacters() function: - // - // text = escapeCharacters(text,"\\",true); - // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); - // - // ...but we're sidestepping its use of the (slow) RegExp constructor - // as an optimization for Firefox. This function gets called a LOT. - - text = text.replace(/\\(\\)/g, escapeCharacters_callback); - text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, escapeCharacters_callback); - return text; - } - - function handleTrailingParens(wholeMatch, lookbehind, protocol, link) { - if (lookbehind) - return wholeMatch; - if (link.charAt(link.length - 1) !== ")") - return "<" + protocol + link + ">"; - var parens = link.match(/[()]/g); - var level = 0; - for (var i = 0; i < parens.length; i++) { - if (parens[i] === "(") { - if (level <= 0) - level = 1; - else - level++; - } - else { - level--; - } - } - var tail = ""; - if (level < 0) { - var re = new RegExp("\\){1," + (-level) + "}$"); - link = link.replace(re, function (trailingParens) { - tail = trailingParens; - return ""; - }); - } - - return "<" + protocol + link + ">" + tail; - } - - function _DoAutoLinks(text) { - - // note that at this point, all other URL in the text are already hyperlinked as
      - // *except* for the case - - // automatically add < and > around unadorned raw hyperlinks - // must be preceded by a non-word character (and not by =" or <) and followed by non-word/EOF character - // simulating the lookbehind in a consuming way is okay here, since a URL can neither and with a " nor - // with a <, so there is no risk of overlapping matches. - text = text.replace(/(="|<)?\b(https?|ftp)(:\/\/[-A-Z0-9+&@#\/%?=~_|\[\]\(\)!:,\.;]*[-A-Z0-9+&@#\/%=~_|\[\])])(?=$|\W)/gi, handleTrailingParens); - - // autolink anything like - - var replacer = function (wholematch, m1) { return "" + pluginHooks.plainLinkText(m1) + ""; } - text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, replacer); - - // Email addresses: - /* - text = text.replace(/ - < - (?:mailto:)? - ( - [-.\w]+ - \@ - [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ - ) - > - /gi, _DoAutoLinks_callback()); - */ - - /* disabling email autolinking, since we don't do that on the server, either - text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, - function(wholeMatch,m1) { - return _EncodeEmailAddress( _UnescapeSpecialChars(m1) ); - } - ); - */ - return text; - } - - function _UnescapeSpecialChars(text) { - // - // Swap back in all the special characters we've hidden. - // - text = text.replace(/~E(\d+)E/g, - function (wholeMatch, m1) { - var charCodeToReplace = parseInt(m1); - return String.fromCharCode(charCodeToReplace); - } - ); - return text; - } - - function _Outdent(text) { - // - // Remove one level of line-leading tabs or spaces - // - - // attacklab: hack around Konqueror 3.5.4 bug: - // "----------bug".replace(/^-/g,"") == "bug" - - text = text.replace(/^(\t|[ ]{1,4})/gm, "~0"); // attacklab: g_tab_width - - // attacklab: clean up hack - text = text.replace(/~0/g, "") - - return text; - } - - function _Detab(text) { - if (!/\t/.test(text)) - return text; - - var spaces = [" ", " ", " ", " "], - skew = 0, - v; - - return text.replace(/[\n\t]/g, function (match, offset) { - if (match === "\n") { - skew = offset + 1; - return match; - } - v = (offset - skew) % 4; - skew = offset + 1; - return spaces[v]; - }); - } - - // - // attacklab: Utility functions - // - - var _problemUrlChars = /(?:["'*()[\]:]|~D)/g; - - // hex-encodes some unusual "problem" chars in URLs to avoid URL detection problems - function encodeProblemUrlChars(url) { - if (!url) - return ""; - - var len = url.length; - - return url.replace(_problemUrlChars, function (match, offset) { - if (match == "~D") // escape for dollar - return "%24"; - if (match == ":") { - if (offset == len - 1 || /[0-9\/]/.test(url.charAt(offset + 1))) - return ":" - } - return "%" + match.charCodeAt(0).toString(16); - }); - } - - - function escapeCharacters(text, charsToEscape, afterBackslash) { - // First we have to escape the escape characters so that - // we can build a character class out of them - var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g, "\\$1") + "])"; - - if (afterBackslash) { - regexString = "\\\\" + regexString; - } - - var regex = new RegExp(regexString, "g"); - text = text.replace(regex, escapeCharacters_callback); - - return text; - } - - - function escapeCharacters_callback(wholeMatch, m1) { - var charCodeToEscape = m1.charCodeAt(0); - return "~E" + charCodeToEscape + "E"; - } - - }; // end of the Markdown.Converter constructor - -})(); diff --git a/docs/js/Markdown.Extra.js b/docs/js/Markdown.Extra.js deleted file mode 100644 index 6ab5e42b73..0000000000 --- a/docs/js/Markdown.Extra.js +++ /dev/null @@ -1,787 +0,0 @@ -(function () { - // A quick way to make sure we're only keeping span-level tags when we need to. - // This isn't supposed to be foolproof. It's just a quick way to make sure we - // keep all span-level tags returned by a pagedown converter. It should allow - // all span-level tags through, with or without attributes. - var inlineTags = new RegExp(['^(<\\/?(a|abbr|acronym|applet|area|b|basefont|', - 'bdo|big|button|cite|code|del|dfn|em|figcaption|', - 'font|i|iframe|img|input|ins|kbd|label|map|', - 'mark|meter|object|param|progress|q|ruby|rp|rt|s|', - 'samp|script|select|small|span|strike|strong|', - 'sub|sup|textarea|time|tt|u|var|wbr)[^>]*>|', - '<(br)\\s?\\/?>)$'].join(''), 'i'); - - /****************************************************************** - * Utility Functions * - *****************************************************************/ - - // patch for ie7 - if (!Array.indexOf) { - Array.prototype.indexOf = function(obj) { - for (var i = 0; i < this.length; i++) { - if (this[i] == obj) { - return i; - } - } - return -1; - }; - } - - function trim(str) { - return str.replace(/^\s+|\s+$/g, ''); - } - - function rtrim(str) { - return str.replace(/\s+$/g, ''); - } - - // Remove one level of indentation from text. Indent is 4 spaces. - function outdent(text) { - return text.replace(new RegExp('^(\\t|[ ]{1,4})', 'gm'), ''); - } - - function contains(str, substr) { - return str.indexOf(substr) != -1; - } - - // Sanitize html, removing tags that aren't in the whitelist - function sanitizeHtml(html, whitelist) { - return html.replace(/<[^>]*>?/gi, function(tag) { - return tag.match(whitelist) ? tag : ''; - }); - } - - // Merge two arrays, keeping only unique elements. - function union(x, y) { - var obj = {}; - for (var i = 0; i < x.length; i++) - obj[x[i]] = x[i]; - for (i = 0; i < y.length; i++) - obj[y[i]] = y[i]; - var res = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) - res.push(obj[k]); - } - return res; - } - - // JS regexes don't support \A or \Z, so we add sentinels, as Pagedown - // does. In this case, we add the ascii codes for start of text (STX) and - // end of text (ETX), an idea borrowed from: - // https://github.com/tanakahisateru/js-markdown-extra - function addAnchors(text) { - if(text.charAt(0) != '\x02') - text = '\x02' + text; - if(text.charAt(text.length - 1) != '\x03') - text = text + '\x03'; - return text; - } - - // Remove STX and ETX sentinels. - function removeAnchors(text) { - if(text.charAt(0) == '\x02') - text = text.substr(1); - if(text.charAt(text.length - 1) == '\x03') - text = text.substr(0, text.length - 1); - return text; - } - - // Convert markdown within an element, retaining only span-level tags - function convertSpans(text, extra) { - return sanitizeHtml(convertAll(text, extra), inlineTags); - } - - // Convert internal markdown using the stock pagedown converter - function convertAll(text, extra) { - var result = extra.blockGamutHookCallback(text); - // We need to perform these operations since we skip the steps in the converter - result = unescapeSpecialChars(result); - result = result.replace(/~D/g, "$$").replace(/~T/g, "~"); - result = extra.previousPostConversion(result); - return result; - } - - // Convert escaped special characters to HTML decimal entity codes. - function processEscapes(text) { - // Markdown extra adds two escapable characters, `:` and `|` - // If escaped, we convert them to html entities so our - // regexes don't recognize them. Markdown doesn't support escaping - // the escape character, e.g. `\\`, which make this even simpler. - return text.replace(/\\\|/g, '|').replace(/\\:/g, ':'); - } - - // Duplicated from PageDown converter - function unescapeSpecialChars(text) { - // Swap back in all the special characters we've hidden. - text = text.replace(/~E(\d+)E/g, function(wholeMatch, m1) { - var charCodeToReplace = parseInt(m1); - return String.fromCharCode(charCodeToReplace); - }); - return text; - } - - function slugify(text) { - return text.toLowerCase() - .replace(/\s+/g, '-') // Replace spaces with - - .replace(/[^\w\-]+/g, '') // Remove all non-word chars - .replace(/\-\-+/g, '-') // Replace multiple - with single - - .replace(/^-+/, '') // Trim - from start of text - .replace(/-+$/, ''); // Trim - from end of text - } - - /***************************************************************************** - * Markdown.Extra * - ****************************************************************************/ - - Markdown.Extra = function() { - // For converting internal markdown (in tables for instance). - // This is necessary since these methods are meant to be called as - // preConversion hooks, and the Markdown converter passed to init() - // won't convert any markdown contained in the html tags we return. - this.converter = null; - - // Stores html blocks we generate in hooks so that - // they're not destroyed if the user is using a sanitizing converter - this.hashBlocks = []; - - // Stores footnotes - this.footnotes = {}; - this.usedFootnotes = []; - - // Special attribute blocks for fenced code blocks and headers enabled. - this.attributeBlocks = false; - - // Fenced code block options - this.googleCodePrettify = false; - this.highlightJs = false; - - // Table options - this.tableClass = ''; - - this.tabWidth = 4; - }; - - Markdown.Extra.init = function(converter, options) { - // Each call to init creates a new instance of Markdown.Extra so it's - // safe to have multiple converters, with different options, on a single page - var extra = new Markdown.Extra(); - var postNormalizationTransformations = []; - var preBlockGamutTransformations = []; - var postConversionTransformations = ["unHashExtraBlocks"]; - - options = options || {}; - options.extensions = options.extensions || ["all"]; - if (contains(options.extensions, "all")) { - options.extensions = ["tables", "fenced_code_gfm", "def_list", "attr_list", "footnotes", "smartypants"]; - } - preBlockGamutTransformations.push("wrapHeaders"); - if (contains(options.extensions, "attr_list")) { - postNormalizationTransformations.push("hashFcbAttributeBlocks"); - preBlockGamutTransformations.push("hashHeaderAttributeBlocks"); - postConversionTransformations.push("applyAttributeBlocks"); - extra.attributeBlocks = true; - } - if (contains(options.extensions, "fenced_code_gfm")) { - postNormalizationTransformations.push("fencedCodeBlocks"); - } - if (contains(options.extensions, "tables")) { - preBlockGamutTransformations.push("tables"); - } - if (contains(options.extensions, "def_list")) { - preBlockGamutTransformations.push("definitionLists"); - } - if (contains(options.extensions, "footnotes")) { - postNormalizationTransformations.push("stripFootnoteDefinitions"); - preBlockGamutTransformations.push("doFootnotes"); - postConversionTransformations.push("printFootnotes"); - } - if (contains(options.extensions, "smartypants")) { - postConversionTransformations.push("runSmartyPants"); - } - - converter.hooks.chain("postNormalization", function(text) { - return extra.doTransform(postNormalizationTransformations, text) + '\n'; - }); - - converter.hooks.chain("preBlockGamut", function(text, blockGamutHookCallback) { - // Keep a reference to the block gamut callback to run recursively - extra.blockGamutHookCallback = blockGamutHookCallback; - text = processEscapes(text); - return extra.doTransform(preBlockGamutTransformations, text) + '\n'; - }); - - // Keep a reference to the hook chain running before doPostConversion to apply on hashed extra blocks - extra.previousPostConversion = converter.hooks.postConversion; - converter.hooks.chain("postConversion", function(text) { - text = extra.doTransform(postConversionTransformations, text); - // Clear state vars that may use unnecessary memory - extra.hashBlocks = []; - extra.footnotes = {}; - extra.usedFootnotes = []; - return text; - }); - - if ("highlighter" in options) { - extra.googleCodePrettify = options.highlighter === 'prettify'; - extra.highlightJs = options.highlighter === 'highlight'; - } - - if ("table_class" in options) { - extra.tableClass = options.table_class; - } - - extra.converter = converter; - - // Caller usually won't need this, but it's handy for testing. - return extra; - }; - - // Do transformations - Markdown.Extra.prototype.doTransform = function(transformations, text) { - for(var i = 0; i < transformations.length; i++) - text = this[transformations[i]](text); - return text; - }; - - // Return a placeholder containing a key, which is the block's index in the - // hashBlocks array. We wrap our output in a

      tag here so Pagedown won't. - Markdown.Extra.prototype.hashExtraBlock = function(block) { - return '\n

      ~X' + (this.hashBlocks.push(block) - 1) + 'X

      \n'; - }; - Markdown.Extra.prototype.hashExtraInline = function(block) { - return '~X' + (this.hashBlocks.push(block) - 1) + 'X'; - }; - - // Replace placeholder blocks in `text` with their corresponding - // html blocks in the hashBlocks array. - Markdown.Extra.prototype.unHashExtraBlocks = function(text) { - var self = this; - function recursiveUnHash() { - var hasHash = false; - text = text.replace(/(?:

      )?~X(\d+)X(?:<\/p>)?/g, function(wholeMatch, m1) { - hasHash = true; - var key = parseInt(m1, 10); - return self.hashBlocks[key]; - }); - if(hasHash === true) { - recursiveUnHash(); - } - } - recursiveUnHash(); - return text; - }; - - // Wrap headers to make sure they won't be in def lists - Markdown.Extra.prototype.wrapHeaders = function(text) { - function wrap(text) { - return '\n' + text + '\n'; - } - text = text.replace(/^.+[ \t]*\n=+[ \t]*\n+/gm, wrap); - text = text.replace(/^.+[ \t]*\n-+[ \t]*\n+/gm, wrap); - text = text.replace(/^\#{1,6}[ \t]*.+?[ \t]*\#*\n+/gm, wrap); - return text; - }; - - - /****************************************************************** - * Attribute Blocks * - *****************************************************************/ - - // Extract headers attribute blocks, move them above the element they will be - // applied to, and hash them for later. - Markdown.Extra.prototype.hashHeaderAttributeBlocks = function(text) { - // TODO: use sentinels. Should we just add/remove them in doConversion? - // TODO: better matches for id / class attributes - var attrBlock = "\\{\\s*[.|#][^}]+\\}"; - var hdrAttributesA = new RegExp("^(#{1,6}.*#{0,6})\\s+(" + attrBlock + ")[ \\t]*(\\n|0x03)", "gm"); - var hdrAttributesB = new RegExp("^(.*)\\s+(" + attrBlock + ")[ \\t]*\\n" + - "(?=[\\-|=]+\\s*(\\n|0x03))", "gm"); // underline lookahead - - var self = this; - function attributeCallback(wholeMatch, pre, attr) { - return '

      ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

      \n' + pre + "\n"; - } - - text = text.replace(hdrAttributesA, attributeCallback); // ## headers - text = text.replace(hdrAttributesB, attributeCallback); // underline headers - return text; - }; - - // Extract FCB attribute blocks, move them above the element they will be - // applied to, and hash them for later. - Markdown.Extra.prototype.hashFcbAttributeBlocks = function(text) { - // TODO: use sentinels. Should we just add/remove them in doConversion? - // TODO: better matches for id / class attributes - var attrBlock = "\\{\\s*[.|#][^}]+\\}"; - var fcbAttributes = new RegExp("^(```[^{\\n]*)\\s+(" + attrBlock + ")[ \\t]*\\n" + - "(?=([\\s\\S]*?)\\n```\\s*(\\n|0x03))", "gm"); - - var self = this; - function attributeCallback(wholeMatch, pre, attr) { - return '

      ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

      \n' + pre + "\n"; - } - - return text.replace(fcbAttributes, attributeCallback); - }; - - Markdown.Extra.prototype.applyAttributeBlocks = function(text) { - var self = this; - var blockRe = new RegExp('

      ~XX(\\d+)XX

      [\\s]*' + - '(?:<(h[1-6]|pre)(?: +class="(\\S+)")?(>[\\s\\S]*?))', "gm"); - text = text.replace(blockRe, function(wholeMatch, k, tag, cls, rest) { - if (!tag) // no following header or fenced code block. - return ''; - - // get attributes list from hash - var key = parseInt(k, 10); - var attributes = self.hashBlocks[key]; - - // get id - var id = attributes.match(/#[^\s{}]+/g) || []; - var idStr = id[0] ? ' id="' + id[0].substr(1, id[0].length - 1) + '"' : ''; - - // get classes and merge with existing classes - var classes = attributes.match(/\.[^\s{}]+/g) || []; - for (var i = 0; i < classes.length; i++) // Remove leading dot - classes[i] = classes[i].substr(1, classes[i].length - 1); - - var classStr = ''; - if (cls) - classes = union(classes, [cls]); - - if (classes.length > 0) - classStr = ' class="' + classes.join(' ') + '"'; - - return "<" + tag + idStr + classStr + rest; - }); - - return text; - }; - - /****************************************************************** - * Tables * - *****************************************************************/ - - // Find and convert Markdown Extra tables into html. - Markdown.Extra.prototype.tables = function(text) { - var self = this; - - var leadingPipe = new RegExp( - ['^' , - '[ ]{0,3}' , // Allowed whitespace - '[|]' , // Initial pipe - '(.+)\\n' , // $1: Header Row - - '[ ]{0,3}' , // Allowed whitespace - '[|]([ ]*[-:]+[-| :]*)\\n' , // $2: Separator - - '(' , // $3: Table Body - '(?:[ ]*[|].*\\n?)*' , // Table rows - ')', - '(?:\\n|$)' // Stop at final newline - ].join(''), - 'gm' - ); - - var noLeadingPipe = new RegExp( - ['^' , - '[ ]{0,3}' , // Allowed whitespace - '(\\S.*[|].*)\\n' , // $1: Header Row - - '[ ]{0,3}' , // Allowed whitespace - '([-:]+[ ]*[|][-| :]*)\\n' , // $2: Separator - - '(' , // $3: Table Body - '(?:.*[|].*\\n?)*' , // Table rows - ')' , - '(?:\\n|$)' // Stop at final newline - ].join(''), - 'gm' - ); - - text = text.replace(leadingPipe, doTable); - text = text.replace(noLeadingPipe, doTable); - - // $1 = header, $2 = separator, $3 = body - function doTable(match, header, separator, body, offset, string) { - // remove any leading pipes and whitespace - header = header.replace(/^ *[|]/m, ''); - separator = separator.replace(/^ *[|]/m, ''); - body = body.replace(/^ *[|]/gm, ''); - - // remove trailing pipes and whitespace - header = header.replace(/[|] *$/m, ''); - separator = separator.replace(/[|] *$/m, ''); - body = body.replace(/[|] *$/gm, ''); - - // determine column alignments - alignspecs = separator.split(/ *[|] */); - align = []; - for (var i = 0; i < alignspecs.length; i++) { - var spec = alignspecs[i]; - if (spec.match(/^ *-+: *$/m)) - align[i] = ' style="text-align:right;"'; - else if (spec.match(/^ *:-+: *$/m)) - align[i] = ' style="text-align:center;"'; - else if (spec.match(/^ *:-+ *$/m)) - align[i] = ' style="text-align:left;"'; - else align[i] = ''; - } - - // TODO: parse spans in header and rows before splitting, so that pipes - // inside of tags are not interpreted as separators - var headers = header.split(/ *[|] */); - var colCount = headers.length; - - // build html - var cls = self.tableClass ? ' class="' + self.tableClass + '"' : ''; - var html = ['\n', '\n', '\n'].join(''); - - // build column headers. - for (i = 0; i < colCount; i++) { - var headerHtml = convertSpans(trim(headers[i]), self); - html += [" ", headerHtml, "\n"].join(''); - } - html += "\n\n"; - - // build rows - var rows = body.split('\n'); - for (i = 0; i < rows.length; i++) { - if (rows[i].match(/^\s*$/)) // can apply to final row - continue; - - // ensure number of rowCells matches colCount - var rowCells = rows[i].split(/ *[|] */); - var lenDiff = colCount - rowCells.length; - for (var j = 0; j < lenDiff; j++) - rowCells.push(''); - - html += "\n"; - for (j = 0; j < colCount; j++) { - var colHtml = convertSpans(trim(rowCells[j]), self); - html += [" ", colHtml, "\n"].join(''); - } - html += "\n"; - } - - html += "\n"; - - // replace html with placeholder until postConversion step - return self.hashExtraBlock(html); - } - - return text; - }; - - - /****************************************************************** - * Footnotes * - *****************************************************************/ - - // Strip footnote, store in hashes. - Markdown.Extra.prototype.stripFootnoteDefinitions = function(text) { - var self = this; - - text = text.replace( - /\n[ ]{0,3}\[\^(.+?)\]\:[ \t]*\n?([\s\S]*?)\n{1,2}((?=\n[ ]{0,3}\S)|$)/g, - function(wholeMatch, m1, m2) { - m1 = slugify(m1); - m2 += "\n"; - m2 = m2.replace(/^[ ]{0,3}/g, ""); - self.footnotes[m1] = m2; - return "\n"; - }); - - return text; - }; - - - // Find and convert footnotes references. - Markdown.Extra.prototype.doFootnotes = function(text) { - var self = this; - if(self.isConvertingFootnote === true) { - return text; - } - - var footnoteCounter = 0; - text = text.replace(/\[\^(.+?)\]/g, function(wholeMatch, m1) { - var id = slugify(m1); - var footnote = self.footnotes[id]; - if (footnote === undefined) { - return wholeMatch; - } - footnoteCounter++; - self.usedFootnotes.push(id); - var html = '' + footnoteCounter - + ''; - return self.hashExtraInline(html); - }); - - return text; - }; - - // Print footnotes at the end of the document - Markdown.Extra.prototype.printFootnotes = function(text) { - var self = this; - - if (self.usedFootnotes.length === 0) { - return text; - } - - text += '\n\n
      \n
      \n
        \n\n'; - for(var i=0; i' - + formattedfootnote - + ' \n\n'; - } - text += '
      \n
      '; - return text; - }; - - - /****************************************************************** - * Fenced Code Blocks (gfm) * - ******************************************************************/ - - // Find and convert gfm-inspired fenced code blocks into html. - Markdown.Extra.prototype.fencedCodeBlocks = function(text) { - function encodeCode(code) { - code = code.replace(/&/g, "&"); - code = code.replace(//g, ">"); - // These were escaped by PageDown before postNormalization - code = code.replace(/~D/g, "$$"); - code = code.replace(/~T/g, "~"); - return code; - } - - var self = this; - text = text.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g, function(match, m1, m2) { - var language = m1, codeblock = m2; - - // adhere to specified options - var preclass = self.googleCodePrettify ? ' class="prettyprint"' : ''; - var codeclass = ''; - if (language) { - if (self.googleCodePrettify || self.highlightJs) { - // use html5 language- class names. supported by both prettify and highlight.js - codeclass = ' class="language-' + language + '"'; - } else { - codeclass = ' class="' + language + '"'; - } - } - - var html = ['', - encodeCode(codeblock), '
      '].join(''); - - // replace codeblock with placeholder until postConversion step - return self.hashExtraBlock(html); - }); - - return text; - }; - - - /****************************************************************** - * SmartyPants * - ******************************************************************/ - - var educatePants = function(wholeMatch,m1,m2,m3,m4,m5,m6) { - var blockText = m5; - var blockOffset = 0; - var newBlockText = ''; - blockText.replace(/(<)([a-zA-Z1-6]*)([^\n>]?)(>)(.*?)(<\/\2>)/mg, function(wholeMatch,m1,m2,m3,m4,m5,m6,offset) { - newBlockText += applyPants(blockText.substring(blockOffset, offset)) + educatePants(wholeMatch,m1,m2,m3,m4,m5,m6); - blockOffset = offset + wholeMatch.length; - }); - newBlockText += applyPants(blockText.substring(blockOffset)); - return m1 + m2 + m3 + m4 + newBlockText + m6; - }; - - function revertPants(wholeMatch, m1) { - var blockText = m1; - blockText = blockText.replace(/&\#8220;/g, "\""); - blockText = blockText.replace(/&\#8221;/g, "\""); - blockText = blockText.replace(/&\#8216;/g, "'"); - blockText = blockText.replace(/&\#8217;/g, "'"); - blockText = blockText.replace(/&\#8212;/g, "---"); - blockText = blockText.replace(/&\#8211;/g, "--"); - blockText = blockText.replace(/&\#8230;/g, "..."); - return blockText; - } - - function applyPants(text) { - text = text.replace(/``/g, "“").replace (/''/g, "”"); - text = text.replace(/---/g, "—").replace(/--/g, "–"); - text = text.replace(/\.\.\./g, "…").replace(/\.\s\.\s\./g, "…"); - - text = text.replace (/^'(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/g, "‘"); - text = text.replace (/^"(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/g, "“"); - text = text.replace(/^"(?=\w)/g, "“"); - text = text.replace(/^'(?=\w)/g, "‘"); - - text = text.replace(/"'(?=\w)/g, "“‘"); - text = text.replace(/'"(?=\w)/g, "‘“"); - - // Special case for decade abbreviations (the '80s): - text = text.replace(/'(?=\d{2}s)/g, "’"); - text = text.replace(/(>|\t|\n|\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)'(?=\w)/g, "$1‘"); - text = text.replace(/([^<>\\ \t\r\n\[\{\(\-])'(?=\s | s\b)/g, "$1’"); - - // Any remaining single quotes should be opening ones: - text = text.replace(/`/g, "‘").replace(/'/g, "’"); - text = text.replace(/(>|\t|\n|\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)"(?=\w)/g, "$1“"); - text = text.replace(/([^<>\\ \t\r\n\[\{\(\-])"(?=\s | s\b)/g, "$1”"); - - text = text.replace(/"/ig, "”"); - return text; - } - - // Find and convert markdown extra definition lists into html. - Markdown.Extra.prototype.runSmartyPants = function(text) { - text = text.replace(/(<)([a-zA-Z1-6]+)([^\n>]*?)(>)(.*?)(<\/\2>)/gm, educatePants); - //clean everything inside html tags - text = text.replace(/(<([a-zA-Z1-6]+)\b([^\n>]*?)(\/)?>)/g, revertPants); - //clean out replacements inside special tags - text = text.replace(/((<)(code|kbd|pre|script|noscript|iframe|math|ins|del|pre)(.?)(>)(.*?)(<\/)(code|kbd|pre|script|noscript|iframe|math|ins|del|pre)(>))/gm, revertPants); - return text; - }; - - /****************************************************************** - * Definition Lists * - ******************************************************************/ - - // Find and convert markdown extra definition lists into html. - Markdown.Extra.prototype.definitionLists = function(text) { - var wholeList = new RegExp( - ['(\\x02\\n?|\\n\\n)' , - '(?:' , - '(' , // $1 = whole list - '(' , // $2 - '[ ]{0,3}' , - '((?:[ \\t]*\\S.*\\n)+)', // $3 = defined term - '\\n?' , - '[ ]{0,3}:[ ]+' , // colon starting definition - ')' , - '([\\s\\S]+?)' , - '(' , // $4 - '(?=\\0x03)' , // \z - '|' , - '(?=' , - '\\n{2,}' , - '(?=\\S)' , - '(?!' , // Negative lookahead for another term - '[ ]{0,3}' , - '(?:\\S.*\\n)+?' , // defined term - '\\n?' , - '[ ]{0,3}:[ ]+' , // colon starting definition - ')' , - '(?!' , // Negative lookahead for another definition - '[ ]{0,3}:[ ]+' , // colon starting definition - ')' , - ')' , - ')' , - ')' , - ')' - ].join(''), - 'gm' - ); - - var self = this; - text = addAnchors(text); - - text = text.replace(wholeList, function(match, pre, list) { - var result = trim(self.processDefListItems(list)); - result = "
      \n" + result + "\n
      "; - return pre + self.hashExtraBlock(result) + "\n\n"; - }); - - return removeAnchors(text); - }; - - // Process the contents of a single definition list, splitting it - // into individual term and definition list items. - Markdown.Extra.prototype.processDefListItems = function(listStr) { - var self = this; - - var dt = new RegExp( - ['(\\x02\\n?|\\n\\n+)' , // leading line - '(' , // definition terms = $1 - '[ ]{0,3}' , // leading whitespace - '(?![:][ ]|[ ])' , // negative lookahead for a definition - // mark (colon) or more whitespace - '(?:\\S.*\\n)+?' , // actual term (not whitespace) - ')' , - '(?=\\n?[ ]{0,3}:[ ])' // lookahead for following line feed - ].join(''), // with a definition mark - 'gm' - ); - - var dd = new RegExp( - ['\\n(\\n+)?' , // leading line = $1 - '(' , // marker space = $2 - '[ ]{0,3}' , // whitespace before colon - '[:][ ]+' , // definition mark (colon) - ')' , - '([\\s\\S]+?)' , // definition text = $3 - '(?=\\n*' , // stop at next definition mark, - '(?:' , // next term or end of text - '\\n[ ]{0,3}[:][ ]|' , - '
      |\\x03' , // \z - ')' , - ')' - ].join(''), - 'gm' - ); - - listStr = addAnchors(listStr); - // trim trailing blank lines: - listStr = listStr.replace(/\n{2,}(?=\\x03)/, "\n"); - - // Process definition terms. - listStr = listStr.replace(dt, function(match, pre, termsStr) { - var terms = trim(termsStr).split("\n"); - var text = ''; - for (var i = 0; i < terms.length; i++) { - var term = terms[i]; - // process spans inside dt - term = convertSpans(trim(term), self); - text += "\n
      " + term + "
      "; - } - return text + "\n"; - }); - - // Process actual definitions. - listStr = listStr.replace(dd, function(match, leadingLine, markerSpace, def) { - if (leadingLine || def.match(/\n{2,}/)) { - // replace marker with the appropriate whitespace indentation - def = Array(markerSpace.length + 1).join(' ') + def; - // process markdown inside definition - // TODO?: currently doesn't apply extensions - def = outdent(def) + "\n\n"; - def = "\n" + convertAll(def, self) + "\n"; - } else { - // convert span-level markdown inside definition - def = rtrim(def); - def = convertSpans(outdent(def), self); - } - - return "\n
      " + def + "
      \n"; - }); - - return removeAnchors(listStr); - }; - -})(); - diff --git a/docs/js/bootstrap.min.js b/docs/js/bootstrap.min.js deleted file mode 100644 index e9efd24c10..0000000000 --- a/docs/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/** -* Bootstrap.js by @fat & @mdo -* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js -* Copyright 2012 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c);if(this.isShown||c.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in").attr("aria-hidden",!1),b.enforceFocus(),c?b.$element.one(a.support.transition.end,function(){b.$element.focus().trigger("shown")}):b.$element.focus().trigger("shown")})},hide:function(b){b&&b.preventDefault();var c=this;b=a.Event("hide"),this.$element.trigger(b);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,this.escape(),a(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),a.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var b=this;a(document).on("focusin.modal",function(a){b.$element[0]!==a.target&&!b.$element.has(a.target).length&&b.$element.focus()})},escape:function(){var a=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(b){b.which==27&&a.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),b.hideModal()},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),b.hideModal()})},hideModal:function(a){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('