diff --git a/.env b/.env index 88ba286..b8f3d06 100644 --- a/.env +++ b/.env @@ -28,7 +28,3 @@ DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" # DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4" # DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8" ###< doctrine/doctrine-bundle ### - -###> nelmio/cors-bundle ### -CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$' -###< nelmio/cors-bundle ### diff --git a/.env.dev b/.env.dev deleted file mode 100644 index f3f3304..0000000 --- a/.env.dev +++ /dev/null @@ -1,4 +0,0 @@ - -###> symfony/framework-bundle ### -APP_SECRET=11c8937d48993fb3aee1a476413161f5 -###< symfony/framework-bundle ### diff --git a/.env.test b/.env.test index 9e7162f..8c4453f 100644 --- a/.env.test +++ b/.env.test @@ -4,3 +4,4 @@ APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 PANTHER_APP_ENV=panther PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots +DATABASE_URL="sqlite:///%kernel.project_dir%/var/test-data.db" diff --git a/.forgejo/workflows/pull_request.yml b/.forgejo/workflows/pull_request.yml index a457e2a..4530c52 100644 --- a/.forgejo/workflows/pull_request.yml +++ b/.forgejo/workflows/pull_request.yml @@ -3,13 +3,13 @@ jobs: ls: runs-on: docker container: - image: git.php.fail/lubiana/container/php:8.4.8-ci + image: git.php.fail/lubiana/container/php:ci steps: - name: Manually checkout env: REPO: '${{ github.repository }}' TOKEN: '${{ secrets.GITHUB_TOKEN }}' - GIT_SERVER: 'git.hannover.ccc.de' + GIT_SERVER: 'hannover.ccc.de/gitlab' run: | git clone --branch $GITHUB_HEAD_REF https://${TOKEN}@${GIT_SERVER}/${REPO}.git . git fetch diff --git a/.forgejo/workflows/push.yml b/.forgejo/workflows/push.yml index 8f046fa..837b78f 100644 --- a/.forgejo/workflows/push.yml +++ b/.forgejo/workflows/push.yml @@ -6,14 +6,14 @@ jobs: ls: runs-on: docker container: - image: git.php.fail/lubiana/container/php:8.4.8-ci + image: git.php.fail/lubiana/container/php:ci steps: - name: Manually checkout env: REPO: '${{ github.repository }}' TOKEN: '${{ secrets.GITHUB_TOKEN }}' BRANCH: '${{ env.GITHUB_REF_NAME }}' - GIT_SERVER: 'git.hannover.ccc.de' + GIT_SERVER: 'hannover.ccc.de/gitlab' run: | git clone --branch $GITHUB_REF_NAME https://${TOKEN}@${GIT_SERVER}/${REPO}.git . git fetch diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml index f057351..9602add 100644 --- a/.forgejo/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -4,7 +4,7 @@ jobs: ls: runs-on: docker container: - image: git.php.fail/lubiana/container/php:8.4.8-ci + image: git.php.fail/lubiana/container/php:ci steps: - name: Manually checkout env: @@ -16,34 +16,5 @@ jobs: git clone --branch $GITHUB_REF_NAME https://${TOKEN}@${GIT_SERVER}/${REPO}.git . git fetch git checkout ${{ github.head_ref }} - - name: prepare deploy - run: sh ./deploy/prepare-deploy.sh - - name: deploy - env: - HOST: 'web.server.c3h' - USERNAME: 'c3h-futtern' - TARGETDIR: '/home/c3h-futtern/futtern' - HOMEDIR: '/home/c3h-futtern' - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - run: | - mkdir -p ~/.ssh/ - # Print the SSH key, replacing newline characters with actual new lines - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa - # Set appropriate permissions for the SSH key - chmod 600 ~/.ssh/id_rsa - # Add the remote host's key to the known_hosts file to avoid authenticity confirmation - ssh-keyscan -H $HOST >> ~/.ssh/known_hosts - # stop services - ssh ${USERNAME}@${HOST} systemctl --user stop pod-futtern - # backup database - ssh ${USERNAME}@${HOST} "cp ${HOMEDIR}/futtern/app/var/data.db ${HOMEDIR}/backup/data.db-$(date +\"%Y%m%d%H%M%S\")" - # only keep last 10 backupts - ssh ${USERNAME}@${HOST} "find ${HOMEDIR}/backup/ -type f | sort | head -n -10 | xargs rm -f" - # SCP files to the remote host - rsync -avz --delete deploy/ ${USERNAME}@${HOST}:${TARGETDIR} --exclude=var - # run update script - ssh ${USERNAME}@${HOST} /home/c3h-futtern/futtern/update.sh - - - - + - name: list + run: ls diff --git a/.gitignore b/.gitignore index a1a1f05..62752be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ + ###> symfony/framework-bundle ### /.env.local /.env.local.php @@ -7,27 +8,17 @@ /var/ /vendor/ ###< symfony/framework-bundle ### -.idea/ -/deploy/var/ -/deploy/app/ + +###> symfony/phpunit-bridge ### +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### ###> phpunit/phpunit ### +/phpunit.xml .phpunit.result.cache -.phpunit.cache ###< phpunit/phpunit ### -.DS_Store - -###> squizlabs/php_codesniffer ### -/.phpcs-cache -/phpcs.xml -###< squizlabs/php_codesniffer ### - -###> phpstan/phpstan ### -phpstan.neon -###< phpstan/phpstan ### - -###> symfony/asset-mapper ### -/public/assets/ -/assets/vendor/ -###< symfony/asset-mapper ### +.idea/ +/deploy/futtern-app/ +/deploy/var/ diff --git a/assets/app.js b/assets/app.js deleted file mode 100644 index 0194a77..0000000 --- a/assets/app.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Welcome to your app's main JavaScript file! - * - * This file will be included onto the page via the importmap() Twig function, - * which should already be in your base.html.twig. - */ -import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/app.css'; -import './styles/modes.css'; -import './styles/emoji-footprint.css'; - -// Import modules -import './javascript/theme.js'; -import './javascript/emoji-footprint.js'; -import './javascript/modes.js'; -import './javascript/htmx.js'; -import emojiButtonListener from './javascript/emoji-button.js'; -import 'bootstrap'; -import { initRadioState } from './javascript/radioState.js'; - -document.addEventListener('DOMContentLoaded', () => { - initRadioState(); - emojiButtonListener(); -}); \ No newline at end of file diff --git a/assets/javascript/emoji-button.js b/assets/javascript/emoji-button.js deleted file mode 100644 index 8fc3825..0000000 --- a/assets/javascript/emoji-button.js +++ /dev/null @@ -1,14 +0,0 @@ -const emojiButtonListener = function () { - const buttons = document.querySelectorAll('.emoji-buttons .btn.btn-primary'); - - buttons.forEach(button => { - button.addEventListener('click', function() { - const emojiField = document.querySelector('#food_vendor_emojis'); - if (emojiField) { - emojiField.value += this.textContent; - } - }); - }); -} - -export default emojiButtonListener; \ No newline at end of file diff --git a/assets/javascript/emoji-footprint.js b/assets/javascript/emoji-footprint.js deleted file mode 100644 index 238377b..0000000 --- a/assets/javascript/emoji-footprint.js +++ /dev/null @@ -1,19 +0,0 @@ -// Sparkle effect on mouse move -document.addEventListener('mousemove', function (e) { - const emojis = ['✨', '💖', '🌟', '💅', '🦄', '🎉', '🌈']; - const sparkle = document.createElement('div'); - sparkle.className = 'emoji-footprint'; - sparkle.textContent = emojis[Math.floor(Math.random() * emojis.length)]; - sparkle.style.left = e.pageX + 'px'; - sparkle.style.top = e.pageY + 'px'; - document.body.appendChild(sparkle); - - setTimeout(() => { - sparkle.remove(); - }, 1000); -}); - -export function initEmojiFootprint() { - // The sparkle effect is already initialized when this module is imported - // This function can be used if we need to control when the effect starts -} \ No newline at end of file diff --git a/assets/javascript/htmx.js b/assets/javascript/htmx.js deleted file mode 100644 index e4731a7..0000000 --- a/assets/javascript/htmx.js +++ /dev/null @@ -1,3 +0,0 @@ -import htmx from 'htmx.org'; - -window.htmx = htmx; \ No newline at end of file diff --git a/assets/javascript/modes.js b/assets/javascript/modes.js deleted file mode 100644 index a288f32..0000000 --- a/assets/javascript/modes.js +++ /dev/null @@ -1,136 +0,0 @@ -// Bonkers mode functionality -function setEmojiLevelClass(mode) { - document.body.classList.remove('emoji-normal', 'emoji-enhanced', 'emoji-bonkers'); - if (mode === 'bonkers') { - document.body.classList.add('emoji-bonkers'); - } else if (mode === 'enhanced') { - document.body.classList.add('emoji-enhanced'); - } else { - document.body.classList.add('emoji-normal'); - } -} - -function initBonkersMode() { - // Check if we're in bonkers mode - const currentMode = document.documentElement.getAttribute('data-website-mode'); - setEmojiLevelClass(currentMode); - - if (currentMode === 'bonkers') { - // Apply bonkers mode immediately - document.body.classList.add('bonkers-mode'); - - // Start the fabulous effects - createExtraSparkles(); - createSlayEffects(); - - console.log('🌈✨ Bonkers mode activated! ✨🌈'); - } else { - // Remove bonkers mode if it was active - document.body.classList.remove('bonkers-mode'); - } -} - -// Function to create extra sparkles during bonkers mode -function createExtraSparkles() { - const currentMode = document.documentElement.getAttribute('data-website-mode'); - if (currentMode !== 'bonkers') return; - - const extraEmojis = [ - '💃', '🕺', - '🍑', '💦', '😏', '😈', '👅', '💋', '🥵', '😳', '🤤', '😍', '🥴', - '💕', '💖', '💗', '💘', '💝', '💞', '💟', '💌', '💏', '💑', - '🍆', '🥒', '🍌', '💦', '👀', '😉', '😌', '😍', '🥰', '😘', - '😚', '😋', '😏', '😫', '😩', '🥺', '🥵', '🥴', - '💖', '💗', '💕', '💞', '💓', '💗', '💖', '💘', '💝', - '💋', '💏', '💑' - ]; - const sparkle = document.createElement('div'); - sparkle.className = 'emoji-footprint'; - sparkle.textContent = extraEmojis[Math.floor(Math.random() * extraEmojis.length)]; - sparkle.style.left = Math.random() * window.innerWidth + 'px'; - sparkle.style.top = Math.random() * window.innerHeight + 'px'; - document.body.appendChild(sparkle); - - setTimeout(() => { - if (sparkle.parentNode) { - sparkle.remove(); - } - }, 3000); - - // Continue creating extra sparkles while in bonkers mode - const newMode = document.documentElement.getAttribute('data-website-mode'); - if (newMode === 'bonkers') { - setTimeout(() => createExtraSparkles(), 150); - } -} - -// Function to create slay effects -function createSlayEffects() { - const currentMode = document.documentElement.getAttribute('data-website-mode'); - if (currentMode !== 'bonkers') return; - - // Create floating "SLAY" text effects - const slayWords = [ - 'SLAY', 'QUEEN', 'FABULOUS', 'ICONIC', 'LEGENDARY', 'STUNNING', 'GORGEOUS', 'FLAWLESS', - 'DAZZLING', 'RADIANT', 'BREATHTAKING', 'EXQUISITE', 'DIVINE' - ]; - const slayElement = document.createElement('div'); - slayElement.className = 'slay-text'; - slayElement.textContent = slayWords[Math.floor(Math.random() * slayWords.length)]; - slayElement.style.left = Math.random() * window.innerWidth + 'px'; - slayElement.style.top = Math.random() * window.innerHeight + 'px'; - document.body.appendChild(slayElement); - - setTimeout(() => { - if (slayElement.parentNode) { - slayElement.remove(); - } - }, 3000); - - // Continue creating slay effects while in bonkers mode - const newMode = document.documentElement.getAttribute('data-website-mode'); - if (newMode === 'bonkers') { - setTimeout(() => createSlayEffects(), 800); - } -} - -// Watch for mode changes -function watchModeChanges() { - // Create a MutationObserver to watch for changes to the data-website-mode attribute - const observer = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.type === 'attributes' && mutation.attributeName === 'data-website-mode') { - const newMode = document.documentElement.getAttribute('data-website-mode'); - - if (newMode === 'bonkers') { - document.body.classList.add('bonkers-mode'); - setEmojiLevelClass(newMode); - - // Start the fabulous effects - createExtraSparkles(); - createSlayEffects(); - - console.log('🌈✨ Switched to bonkers mode! ✨🌈'); - } else { - document.body.classList.remove('bonkers-mode'); - setEmojiLevelClass(newMode); - console.log(`😴 Switched to ${newMode} mode`); - } - } - }); - }); - - // Start observing - observer.observe(document.documentElement, { - attributes: true, - attributeFilter: ['data-website-mode'] - }); -} - -// Initialize when DOM is loaded -document.addEventListener('DOMContentLoaded', function() { - initBonkersMode(); - watchModeChanges(); -}); - -export { initBonkersMode, watchModeChanges }; diff --git a/assets/javascript/numberInputs.js b/assets/javascript/numberInputs.js deleted file mode 100644 index a4a8dc1..0000000 --- a/assets/javascript/numberInputs.js +++ /dev/null @@ -1,55 +0,0 @@ -// Function to initialize number input buttons -function initNumberInputs(container = document) { - container.querySelectorAll('.number-input-wrapper').forEach(function(wrapper) { - const input = wrapper.querySelector('input[type="number"]'); - const decreaseBtn = wrapper.querySelector('[data-action="decrease"]'); - const increaseBtn = wrapper.querySelector('[data-action="increase"]'); - - if (!input || !decreaseBtn || !increaseBtn) return; - - // Skip if already initialized - if (decreaseBtn.hasAttribute('data-initialized')) return; - - const step = parseFloat(input.getAttribute('step')) || 1; - const min = 0; - const max = input.getAttribute('max') ? parseFloat(input.getAttribute('max')) : null; - - decreaseBtn.addEventListener('click', function() { - const currentValue = parseFloat(input.value) || 0; - const newValue = currentValue - step; - - if (min === null || newValue >= min) { - input.value = newValue; - input.dispatchEvent(new Event('change', { bubbles: true })); - } - }); - - increaseBtn.addEventListener('click', function() { - const currentValue = parseFloat(input.value) || 0; - const newValue = currentValue + step; - - if (max === null || newValue <= max) { - input.value = newValue; - input.dispatchEvent(new Event('change', { bubbles: true })); - } - }); - - // Validate input on change - input.addEventListener('input', function() { - const value = parseFloat(this.value); - - if (min !== null && value < min) { - this.value = min; - } - if (max !== null && value > max) { - this.value = max; - } - }); - - // Mark as initialized - decreaseBtn.setAttribute('data-initialized', 'true'); - increaseBtn.setAttribute('data-initialized', 'true'); - }); -} - -export { initNumberInputs }; \ No newline at end of file diff --git a/assets/javascript/radioState.js b/assets/javascript/radioState.js deleted file mode 100644 index a30d311..0000000 --- a/assets/javascript/radioState.js +++ /dev/null @@ -1,35 +0,0 @@ -// Radio button state management with localStorage -function initRadioState() { - // Store and retrieve radio button state - const radioButtons = document.querySelectorAll('input[name="mode"]'); - - // Load saved state on page load - const savedMode = localStorage.getItem('selectedMode'); - if (savedMode) { - const radioToCheck = document.getElementById(savedMode); - if (radioToCheck) { - radioToCheck.checked = true; - // Set the data attribute to match the saved mode - document.documentElement.setAttribute('data-website-mode', savedMode); - } - } else { - // If no saved state, set to the currently checked radio button - const checkedRadio = document.querySelector('input[name="mode"]:checked'); - if (checkedRadio) { - document.documentElement.setAttribute('data-website-mode', checkedRadio.id); - } - } - - // Save state when radio button changes - radioButtons.forEach(radio => { - radio.addEventListener('change', function() { - if (this.checked) { - localStorage.setItem('selectedMode', this.id); - // Update the data attribute when mode changes - document.documentElement.setAttribute('data-website-mode', this.id); - } - }); - }); -} - -export { initRadioState }; \ No newline at end of file diff --git a/assets/javascript/theme.js b/assets/javascript/theme.js deleted file mode 100644 index 8acf738..0000000 --- a/assets/javascript/theme.js +++ /dev/null @@ -1,18 +0,0 @@ -// Theme detection and switching -const getPreferredTheme = () => { - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' -} - -const setTheme = theme => { - document.documentElement.setAttribute('data-bs-theme', theme) -} - -// Set initial theme -setTheme(getPreferredTheme()) - -// Listen for changes in user's preferred color scheme -window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { - setTheme(getPreferredTheme()) -}) - -export { getPreferredTheme, setTheme }; \ No newline at end of file diff --git a/assets/styles/app.css b/assets/styles/app.css deleted file mode 100644 index 7400735..0000000 --- a/assets/styles/app.css +++ /dev/null @@ -1,179 +0,0 @@ -/* - * ================================================================================================= - * 💖 BUBBLEGUM PUNK THEME (LIGHT) 💖 - * - * This isn't just a theme. It's a statement. - * Unapologetically loud, pink, and quirky. - * ================================================================================================= - */ - :root, - [data-bs-theme=light] { - /* --- CORE VIBE --- */ - --bs-pink: #FF007A; /* 💖 Hyper Pink (Our Queen) */ - --bs-green: #CFFF50; /* 🧪 Toxic Slime */ - --bs-purple: #A328D6; /* 👾 Graffiti Purple */ - --bs-yellow: #F9F871; /* ⚡ Neon Lemon */ - --bs-cyan: #00F5D4; /* 💎 Glitchy Teal */ - --bs-blue: #00A9E0; /* 💦 Splash Zone */ - - /* Let's redefine ALL the core colors to match the new energy */ - --bs-primary: var(--bs-pink); - --bs-secondary: var(--bs-green); - --bs-success: var(--bs-cyan); - --bs-info: var(--bs-blue); - --bs-warning: var(--bs-yellow); - --bs-danger: #FF3D3D; /* 🚨 Code Red Rave */ - - /* --- BACKGROUNDS & TEXT --- */ - /* No more boring white! */ - --bs-body-bg: #FFF5FD; /* A soft, dreamy pink canvas */ - --bs-body-color: #4A003D; /* Dark Plum (instead of black) for text */ - --bs-heading-color: var(--bs-purple); /* Make headings POP */ - --bs-secondary-color: rgba(74, 0, 61, 0.75); /* Plum, but softer */ - --bs-tertiary-color: rgba(74, 0, 61, 0.5); - - /* Make cards and containers pure white to contrast the pink background */ - --bs-tertiary-bg: #FFFFFF; - --bs-secondary-bg: #FEF9FE; - - /* --- LINKS & CODE --- */ - --bs-link-color: var(--bs-pink); - --bs-link-hover-color: var(--bs-purple); - --bs-code-color: var(--bs-purple); - - /* --- BORDERS & SHADOWS: LET'S GET QUIRKY --- */ - --bs-border-width: 2px; /* Chunky borders! */ - --bs-border-color: #FFD6F5; /* Pink-tinted border color */ - --bs-border-color-translucent: rgba(74, 0, 61, 0.2); - --bs-border-radius: 1rem; /* Super bubbly and round */ - --bs-border-radius-sm: 0.5rem; - --bs-border-radius-lg: 1.5rem; - --bs-border-radius-pill: 50rem; - - /* Say goodbye to black shadows, hello to colored glows! */ - --bs-box-shadow: 0 4px 12px rgba(255, 0, 122, 0.2); - --bs-box-shadow-sm: 0 2px 4px rgba(255, 0, 122, 0.15); - --bs-box-shadow-lg: 0 8px 30px rgba(255, 0, 122, 0.25); - --bs-box-shadow-inset: inset 0 1px 4px rgba(74, 0, 61, 0.2); - - /* --- THE GRADIENT: THE SOUL OF THE THEME --- */ - --bs-gradient: linear-gradient(75deg, var(--bs-primary), var(--bs-secondary)); - - /* --- Don't forget the RGB values for Bootstrap components! --- */ - --bs-primary-rgb: 255, 0, 122; - --bs-secondary-rgb: 207, 255, 80; - --bs-body-color-rgb: 74, 0, 61; - --bs-body-bg-rgb: 255, 245, 253; - } - - - /* - * ================================================================================================= - * 🌙🦇 CYBER GOTH THEME (DARK) 🦇🌙 - * - * The lights are out, the neon is ON. - * A dark, moody theme with vibrant, glowing accents. - * ================================================================================================= - */ - [data-bs-theme=dark] { - color-scheme: dark; - - /* --- BACKGROUNDS & TEXT --- */ - --bs-body-bg: #1D001A; /* Deep, dark space purple */ - --bs-body-color: #FFE9FA; /* Light pink text for high contrast */ - --bs-heading-color: var(--bs-cyan); /* Glowing cyan headings */ - - --bs-tertiary-bg: #2E0028; /* A slightly lighter container background */ - --bs-secondary-bg: #3A0033; - --bs-secondary-color: rgba(255, 233, 250, 0.75); - --bs-tertiary-color: rgba(255, 233, 250, 0.5); - - /* --- LINKS & CODE --- */ - /* Using the Toxic Slime for links gives it that cyber look */ - --bs-link-color: var(--bs-green); - --bs-link-hover-color: var(--bs-cyan); - --bs-code-color: var(--bs-pink); - - /* --- BORDERS & SHADOWS: NEON GLOWS --- */ - --bs-border-color: #5C004F; - --bs-border-color-translucent: rgba(255, 255, 255, 0.15); - - /* Redefine shadows to be neon glows */ - --bs-box-shadow: 0 0 15px rgba(var(--bs-primary-rgb), 0.4); - --bs-box-shadow-lg: 0 0 30px rgba(var(--bs-primary-rgb), 0.5); - - /* --- EMPHASIS & SUBTLE BACKGROUNDS --- */ - /* These are for alerts, badges, etc. They'll be dark with glowing text. */ - --bs-primary-text-emphasis: #FF8AD1; - --bs-secondary-text-emphasis: #E2FF8A; - --bs-success-text-emphasis: #8AFFEB; - --bs-info-text-emphasis: #7ADCF5; - --bs-warning-text-emphasis: #FAF8A8; - --bs-danger-text-emphasis: #FF8A8A; - - --bs-primary-bg-subtle: #3D002B; - --bs-secondary-bg-subtle: #415215; - --bs-success-bg-subtle: #00332B; - --bs-info-bg-subtle: #00313D; - --bs-warning-bg-subtle: #3E3D1C; - --bs-danger-bg-subtle: #520E0E; - } - -/* === EMOJI LEVELS === */ -.emoji-normal .emoji-normal { display: inline; } -.emoji-normal .emoji-enhanced, -.emoji-normal .emoji-bonkers { display: none; } - -.emoji-enhanced .emoji-enhanced { display: inline; } -.emoji-enhanced .emoji-normal, -.emoji-enhanced .emoji-bonkers { display: none; } - -.emoji-bonkers .emoji-bonkers { display: inline; } -.emoji-bonkers .emoji-normal, -.emoji-bonkers .emoji-enhanced { display: none; } - /* - * ================================================================================================= - * 🌈 RAINBOW PRIDE ELEMENTS 🌈 - * - * Fabulous rainbow-themed elements to celebrate diversity and pride! - * ================================================================================================= - */ - .bg-rainbow { - background: linear-gradient( - to right, - #FF5757, /* Red */ - #FFBD59, /* Orange */ - #F9F871, /* Yellow */ - #CFFF50, /* Green */ - #00F5D4, /* Teal */ - #00A9E0, /* Blue */ - #A328D6 /* Purple */ - ); - color: white; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); - font-weight: bold; - border: none; - } - - .fun-fact { - font-size: 1.1rem; - line-height: 1.6; - font-style: italic; - } - - /* Add a subtle rainbow border to the fun facts card */ - .card:has(.fun-fact) { - border-width: 2px; - border-style: solid; - border-image: linear-gradient( - to right, - #FF5757, /* Red */ - #FFBD59, /* Orange */ - #F9F871, /* Yellow */ - #CFFF50, /* Green */ - #00F5D4, /* Teal */ - #00A9E0, /* Blue */ - #A328D6 /* Purple */ - ) 1; - box-shadow: 0 4px 15px rgba(163, 40, 214, 0.2); - } diff --git a/assets/styles/emoji-footprint.css b/assets/styles/emoji-footprint.css deleted file mode 100644 index b076361..0000000 --- a/assets/styles/emoji-footprint.css +++ /dev/null @@ -1,30 +0,0 @@ - -/* Emoji Footprint Animation */ -.emoji-footprint { - position: absolute; - font-size: 1.6rem; - pointer-events: none; - animation: emojiFade 1s ease-out forwards; - transform: translate(-50%, -50%) scale(1); - opacity: 1; - z-index: 9999; - text-shadow: - 0 0 4px #ff00bf, - 0 0 8px #ff80df, - 0 0 12px #ffccff; -} - -@keyframes emojiFade { - 0% { - transform: translate(-50%, -50%) scale(1); - opacity: 1; - } - 50% { - transform: translate(-50%, -50%) scale(1.5); - opacity: 0.7; - } - 100% { - transform: translate(-50%, -50%) scale(2); - opacity: 0; - } -} \ No newline at end of file diff --git a/assets/styles/modes.css b/assets/styles/modes.css deleted file mode 100644 index 39dd41e..0000000 --- a/assets/styles/modes.css +++ /dev/null @@ -1,568 +0,0 @@ -/* 🌈✨ BONKERS MODE ANIMATIONS ✨🌈 */ -@keyframes rainbowGradient { - 0% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } - 100% { background-position: 0% 50%; } -} - -@keyframes discoFlash { - 0%, 100% { - background-color: var(--bs-pink); - box-shadow: 0 0 20px var(--bs-pink), 0 0 40px var(--bs-pink); - } - 16.66% { - background-color: var(--bs-purple); - box-shadow: 0 0 20px var(--bs-purple), 0 0 40px var(--bs-purple); - } - 33.33% { - background-color: var(--bs-cyan); - box-shadow: 0 0 20px var(--bs-cyan), 0 0 40px var(--bs-cyan); - } - 50% { - background-color: var(--bs-yellow); - box-shadow: 0 0 20px var(--bs-yellow), 0 0 40px var(--bs-yellow); - } - 66.66% { - background-color: var(--bs-green); - box-shadow: 0 0 20px var(--bs-green), 0 0 40px var(--bs-green); - } - 83.33% { - background-color: var(--bs-orange); - box-shadow: 0 0 20px var(--bs-orange), 0 0 40px var(--bs-orange); - } -} - -@keyframes wiggle { - 0%, 100% { transform: rotate(0deg); } - 25% { transform: rotate(-2deg); } - 75% { transform: rotate(2deg); } -} - -@keyframes pulse { - 0%, 100% { transform: scale(1); } - 50% { transform: scale(1.05); } -} - -@keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -@keyframes rainbowText { - 0% { color: var(--bs-red); } - 14.28% { color: var(--bs-orange); } - 28.57% { color: var(--bs-yellow); } - 42.85% { color: var(--bs-green); } - 57.14% { color: var(--bs-cyan); } - 71.42% { color: var(--bs-purple); } - 85.71% { color: var(--bs-pink); } - 100% { color: var(--bs-red); } -} - -@keyframes shine { - 0% { left: -100%; } - 50% { left: 100%; } - 100% { left: 100%; } -} - -@keyframes slayFloat { - 0% { - transform: translateY(0) scale(0.5); - opacity: 0; - } - 20% { - transform: translateY(-20px) scale(1); - opacity: 1; - } - 80% { - transform: translateY(-60px) scale(1.2); - opacity: 0.8; - } - 100% { - transform: translateY(-100px) scale(1.5); - opacity: 0; - } -} - -/* 🎭 BONKERS MODE CLASSES 🎭 */ -.bonkers-mode { - background: linear-gradient(270deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red), var(--bs-pink)); - background-size: 1600% 1600%; - animation: rainbowGradient 10s ease infinite; - transition: all 0.3s ease-in-out; -} - -.bonkers-mode .btn { - animation: discoFlash 0.3s infinite, wiggle 0.2s infinite; - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 400% 400%; - animation: discoFlash 0.3s infinite, wiggle 0.2s infinite, rainbowGradient 1s ease infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; - transition: all 0.2s ease; -} - -.bonkers-mode .btn:hover { - animation: discoFlash 0.2s infinite, wiggle 0.1s infinite, rainbowGradient 0.5s ease infinite; - box-shadow: 0 0 30px var(--bs-pink), 0 0 60px var(--bs-purple); -} - -.bonkers-mode .btn::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.5), transparent); - transform: rotate(45deg); - animation: spin 0.5s linear infinite; -} - -.bonkers-mode .navbar { - background: linear-gradient(90deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 200% 200%; - animation: rainbowGradient 2s ease infinite; - box-shadow: 0 0 50px rgba(255, 105, 180, 0.9); - height: auto !important; - min-height: 56px; -} - -.bonkers-mode .navbar-brand { - animation: rainbowText 0.8s infinite, wiggle 0.4s infinite; - font-size: 1.8em; - text-shadow: 3px 3px 6px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; -} - -.bonkers-mode .navbar-brand::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); - transform: rotate(45deg); - animation: spin 2s linear infinite; -} - -.bonkers-mode .navbar-nav .nav-link { - animation: rainbowText 1.2s infinite, wiggle 0.3s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid transparent; - border-radius: 8px; - padding: 8px 16px; - margin: 0 4px; - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -.bonkers-mode .navbar-nav .nav-link::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); - animation: shine 1.5s ease-in-out infinite; -} - -.bonkers-mode .navbar-nav .nav-link:hover { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - border-color: var(--bs-white); - box-shadow: 0 0 20px var(--bs-pink); - animation: discoFlash 0.5s infinite, wiggle 0.2s infinite; -} - -.bonkers-mode .navbar-nav .nav-link.active { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - border-color: var(--bs-white); - box-shadow: 0 0 25px var(--bs-yellow); - animation: discoFlash 0.8s infinite, wiggle 0.3s infinite; -} - -.bonkers-mode .navbar-text { - animation: rainbowText 1.5s infinite, wiggle 0.5s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid var(--bs-white); - border-radius: 8px; - padding: 6px 12px; - background: linear-gradient(45deg, var(--bs-cyan), var(--bs-blue)); - box-shadow: 0 0 15px var(--bs-cyan); -} - -.bonkers-mode .navbar-toggler { - border: 3px solid var(--bs-white); - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - animation: discoFlash 0.6s infinite, wiggle 0.4s infinite; - box-shadow: 0 0 20px var(--bs-pink); -} - -.bonkers-mode .navbar-toggler:focus { - box-shadow: 0 0 30px var(--bs-pink), 0 0 0 0.2rem rgba(255, 105, 180, 0.5); -} - -.bonkers-mode .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 1)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); - animation: spin 1s linear infinite; -} - -.bonkers-mode .dropdown-menu { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 3px solid var(--bs-white); - box-shadow: 0 0 30px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -.bonkers-mode .dropdown-item { - animation: rainbowText 1.8s infinite, wiggle 0.6s infinite; - font-weight: bold; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - border-bottom: 1px solid rgba(255,255,255,0.3); - transition: all 0.3s ease; -} - -.bonkers-mode .dropdown-item:hover { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - color: var(--bs-white); - box-shadow: 0 0 15px var(--bs-yellow); - animation: discoFlash 0.5s infinite, wiggle 0.3s infinite; -} - -.bonkers-mode .navbar-collapse { - background: linear-gradient(135deg, rgba(255,105,180,0.1), rgba(138,43,226,0.1)); - border-radius: 8px; - margin-top: 8px; - padding: 8px; - border: 2px solid var(--bs-pink); -} - -.bonkers-mode h1, .bonkers-mode h2, .bonkers-mode h3 { - animation: rainbowText 1.5s infinite; - text-shadow: 2px 2px 4px rgba(0,0,0,0.3); -} - -.bonkers-mode .table { - background: linear-gradient(135deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2), rgba(0,255,255,0.2)); - animation: rainbowGradient 3s ease infinite; - border: 3px solid var(--bs-pink); - box-shadow: 0 0 30px rgba(255,105,180,0.5); -} - -.bonkers-mode .table th { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - color: var(--bs-white); - animation: discoFlash 0.8s infinite; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - font-size: 1.1em; -} - -.bonkers-mode .form-control { - border: 3px solid var(--bs-pink); - box-shadow: 0 0 15px var(--bs-pink); - animation: pulse 0.6s infinite; -} - -.bonkers-mode .alert { - animation: discoFlash 0.6s infinite, wiggle 0.3s infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - font-size: 1.1em; -} - -.bonkers-mode .card { - background: linear-gradient(45deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2)); - border: 3px solid var(--bs-purple); - box-shadow: 0 0 35px rgba(138,43,226,0.6); - animation: pulse 1s infinite; -} - -.bonkers-mode .modal-content { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 4px solid var(--bs-white); - box-shadow: 0 0 50px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -.bonkers-mode .modal-header { - background: linear-gradient(90deg, var(--bs-yellow), var(--bs-orange)); - animation: discoFlash 0.8s infinite; - font-size: 1.2em; -} - -.bonkers-mode .number-input-wrapper { - animation: wiggle 0.4s infinite; -} - -.bonkers-mode .number-input-wrapper .btn { - animation: discoFlash 0.3s infinite, wiggle 0.2s infinite; -} - -/* Enhanced mode styles (for future use) */ -[data-website-mode="enhanced"] .btn { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 400% 400%; - animation: rainbowGradient 1s ease infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; - transition: all 0.2s ease; -} - -[data-website-mode="enhanced"] .btn:hover { - animation: rainbowGradient 0.5s ease infinite; - box-shadow: 0 0 30px var(--bs-pink), 0 0 60px var(--bs-purple); -} - -[data-website-mode="enhanced"] .btn::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.5), transparent); - transform: rotate(45deg); - animation: spin 0.5s linear infinite; -} - -[data-website-mode="enhanced"] .navbar { - background: linear-gradient(90deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow), var(--bs-green), var(--bs-orange), var(--bs-red)); - background-size: 200% 200%; - animation: rainbowGradient 2s ease infinite; - box-shadow: 0 0 50px rgba(255, 105, 180, 0.9); - height: auto !important; - min-height: 56px; -} - -[data-website-mode="enhanced"] .navbar-brand { - animation: rainbowText 0.8s infinite; - font-size: 1.8em; - text-shadow: 3px 3px 6px rgba(0,0,0,0.5); - position: relative; - overflow: hidden; -} - -[data-website-mode="enhanced"] .navbar-brand::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); - transform: rotate(45deg); - animation: spin 2s linear infinite; -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link { - animation: rainbowText 1.2s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid transparent; - border-radius: 8px; - padding: 8px 16px; - margin: 0 4px; - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); - animation: shine 1.5s ease-in-out infinite; -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link:hover { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - border-color: var(--bs-white); - box-shadow: 0 0 20px var(--bs-pink); -} - -[data-website-mode="enhanced"] .navbar-nav .nav-link.active { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - border-color: var(--bs-white); - box-shadow: 0 0 25px var(--bs-yellow); -} - -[data-website-mode="enhanced"] .navbar-text { - animation: rainbowText 1.5s infinite; - font-weight: bold; - text-shadow: 2px 2px 4px rgba(0,0,0,0.5); - border: 2px solid var(--bs-white); - border-radius: 8px; - padding: 6px 12px; - background: linear-gradient(45deg, var(--bs-cyan), var(--bs-blue)); - box-shadow: 0 0 15px var(--bs-cyan); -} - -[data-website-mode="enhanced"] .navbar-toggler { - border: 3px solid var(--bs-white); - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - animation: rainbowGradient 0.6s ease infinite; - box-shadow: 0 0 20px var(--bs-pink); -} - -[data-website-mode="enhanced"] .navbar-toggler:focus { - box-shadow: 0 0 30px var(--bs-pink), 0 0 0 0.2rem rgba(255, 105, 180, 0.5); -} - -[data-website-mode="enhanced"] .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 1)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); - animation: spin 1s linear infinite; -} - -[data-website-mode="enhanced"] .dropdown-menu { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 3px solid var(--bs-white); - box-shadow: 0 0 30px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -[data-website-mode="enhanced"] .dropdown-item { - animation: rainbowText 1.8s infinite; - font-weight: bold; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - border-bottom: 1px solid rgba(255,255,255,0.3); - transition: all 0.3s ease; -} - -[data-website-mode="enhanced"] .dropdown-item:hover { - background: linear-gradient(45deg, var(--bs-yellow), var(--bs-orange)); - color: var(--bs-white); - box-shadow: 0 0 15px var(--bs-yellow); -} - -[data-website-mode="enhanced"] .navbar-collapse { - background: linear-gradient(135deg, rgba(255,105,180,0.1), rgba(138,43,226,0.1)); - border-radius: 8px; - margin-top: 8px; - padding: 8px; - border: 2px solid var(--bs-pink); -} - -[data-website-mode="enhanced"] h1, [data-website-mode="enhanced"] h2, [data-website-mode="enhanced"] h3 { - animation: rainbowText 1.5s infinite; - text-shadow: 2px 2px 4px rgba(0,0,0,0.3); -} - -[data-website-mode="enhanced"] .table { - background: linear-gradient(135deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2), rgba(0,255,255,0.2)); - animation: rainbowGradient 3s ease infinite; - border: 3px solid var(--bs-pink); - box-shadow: 0 0 30px rgba(255,105,180,0.5); -} - -[data-website-mode="enhanced"] .table th { - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple)); - color: var(--bs-white); - animation: rainbowGradient 0.8s ease infinite; - text-shadow: 1px 1px 2px rgba(0,0,0,0.5); - font-size: 1.1em; -} - -[data-website-mode="enhanced"] .form-control { - border: 3px solid var(--bs-pink); - box-shadow: 0 0 15px var(--bs-pink); -} - -[data-website-mode="enhanced"] .alert { - animation: rainbowGradient 0.6s ease infinite; - border: 4px solid var(--bs-white); - font-weight: bold; - font-size: 1.1em; -} - -[data-website-mode="enhanced"] .card { - background: linear-gradient(45deg, rgba(255,105,180,0.2), rgba(138,43,226,0.2)); - border: 3px solid var(--bs-purple); - box-shadow: 0 0 35px rgba(138,43,226,0.6); -} - -[data-website-mode="enhanced"] .modal-content { - background: linear-gradient(135deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan)); - border: 4px solid var(--bs-white); - box-shadow: 0 0 50px rgba(255,105,180,0.8); - animation: rainbowGradient 2s ease infinite; -} - -[data-website-mode="enhanced"] .modal-header { - background: linear-gradient(90deg, var(--bs-yellow), var(--bs-orange)); - animation: rainbowGradient 0.8s ease infinite; - font-size: 1.2em; -} - -[data-website-mode="enhanced"] .number-input-wrapper { -} - -[data-website-mode="enhanced"] .number-input-wrapper .btn { - animation: rainbowGradient 0.3s ease infinite; -} - -/* Emoji Footprint Animation */ -.emoji-footprint { - position: absolute; - font-size: 1.6rem; - pointer-events: none; - animation: emojiFade 1s ease-out forwards; - transform: translate(-50%, -50%) scale(1); - opacity: 1; - z-index: 9999; - text-shadow: - 0 0 4px #ff00bf, - 0 0 8px #ff80df, - 0 0 12px #ffccff; -} - -@keyframes emojiFade { - 0% { - transform: translate(-50%, -50%) scale(1); - opacity: 1; - } - 50% { - transform: translate(-50%, -50%) scale(1.5); - opacity: 0.7; - } - 100% { - transform: translate(-50%, -50%) scale(2); - opacity: 0; - } -} - -/* 💅 SLAY TEXT EFFECTS 💅 */ -.slay-text { - position: fixed; - font-size: 2rem; - font-weight: bold; - pointer-events: none; - z-index: 10000; - animation: slayFloat 3s ease-out forwards; - text-shadow: - 0 0 10px #ff00bf, - 0 0 20px #ff80df, - 0 0 30px #ffccff, - 2px 2px 4px rgba(0,0,0,0.5); - background: linear-gradient(45deg, var(--bs-pink), var(--bs-purple), var(--bs-cyan), var(--bs-yellow)); - background-size: 400% 400%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - animation: slayFloat 3s ease-out forwards, rainbowGradient 1s ease infinite; -} diff --git a/bin/phpunit b/bin/phpunit new file mode 100755 index 0000000..692bacc --- /dev/null +++ b/bin/phpunit @@ -0,0 +1,23 @@ +#!/usr/bin/env php += 80000) { + require dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit'; + } else { + define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__).'/vendor/autoload.php'); + require PHPUNIT_COMPOSER_INSTALL; + PHPUnit\TextUI\Command::main(); + } +} else { + if (!is_file(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { + echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n"; + exit(1); + } + + require dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; +} diff --git a/composer.json b/composer.json index 0027ea5..9a7f726 100644 --- a/composer.json +++ b/composer.json @@ -4,65 +4,44 @@ "minimum-stability": "stable", "prefer-stable": true, "require": { - "php": ">=8.4", + "php": ">=8.3", "ext-ctype": "*", "ext-iconv": "*", - "api-platform/doctrine-orm": ">=4.1.18", - "api-platform/symfony": ">=4.1.18", - "doctrine/dbal": "^4.2.4", - "doctrine/doctrine-bundle": "^2.15.0", - "doctrine/doctrine-migrations-bundle": "^3.4.2", - "doctrine/orm": "^3.5.0", - "nelmio/cors-bundle": "^2.5", - "phpdocumentor/reflection-docblock": "^5.6.2", - "psr/clock": "^1.0", - "symfony/asset": "7.3.*", - "symfony/asset-mapper": "7.3.*", - "symfony/console": "7.3.*", - "symfony/dotenv": "7.3.*", - "symfony/expression-language": "7.3.*", - "symfony/flex": "^2.8.1", - "symfony/form": "7.3.*", - "symfony/framework-bundle": "7.3.*", - "symfony/monolog-bundle": "^3.10", - "symfony/property-access": "7.3.*", - "symfony/property-info": "7.3.*", - "symfony/runtime": "7.3.*", - "symfony/security-bundle": "7.3.*", - "symfony/security-csrf": "7.3.*", - "symfony/serializer": "7.3.*", - "symfony/twig-bundle": "7.3.*", - "symfony/uid": "7.3.*", - "symfony/validator": "7.3.*", - "symfony/yaml": "7.3.*", - "twig/extra-bundle": "^2.12|^3.21", - "twig/intl-extra": "^3.21", - "twig/twig": "^2.12|^3.21.1" + "doctrine/dbal": "^3", + "doctrine/doctrine-bundle": "^2.12", + "doctrine/doctrine-migrations-bundle": "^3.3", + "doctrine/orm": "^3.2", + "symfony/console": "7.1.*", + "symfony/dotenv": "7.1.*", + "symfony/flex": "^2", + "symfony/form": "7.1.*", + "symfony/framework-bundle": "7.1.*", + "symfony/runtime": "7.1.*", + "symfony/security-csrf": "7.1.*", + "symfony/twig-bundle": "7.1.*", + "symfony/uid": "7.1.*", + "symfony/validator": "7.1.*", + "symfony/yaml": "7.1.*" }, "require-dev": { - "doctrine/doctrine-fixtures-bundle": "^4.1", - "liip/test-fixtures-bundle": "^3.5", - "lubiana/code-quality": "1.7.3", - "pestphp/pest": "^3.8.2", - "symfony/browser-kit": "7.3.*", - "symfony/css-selector": "7.3.*", - "symfony/http-client": "7.3.*", - "symfony/maker-bundle": "^1.64", - "symfony/stopwatch": "7.3.*", - "symfony/web-profiler-bundle": "7.3.*", - "symplify/config-transformer": "^12.4.0" + "lubiana/code-quality": "^1.7", + "phpunit/phpunit": "^9.5", + "symfony/browser-kit": "7.1.*", + "symfony/css-selector": "7.1.*", + "symfony/maker-bundle": "^1.60", + "symfony/phpunit-bridge": "^7.1", + "symplify/config-transformer": "^12.3" }, "config": { "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true, - "pestphp/pest-plugin": true, "php-http/discovery": true, "symfony/flex": true, - "symfony/runtime": true + "symfony/runtime": true, + "dealerdirect/phpcodesniffer-composer-installer": true }, "sort-packages": true, "platform": { - "php": "8.4" + "php": "8.3" } }, "autoload": { @@ -83,28 +62,25 @@ "symfony/polyfill-php74": "*", "symfony/polyfill-php80": "*", "symfony/polyfill-php81": "*", - "symfony/polyfill-php82": "*", - "symfony/polyfill-php83": "*", - "symfony/polyfill-php84": "*" + "symfony/polyfill-php82": "*" }, "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd", - "importmap:install": "symfony-cmd" + "assets:install %PUBLIC_DIR%": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts", - "config-transformer config" + "config-transformer switch-format config" ], "lint": [ "rector", "ecs --fix || ecs --fix" ], - "test": "pest --parallel" + "test": "bin/phpunit" }, "conflict": { "symfony/symfony": "*" @@ -112,7 +88,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "7.3.*" + "require": "7.1.*" } } } diff --git a/composer.lock b/composer.lock index de85825..7e1d029 100644 --- a/composer.lock +++ b/composer.lock @@ -4,1099 +4,40 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ffd278c1c97f0775a1912c507f196d77", + "content-hash": "5aec19bda25c7cc358299be1a1d67cef", "packages": [ { - "name": "api-platform/doctrine-common", - "version": "v4.1.18", + "name": "doctrine/cache", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/api-platform/doctrine-common.git", - "reference": "3e1a2f3244ac5dba44a894bbb27d5c1705fccb0f" + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/doctrine-common/zipball/3e1a2f3244ac5dba44a894bbb27d5c1705fccb0f", - "reference": "3e1a2f3244ac5dba44a894bbb27d5c1705fccb0f", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", "shasum": "" }, "require": { - "api-platform/metadata": "^4.1.11", - "api-platform/state": "^4.1.11", - "doctrine/collections": "^2.1", - "doctrine/common": "^3.2.2", - "doctrine/persistence": "^3.2", - "php": ">=8.2" + "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/persistence": "<1.3" + "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "doctrine/mongodb-odm": "^2.10", - "doctrine/orm": "^2.17 || ^3.0", - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev" - }, - "suggest": { - "api-platform/graphql": "For GraphQl mercure subscriptions.", - "api-platform/http-cache": "For HTTP cache invalidation.", - "phpstan/phpdoc-parser": "For PHP documentation support.", - "symfony/config": "For XML resource configuration.", - "symfony/mercure-bundle": "For mercure updates publisher.", - "symfony/yaml": "For YAML resource configuration." - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\Doctrine\\Common\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "Common files used by api-platform/doctrine-orm and api-platform/doctrine-odm", - "homepage": "https://api-platform.com", - "keywords": [ - "doctrine", - "graphql", - "odm", - "orm", - "rest" - ], - "support": { - "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.18" - }, - "time": "2025-06-06T14:56:47+00:00" - }, - { - "name": "api-platform/doctrine-orm", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/doctrine-orm.git", - "reference": "61a199da6f6014dba2da43ea1a66b2c9dda27263" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/doctrine-orm/zipball/61a199da6f6014dba2da43ea1a66b2c9dda27263", - "reference": "61a199da6f6014dba2da43ea1a66b2c9dda27263", - "shasum": "" - }, - "require": { - "api-platform/doctrine-common": "^4.1.11", - "api-platform/metadata": "^4.1.11", - "api-platform/state": "^4.1.11", - "doctrine/orm": "^2.17 || ^3.0", - "php": ">=8.2", - "symfony/property-info": "^6.4 || ^7.1" - }, - "require-dev": { - "doctrine/doctrine-bundle": "^2.11", - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev", - "ramsey/uuid": "^4.7", - "ramsey/uuid-doctrine": "^2.0", - "symfony/cache": "^6.4 || ^7.0", - "symfony/framework-bundle": "^6.4 || ^7.0", - "symfony/property-access": "^6.4 || ^7.0", - "symfony/serializer": "^6.4 || ^7.0", - "symfony/uid": "^6.4 || ^7.0", - "symfony/validator": "^6.4 || ^7.0", - "symfony/yaml": "^6.4 || ^7.0" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\Doctrine\\Orm\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "Doctrine ORM bridge", - "homepage": "https://api-platform.com", - "keywords": [ - "api", - "doctrine", - "graphql", - "orm", - "rest" - ], - "support": { - "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.18" - }, - "time": "2025-06-06T14:56:47+00:00" - }, - { - "name": "api-platform/documentation", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/documentation.git", - "reference": "1a0ac988d659008ef8667d05bc9978863026bab8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/documentation/zipball/1a0ac988d659008ef8667d05bc9978863026bab8", - "reference": "1a0ac988d659008ef8667d05bc9978863026bab8", - "shasum": "" - }, - "require": { - "api-platform/metadata": "^4.1.11", - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "11.5.x-dev" - }, - "type": "project", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\Documentation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "API Platform documentation controller.", - "support": { - "source": "https://github.com/api-platform/documentation/tree/v4.1.18" - }, - "time": "2025-06-06T14:56:47+00:00" - }, - { - "name": "api-platform/http-cache", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/http-cache.git", - "reference": "f65f092c90311a87ebb6dda87db3ca08b57c10d6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/http-cache/zipball/f65f092c90311a87ebb6dda87db3ca08b57c10d6", - "reference": "f65f092c90311a87ebb6dda87db3ca08b57c10d6", - "shasum": "" - }, - "require": { - "api-platform/metadata": "^4.1.11", - "api-platform/state": "^4.1.11", - "php": ">=8.2", - "symfony/http-foundation": "^6.4 || ^7.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^6.0 || ^7.0", - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev", - "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/http-client": "^6.4 || ^7.0" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\HttpCache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/comunnity/contributors" - } - ], - "description": "API Platform HttpCache component", - "homepage": "https://api-platform.com", - "keywords": [ - "api", - "cache", - "http", - "rest" - ], - "support": { - "source": "https://github.com/api-platform/http-cache/tree/v4.1.18" - }, - "time": "2025-06-06T14:56:47+00:00" - }, - { - "name": "api-platform/hydra", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/hydra.git", - "reference": "8a521a1d4a7d377dd3a7cf6d51520a8e2762d9f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/hydra/zipball/8a521a1d4a7d377dd3a7cf6d51520a8e2762d9f0", - "reference": "8a521a1d4a7d377dd3a7cf6d51520a8e2762d9f0", - "shasum": "" - }, - "require": { - "api-platform/documentation": "^4.1.11", - "api-platform/json-schema": "^4.1.11", - "api-platform/jsonld": "^4.1.11", - "api-platform/metadata": "^4.1.11", - "api-platform/serializer": "^4.1.11", - "api-platform/state": "^4.1.11", - "php": ">=8.2", - "symfony/web-link": "^6.4 || ^7.1" - }, - "require-dev": { - "api-platform/doctrine-common": "^4.1", - "api-platform/doctrine-odm": "^4.1", - "api-platform/doctrine-orm": "^4.1", - "phpspec/prophecy": "^1.19", - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\Hydra\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "API Hydra support", - "homepage": "https://api-platform.com", - "keywords": [ - "Hydra", - "JSON-LD", - "api", - "graphql", - "jsonapi", - "rest" - ], - "support": { - "source": "https://github.com/api-platform/hydra/tree/v4.1.18" - }, - "time": "2025-06-06T14:56:47+00:00" - }, - { - "name": "api-platform/json-schema", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/json-schema.git", - "reference": "1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/json-schema/zipball/1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f", - "reference": "1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f", - "shasum": "" - }, - "require": { - "api-platform/metadata": "^4.1.11", - "php": ">=8.2", - "symfony/console": "^6.4 || ^7.0", - "symfony/property-info": "^6.4 || ^7.1", - "symfony/serializer": "^6.4 || ^7.0", - "symfony/uid": "^6.4 || ^7.0" - }, - "require-dev": { - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\JsonSchema\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "Generate a JSON Schema from a PHP class", - "homepage": "https://api-platform.com", - "keywords": [ - "JSON Schema", - "api", - "json", - "openapi", - "rest", - "swagger" - ], - "support": { - "source": "https://github.com/api-platform/json-schema/tree/v4.1.18" - }, - "time": "2025-06-29T12:24:14+00:00" - }, - { - "name": "api-platform/jsonld", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/jsonld.git", - "reference": "2693aa0cf388e519d1f3b1154df1f6ce2fdcc516" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/jsonld/zipball/2693aa0cf388e519d1f3b1154df1f6ce2fdcc516", - "reference": "2693aa0cf388e519d1f3b1154df1f6ce2fdcc516", - "shasum": "" - }, - "require": { - "api-platform/metadata": "^4.1.11", - "api-platform/serializer": "^4.1.11", - "api-platform/state": "^4.1.11", - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "11.5.x-dev" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "files": [ - "./HydraContext.php" - ], - "psr-4": { - "ApiPlatform\\JsonLd\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "API JSON-LD support", - "homepage": "https://api-platform.com", - "keywords": [ - "Hydra", - "JSON-LD", - "api", - "graphql", - "rest" - ], - "support": { - "source": "https://github.com/api-platform/jsonld/tree/v4.1.18" - }, - "time": "2025-07-01T12:31:29+00:00" - }, - { - "name": "api-platform/metadata", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/metadata.git", - "reference": "5df40a760eef56963c151181dc9498bbc260e7ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/metadata/zipball/5df40a760eef56963c151181dc9498bbc260e7ae", - "reference": "5df40a760eef56963c151181dc9498bbc260e7ae", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^2.0", - "php": ">=8.2", + "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", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/property-info": "^6.4 || ^7.1", - "symfony/string": "^6.4 || ^7.0", - "symfony/type-info": "^7.2" - }, - "require-dev": { - "api-platform/json-schema": "^4.1.11", - "api-platform/openapi": "^4.1.11", - "api-platform/state": "^4.1.11", - "phpspec/prophecy-phpunit": "^2.2", - "phpstan/phpdoc-parser": "^1.29 || ^2.0", - "phpunit/phpunit": "11.5.x-dev", - "symfony/config": "^6.4 || ^7.0", - "symfony/routing": "^6.4 || ^7.0", - "symfony/var-dumper": "^6.4 || ^7.0", - "symfony/web-link": "^6.4 || ^7.1", - "symfony/yaml": "^6.4 || ^7.0" - }, - "suggest": { - "phpstan/phpdoc-parser": "For PHP documentation support.", - "symfony/config": "For XML resource configuration.", - "symfony/yaml": "For YAML resource configuration." + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, "autoload": { "psr-4": { - "ApiPlatform\\Metadata\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "API Resource-oriented metadata attributes and factories", - "homepage": "https://api-platform.com", - "keywords": [ - "Hydra", - "JSON-LD", - "api", - "graphql", - "hal", - "jsonapi", - "openapi", - "rest", - "swagger" - ], - "support": { - "source": "https://github.com/api-platform/metadata/tree/v4.1.18" - }, - "time": "2025-07-03T13:06:55+00:00" - }, - { - "name": "api-platform/openapi", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/openapi.git", - "reference": "0153a8090c7726143ec0f14a7d859f45e608216a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/openapi/zipball/0153a8090c7726143ec0f14a7d859f45e608216a", - "reference": "0153a8090c7726143ec0f14a7d859f45e608216a", - "shasum": "" - }, - "require": { - "api-platform/json-schema": "^4.1.11", - "api-platform/metadata": "^4.1.11", - "api-platform/state": "^4.1.11", - "php": ">=8.2", - "symfony/console": "^6.4 || ^7.0", - "symfony/filesystem": "^6.4 || ^7.0", - "symfony/property-access": "^6.4 || ^7.0", - "symfony/serializer": "^6.4 || ^7.0" - }, - "require-dev": { - "api-platform/doctrine-common": "^4.1", - "api-platform/doctrine-odm": "^4.1", - "api-platform/doctrine-orm": "^4.1", - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\OpenApi\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "Models to build and serialize an OpenAPI specification.", - "homepage": "https://api-platform.com", - "keywords": [ - "Hydra", - "JSON-LD", - "api", - "graphql", - "hal", - "jsonapi", - "openapi", - "rest", - "swagger" - ], - "support": { - "source": "https://github.com/api-platform/openapi/tree/v4.1.18" - }, - "time": "2025-07-01T12:34:32+00:00" - }, - { - "name": "api-platform/serializer", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/serializer.git", - "reference": "6c08faff78730deaf6356412c6b79f0b06cc2bbd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/serializer/zipball/6c08faff78730deaf6356412c6b79f0b06cc2bbd", - "reference": "6c08faff78730deaf6356412c6b79f0b06cc2bbd", - "shasum": "" - }, - "require": { - "api-platform/metadata": "^4.1.11", - "api-platform/state": "^4.1.11", - "php": ">=8.2", - "symfony/property-access": "^6.4 || ^7.0", - "symfony/property-info": "^6.4 || ^7.1", - "symfony/serializer": "^6.4 || ^7.0", - "symfony/validator": "^6.4 || ^7.0" - }, - "require-dev": { - "api-platform/doctrine-common": "^4.1", - "api-platform/doctrine-odm": "^4.1", - "api-platform/doctrine-orm": "^4.1", - "api-platform/json-schema": "^4.1", - "api-platform/openapi": "^4.1", - "doctrine/collections": "^2.1", - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev", - "symfony/mercure-bundle": "*", - "symfony/var-dumper": "^6.4 || ^7.0", - "symfony/yaml": "^6.4 || ^7.0" - }, - "suggest": { - "api-platform/doctrine-odm": "To support Doctrine MongoDB ODM state options.", - "api-platform/doctrine-orm": "To support Doctrine ORM state options." - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\Serializer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "API Platform core Serializer", - "homepage": "https://api-platform.com", - "keywords": [ - "api", - "graphql", - "rest", - "serializer" - ], - "support": { - "source": "https://github.com/api-platform/serializer/tree/v4.1.18" - }, - "time": "2025-06-30T16:34:41+00:00" - }, - { - "name": "api-platform/state", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/state.git", - "reference": "8e6860ca1c581a36541538079c7c411bdcc09d32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/state/zipball/8e6860ca1c581a36541538079c7c411bdcc09d32", - "reference": "8e6860ca1c581a36541538079c7c411bdcc09d32", - "shasum": "" - }, - "require": { - "api-platform/metadata": "^4.1.18", - "php": ">=8.2", - "psr/container": "^1.0 || ^2.0", - "symfony/http-kernel": "^6.4 || ^7.0", - "symfony/serializer": "^6.4 || ^7.0", - "symfony/translation-contracts": "^3.0" - }, - "require-dev": { - "api-platform/validator": "^4.1", - "phpunit/phpunit": "11.5.x-dev", - "symfony/http-foundation": "^6.4 || ^7.0", - "symfony/web-link": "^6.4 || ^7.1", - "willdurand/negotiation": "^3.1" - }, - "suggest": { - "api-platform/serializer": "To use API Platform serializer.", - "api-platform/validator": "To use API Platform validation.", - "symfony/http-foundation": "To use our HTTP providers and processor.", - "symfony/web-link": "To support adding web links to the response headers.", - "willdurand/negotiation": "To use the API Platform content negoatiation provider." - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\State\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "API Platform State component ", - "homepage": "https://api-platform.com", - "keywords": [ - "Hydra", - "JSON-LD", - "api", - "graphql", - "hal", - "jsonapi", - "openapi", - "rest", - "swagger" - ], - "support": { - "source": "https://github.com/api-platform/state/tree/v4.1.18" - }, - "time": "2025-07-03T13:06:55+00:00" - }, - { - "name": "api-platform/symfony", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/symfony.git", - "reference": "ad786947491e00cf8efc10810c592e91eabc7e69" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/symfony/zipball/ad786947491e00cf8efc10810c592e91eabc7e69", - "reference": "ad786947491e00cf8efc10810c592e91eabc7e69", - "shasum": "" - }, - "require": { - "api-platform/documentation": "^4.1.11", - "api-platform/http-cache": "^4.1.11", - "api-platform/hydra": "^4.1.11", - "api-platform/json-schema": "^4.1.11", - "api-platform/jsonld": "^4.1.11", - "api-platform/metadata": "^4.1.11", - "api-platform/openapi": "^4.1.11", - "api-platform/serializer": "^4.1.11", - "api-platform/state": "^4.1.11", - "api-platform/validator": "^4.1.11", - "php": ">=8.2", - "symfony/property-access": "^6.4 || ^7.0", - "symfony/property-info": "^6.4 || ^7.1", - "symfony/security-core": "^6.4 || ^7.0", - "symfony/serializer": "^6.4 || ^7.0", - "willdurand/negotiation": "^3.1" - }, - "require-dev": { - "api-platform/doctrine-common": "^4.1", - "api-platform/doctrine-odm": "^4.1", - "api-platform/doctrine-orm": "^4.1", - "api-platform/elasticsearch": "^4.1", - "api-platform/graphql": "^4.1", - "api-platform/parameter-validator": "^3.1", - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev", - "symfony/expression-language": "^6.4 || ^7.0", - "symfony/mercure-bundle": "*", - "symfony/routing": "^6.4 || ^7.0", - "symfony/validator": "^6.4 || ^7.0", - "webonyx/graphql-php": "^15.0" - }, - "suggest": { - "api-platform/doctrine-odm": "To support MongoDB. Only versions 4.0 and later are supported.", - "api-platform/doctrine-orm": "To support Doctrine ORM.", - "api-platform/elasticsearch": "To support Elasticsearch.", - "api-platform/graphql": "To support GraphQL.", - "api-platform/ramsey-uuid": "To support Ramsey's UUID identifiers.", - "ocramius/package-versions": "To display the API Platform's version in the debug bar.", - "phpstan/phpdoc-parser": "To support extracting metadata from PHPDoc.", - "psr/cache-implementation": "To use metadata caching.", - "symfony/cache": "To have metadata caching when using Symfony integration.", - "symfony/config": "To load XML configuration files.", - "symfony/expression-language": "To use authorization and mercure advanced features.", - "symfony/http-client": "To use the HTTP cache invalidation system.", - "symfony/mercure-bundle": "To support mercure integration.", - "symfony/messenger": "To support messenger integration and asynchronous Mercure updates.", - "symfony/security": "To use authorization features.", - "symfony/twig-bundle": "To use the Swagger UI integration.", - "symfony/uid": "To support Symfony UUID/ULID identifiers.", - "symfony/web-profiler-bundle": "To use the data collector." - }, - "type": "symfony-bundle", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\Symfony\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - }, - { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" - } - ], - "description": "Symfony API Platform integration", - "homepage": "https://api-platform.com", - "keywords": [ - "Hydra", - "JSON-LD", - "api", - "graphql", - "hal", - "jsonapi", - "openapi", - "rest", - "swagger", - "symfony" - ], - "support": { - "source": "https://github.com/api-platform/symfony/tree/v4.1.18" - }, - "time": "2025-07-03T08:18:21+00:00" - }, - { - "name": "api-platform/validator", - "version": "v4.1.18", - "source": { - "type": "git", - "url": "https://github.com/api-platform/validator.git", - "reference": "269fea70ef84fb120cddba8027143d7bf43baba5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/api-platform/validator/zipball/269fea70ef84fb120cddba8027143d7bf43baba5", - "reference": "269fea70ef84fb120cddba8027143d7bf43baba5", - "shasum": "" - }, - "require": { - "api-platform/metadata": "^4.1.11", - "php": ">=8.2", - "symfony/type-info": "^7.2", - "symfony/web-link": "^6.4 || ^7.1" - }, - "require-dev": { - "phpspec/prophecy-phpunit": "^2.2", - "phpunit/phpunit": "11.5.x-dev", - "symfony/http-kernel": "^6.4 || ^7.0", - "symfony/serializer": "^6.4 || ^7.0", - "symfony/validator": "^6.4 || ^7.0" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/api-platform/api-platform", - "name": "api-platform/api-platform" - }, - "symfony": { - "require": "^6.4 || ^7.0" - }, - "branch-alias": { - "dev-3.4": "3.4.x-dev", - "dev-4.1": "4.1.x-dev", - "dev-main": "4.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ApiPlatform\\Validator\\": "" + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" } }, "notification-url": "https://packagist.org/downloads/", @@ -1105,134 +46,84 @@ ], "authors": [ { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "API Platform Community", - "homepage": "https://api-platform.com/community/contributors" + "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": "API Platform validator component", - "homepage": "https://api-platform.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": [ - "api", - "graphql", - "rest", - "validator" + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" ], "support": { - "source": "https://github.com/api-platform/validator/tree/v4.1.18" - }, - "time": "2025-07-03T13:06:55+00:00" - }, - { - "name": "composer/semver", - "version": "3.4.3", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/composer", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2022-05-20T20:07:39+00:00" }, { "name": "doctrine/collections", - "version": "2.3.0", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d" + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { "doctrine/deprecations": "^1", - "php": "^8.1", - "symfony/polyfill-php84": "^1.30" + "php": "^8.1" }, "require-dev": { "doctrine/coding-standard": "^12", "ext-json": "*", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" }, "type": "library", "autoload": { @@ -1276,7 +167,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.3.0" + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -1292,135 +183,51 @@ "type": "tidelift" } ], - "time": "2025-03-22T10:17:19+00:00" - }, - { - "name": "doctrine/common", - "version": "3.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/d9ea4a54ca2586db781f0265d36bea731ac66ec5", - "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0 || ^10.0", - "doctrine/collections": "^1", - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^6.1", - "vimeo/psalm": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } - }, - "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" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.5.0" - }, - "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%2Fcommon", - "type": "tidelift" - } - ], - "time": "2025-01-01T22:12:03+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { "name": "doctrine/dbal", - "version": "4.2.4", + "version": "3.8.5", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec" + "reference": "0e3536ba088a749985c8801105b6b3ac6c1280b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b37d160498ea91a2382a2ebe825c4ea6254fc0ec", - "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0e3536ba088a749985c8801105b6b3ac6c1280b6", + "reference": "0e3536ba088a749985c8801105b6b3ac6c1280b6", "shasum": "" }, "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3|^1", - "php": "^8.1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "13.0.0", + "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.17", - "phpstan/phpstan-phpunit": "2.0.6", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "10.5.46", - "slevomat/coding-standard": "8.16.2", - "squizlabs/php_codesniffer": "3.13.1", - "symfony/cache": "^6.3.8|^7.0", - "symfony/console": "^5.4|^6.3|^7.0" + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.11.1", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.19", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.9.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, + "bin": [ + "bin/doctrine-dbal" + ], "type": "library", "autoload": { "psr-4": { @@ -1473,7 +280,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.2.4" + "source": "https://github.com/doctrine/dbal/tree/3.8.5" }, "funding": [ { @@ -1489,34 +296,33 @@ "type": "tidelift" } ], - "time": "2025-06-15T23:15:01+00:00" + "time": "2024-06-08T17:49:56+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" - }, "require-dev": { - "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" + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1524,7 +330,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "src" + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" } }, "notification-url": "https://packagist.org/downloads/", @@ -1535,70 +341,68 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.15.0", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "d88294521a1bca943240adca65fa19ca8a7288c6" + "reference": "5418e811a14724068e95e0ba43353b903ada530f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/d88294521a1bca943240adca65fa19ca8a7288c6", - "reference": "d88294521a1bca943240adca65fa19ca8a7288c6", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5418e811a14724068e95e0ba43353b903ada530f", + "reference": "5418e811a14724068e95e0ba43353b903ada530f", "shasum": "" }, "require": { + "doctrine/cache": "^1.11 || ^2.0", "doctrine/dbal": "^3.7.0 || ^4.0", - "doctrine/persistence": "^3.1 || ^4", + "doctrine/persistence": "^2.2 || ^3", "doctrine/sql-formatter": "^1.0.1", - "php": "^8.1", - "symfony/cache": "^6.4 || ^7.0", - "symfony/config": "^6.4 || ^7.0", - "symfony/console": "^6.4 || ^7.0", - "symfony/dependency-injection": "^6.4 || ^7.0", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.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/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", - "symfony/framework-bundle": "^6.4 || ^7.0", - "symfony/service-contracts": "^2.5 || ^3" + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" }, "conflict": { "doctrine/annotations": ">=3.0", - "doctrine/cache": "< 1.11", "doctrine/orm": "<2.17 || >=4.0", - "symfony/var-exporter": "< 6.4.1 || 7.0.0", - "twig/twig": "<2.13 || >=3.0 <3.0.4" + "twig/twig": "<1.34 || >=2.0 <2.4" }, "require-dev": { "doctrine/annotations": "^1 || ^2", - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^13", + "doctrine/coding-standard": "^12", "doctrine/deprecations": "^1.0", - "doctrine/orm": "^2.17 || ^3.1", + "doctrine/orm": "^2.17 || ^3.0", "friendsofphp/proxy-manager-lts": "^1.0", - "phpstan/phpstan": "2.1.1", - "phpstan/phpstan-phpunit": "2.0.3", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^9.6.22", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^5", "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/doctrine-messenger": "^6.4 || ^7.0", - "symfony/messenger": "^6.4 || ^7.0", - "symfony/phpunit-bridge": "^7.2", - "symfony/property-info": "^6.4 || ^7.0", - "symfony/security-bundle": "^6.4 || ^7.0", - "symfony/stopwatch": "^6.4 || ^7.0", - "symfony/string": "^6.4 || ^7.0", - "symfony/twig-bridge": "^6.4 || ^7.0", - "symfony/validator": "^6.4 || ^7.0", - "symfony/var-exporter": "^6.4.1 || ^7.0.1", - "symfony/web-profiler-bundle": "^6.4 || ^7.0", - "symfony/yaml": "^6.4 || ^7.0", - "twig/twig": "^2.13 || ^3.0.4" + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^5.15" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -1643,7 +447,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.15.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.12.0" }, "funding": [ { @@ -1659,26 +463,26 @@ "type": "tidelift" } ], - "time": "2025-06-16T19:53:58+00:00" + "time": "2024-03-19T07:20:37+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.4.2", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9" + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "^2.4", "doctrine/migrations": "^3.2", - "php": "^7.2 || ^8.0", + "php": "^7.2|^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, @@ -1686,20 +490,27 @@ "composer/semver": "^3.0", "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", - "phpstan/phpstan": "^1.4 || ^2", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpstan/phpstan-phpunit": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1.1 || ^2", - "phpstan/phpstan-symfony": "^1.3 || ^2", - "phpunit/phpunit": "^8.5 || ^9.5", + "doctrine/persistence": "^2.0 || ^3 ", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.5|^9.5", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^3 || ^5", "symfony/phpunit-bridge": "^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6 || ^7" + "symfony/var-exporter": "^5.4 || ^6 || ^7", + "vimeo/psalm": "^4.30 || ^5.15" }, "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "src" - } + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1728,7 +539,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" }, "funding": [ { @@ -1744,7 +555,7 @@ "type": "tidelift" } ], - "time": "2025-03-11T17:36:26+00:00" + "time": "2024-05-14T20:32:18+00:00" }, { "name": "doctrine/event-manager", @@ -2077,21 +888,21 @@ }, { "name": "doctrine/migrations", - "version": "3.9.1", + "version": "3.7.4", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999" + "reference": "954e0a314c2f0eb9fb418210445111747de254a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/0f1e0c960ac29866d648a4f50142a74fe1cb6999", - "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/954e0a314c2f0eb9fb418210445111747de254a6", + "reference": "954e0a314c2f0eb9fb418210445111747de254a6", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/dbal": "^3.6 || ^4", + "doctrine/dbal": "^3.5.1 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2.0", "php": "^8.1", @@ -2106,10 +917,9 @@ "require-dev": { "doctrine/coding-standard": "^12", "doctrine/orm": "^2.13 || ^3", - "doctrine/persistence": "^2 || ^3 || ^4", + "doctrine/persistence": "^2 || ^3", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", - "fig/log-test": "^1", "phpstan/phpstan": "^1.10", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", @@ -2130,7 +940,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Migrations\\": "src" + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" } }, "notification-url": "https://packagist.org/downloads/", @@ -2160,7 +970,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.1" + "source": "https://github.com/doctrine/migrations/tree/3.7.4" }, "funding": [ { @@ -2176,20 +986,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T07:19:23+00:00" + "time": "2024-03-06T13:41:11+00:00" }, { "name": "doctrine/orm", - "version": "3.5.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "6deec3655ba3e8f15280aac11e264225854d2369" + "reference": "37946d3a21ddf837c0d84f8156ee60a92102e332" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/6deec3655ba3e8f15280aac11e264225854d2369", - "reference": "6deec3655ba3e8f15280aac11e264225854d2369", + "url": "https://api.github.com/repos/doctrine/orm/zipball/37946d3a21ddf837c0d84f8156ee60a92102e332", + "reference": "37946d3a21ddf837c0d84f8156ee60a92102e332", "shasum": "" }, "require": { @@ -2201,7 +1011,7 @@ "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3 || ^2", "doctrine/lexer": "^3", - "doctrine/persistence": "^3.3.1 || ^4", + "doctrine/persistence": "^3.3.1", "ext-ctype": "*", "php": "^8.1", "psr/cache": "^1 || ^2 || ^3", @@ -2209,16 +1019,14 @@ "symfony/var-exporter": "^6.3.9 || ^7.0" }, "require-dev": { - "doctrine/coding-standard": "^13.0", + "doctrine/coding-standard": "^12.0", "phpbench/phpbench": "^1.0", - "phpdocumentor/guides-cli": "^1.4", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "2.0.3", - "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan": "1.11.1", "phpunit/phpunit": "^10.4.0", "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.12.0", - "symfony/cache": "^5.4 || ^6.2 || ^7.0" + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^5.4 || ^6.2 || ^7.0", + "vimeo/psalm": "5.24.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", @@ -2264,22 +1072,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.5.0" + "source": "https://github.com/doctrine/orm/tree/3.2.0" }, - "time": "2025-07-01T17:40:53+00:00" + "time": "2024-05-23T14:27:52+00:00" }, { "name": "doctrine/persistence", - "version": "3.4.0", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff" + "reference": "477da35bd0255e032826f440b94b3e37f2d56f42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/0ea965320cec355dba75031c1b23d4c78362e3ff", - "reference": "0ea965320cec355dba75031c1b23d4c78362e3ff", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/477da35bd0255e032826f440b94b3e37f2d56f42", + "reference": "477da35bd0255e032826f440b94b3e37f2d56f42", "shasum": "" }, "require": { @@ -2291,13 +1099,15 @@ "doctrine/common": "<2.10" }, "require-dev": { - "doctrine/coding-standard": "^12", + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^11", "doctrine/common": "^3.0", - "phpstan/phpstan": "1.12.7", + "phpstan/phpstan": "1.9.4", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5.38 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.3.0" }, "type": "library", "autoload": { @@ -2346,7 +1156,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.4.0" + "source": "https://github.com/doctrine/persistence/tree/3.3.2" }, "funding": [ { @@ -2362,20 +1172,20 @@ "type": "tidelift" } ], - "time": "2024-10-30T19:48:12+00:00" + "time": "2024-03-12T14:54:36+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.2", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" + "reference": "d1ac84aef745c69ea034929eb6d65a6908b675cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d1ac84aef745c69ea034929eb6d65a6908b675cc", + "reference": "d1ac84aef745c69ea034929eb6d65a6908b675cc", "shasum": "" }, "require": { @@ -2383,9 +1193,9 @@ }, "require-dev": { "doctrine/coding-standard": "^12", - "ergebnis/phpunit-slow-test-detector": "^2.14", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" }, "bin": [ "bin/sql-formatter" @@ -2415,396 +1225,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" + "source": "https://github.com/doctrine/sql-formatter/tree/1.4.0" }, - "time": "2025-01-24T11:45:48+00:00" - }, - { - "name": "monolog/monolog", - "version": "3.9.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "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", - "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" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.9.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2025-03-24T10:02:05+00:00" - }, - { - "name": "nelmio/cors-bundle", - "version": "2.5.0", - "source": { - "type": "git", - "url": "https://github.com/nelmio/NelmioCorsBundle.git", - "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/3a526fe025cd20e04a6a11370cf5ab28dbb5a544", - "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544", - "shasum": "" - }, - "require": { - "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "mockery/mockery": "^1.3.6", - "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Nelmio\\CorsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nelmio", - "homepage": "http://nelm.io" - }, - { - "name": "Symfony Community", - "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" - } - ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", - "keywords": [ - "api", - "cors", - "crossdomain" - ], - "support": { - "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.5.0" - }, - "time": "2024-06-24T21:25:28+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.6.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.1", - "ext-filter": "*", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.5 || ~1.6.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" - }, - "time": "2025-04-13T19:20:35+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" - }, - "time": "2024-11-09T15:12:26+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^5.3.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" - }, - "time": "2025-02-19T13:28:12+00:00" + "time": "2024-05-08T08:12:09+00:00" }, { "name": "psr/cache", @@ -2855,54 +1278,6 @@ }, "time": "2021-02-03T23:26:27+00:00" }, - { - "name": "psr/clock", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" - }, - "time": "2022-11-25T14:36:26+00:00" - }, { "name": "psr/container", "version": "2.0.2", @@ -3006,74 +1381,18 @@ }, "time": "2019-01-08T18:20:26+00:00" }, - { - "name": "psr/link", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/link.git", - "reference": "84b159194ecfd7eaa472280213976e96415433f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/link/zipball/84b159194ecfd7eaa472280213976e96415433f7", - "reference": "84b159194ecfd7eaa472280213976e96415433f7", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "suggest": { - "fig/link-util": "Provides some useful PSR-13 utilities" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Link\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for HTTP links", - "homepage": "https://github.com/php-fig/link", - "keywords": [ - "http", - "http-link", - "link", - "psr", - "psr-13", - "rest" - ], - "support": { - "source": "https://github.com/php-fig/link/tree/2.0.1" - }, - "time": "2021-03-11T23:00:27+00:00" - }, { "name": "psr/log", - "version": "3.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { @@ -3108,178 +1427,29 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2024-09-11T13:17:53+00:00" - }, - { - "name": "symfony/asset", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/asset.git", - "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", - "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "conflict": { - "symfony/http-foundation": "<6.4" - }, - "require-dev": { - "symfony/http-client": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Asset\\": "" - }, - "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": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/asset/tree/v7.3.0" - }, - "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": "2025-03-05T10:15:41+00:00" - }, - { - "name": "symfony/asset-mapper", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/asset-mapper.git", - "reference": "6516f38868b75c4902ea72a9fa44967628375ae7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/6516f38868b75c4902ea72a9fa44967628375ae7", - "reference": "6516f38868b75c4902ea72a9fa44967628375ae7", - "shasum": "" - }, - "require": { - "composer/semver": "^3.0", - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^7.1", - "symfony/http-client": "^6.4|^7.0" - }, - "conflict": { - "symfony/framework-bundle": "<6.4" - }, - "require-dev": { - "symfony/asset": "^6.4|^7.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/event-dispatcher-contracts": "^3.0", - "symfony/finder": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\AssetMapper\\": "" - }, - "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": "Maps directories of assets & makes them available in a public directory with versioned filenames.", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/asset-mapper/tree/v7.3.0" - }, - "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": "2025-05-24T14:05:12+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "symfony/cache", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e" + "reference": "760294dc7158372699dccd077965c16c328f8719" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e", - "reference": "a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e", + "url": "https://api.github.com/repos/symfony/cache/zipball/760294dc7158372699dccd077965c16c328f8719", + "reference": "760294dc7158372699dccd077965c16c328f8719", "shasum": "" }, "require": { "php": ">=8.2", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^3.6", + "symfony/cache-contracts": "^2.5|^3", "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/service-contracts": "^2.5|^3", "symfony/var-exporter": "^6.4|^7.0" @@ -3300,7 +1470,6 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/clock": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", @@ -3341,7 +1510,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.3.1" + "source": "https://github.com/symfony/cache/tree/v7.1.1" }, "funding": [ { @@ -3357,20 +1526,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.6.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", - "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", "shasum": "" }, "require": { @@ -3379,12 +1548,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -3417,7 +1586,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" }, "funding": [ { @@ -3433,94 +1602,20 @@ "type": "tidelift" } ], - "time": "2025-03-13T15:25:07+00:00" - }, - { - "name": "symfony/clock", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/now.php" - ], - "psr-4": { - "Symfony\\Component\\Clock\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Decouples applications from the system clock", - "homepage": "https://symfony.com", - "keywords": [ - "clock", - "psr20", - "time" - ], - "support": { - "source": "https://github.com/symfony/clock/tree/v7.3.0" - }, - "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": "2024-09-25T14:21:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/config", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "ba62ae565f1327c2f6366726312ed828c85853bc" + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ba62ae565f1327c2f6366726312ed828c85853bc", - "reference": "ba62ae565f1327c2f6366726312ed828c85853bc", + "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", "shasum": "" }, "require": { @@ -3566,7 +1661,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.3.0" + "source": "https://github.com/symfony/config/tree/v7.1.1" }, "funding": [ { @@ -3582,28 +1677,27 @@ "type": "tidelift" } ], - "time": "2025-05-15T09:04:05+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/console", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101" + "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101", - "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101", + "url": "https://api.github.com/repos/symfony/console/zipball/9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", + "reference": "9b008f2d7b21c74ef4d0c3de6077a642bc55ece3", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2" + "symfony/string": "^6.4|^7.0" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -3660,7 +1754,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.1" + "source": "https://github.com/symfony/console/tree/v7.1.1" }, "funding": [ { @@ -3676,20 +1770,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8" + "reference": "77c636dfd86c0b60c5d184b2fd2ddf8dd11c309c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8656c4848b48784c4bb8c4ae50d2b43f832cead8", - "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/77c636dfd86c0b60c5d184b2fd2ddf8dd11c309c", + "reference": "77c636dfd86c0b60c5d184b2fd2ddf8dd11c309c", "shasum": "" }, "require": { @@ -3697,7 +1791,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4.20|^7.2.5" + "symfony/var-exporter": "^6.4|^7.0" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -3740,7 +1834,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.3.1" + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.1" }, "funding": [ { @@ -3756,20 +1850,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -3777,12 +1871,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -3807,7 +1901,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.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -3823,25 +1917,25 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "6c0acb248c46452ae2c15752dc71e72f3335403f" + "reference": "2c36eca96f111ada35b648a4d6e8aa61f354e4d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/6c0acb248c46452ae2c15752dc71e72f3335403f", - "reference": "6c0acb248c46452ae2c15752dc71e72f3335403f", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/2c36eca96f111ada35b648a4d6e8aa61f354e4d4", + "reference": "2c36eca96f111ada35b648a4d6e8aa61f354e4d4", "shasum": "" }, "require": { "doctrine/event-manager": "^2", - "doctrine/persistence": "^3.1|^4", + "doctrine/persistence": "^3.1", "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", @@ -3849,7 +1943,6 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "doctrine/collections": "<1.8", "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.15", @@ -3866,8 +1959,8 @@ "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/collections": "^1.8|^2.0", - "doctrine/data-fixtures": "^1.1|^2", + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^3.6|^4", "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", @@ -3916,7 +2009,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.1" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.1" }, "funding": [ { @@ -3932,20 +2025,20 @@ "type": "tidelift" } ], - "time": "2025-06-26T13:02:59+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/dotenv", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "28347a897771d0c28e99b75166dd2689099f3045" + "reference": "efa715ec40c098f2fba62444f4fd75d0d4248ede" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/28347a897771d0c28e99b75166dd2689099f3045", - "reference": "28347a897771d0c28e99b75166dd2689099f3045", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/efa715ec40c098f2fba62444f4fd75d0d4248ede", + "reference": "efa715ec40c098f2fba62444f4fd75d0d4248ede", "shasum": "" }, "require": { @@ -3990,7 +2083,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.3.0" + "source": "https://github.com/symfony/dotenv/tree/v7.1.1" }, "funding": [ { @@ -4006,20 +2099,20 @@ "type": "tidelift" } ], - "time": "2024-11-27T11:18:42+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/error-handler", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235" + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/35b55b166f6752d6aaf21aa042fc5ed280fce235", - "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", "shasum": "" }, "require": { @@ -4032,11 +2125,9 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/webpack-encore-bundle": "^1.0|^2.0" + "symfony/serializer": "^6.4|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -4067,7 +2158,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/v7.3.1" + "source": "https://github.com/symfony/error-handler/tree/v7.1.1" }, "funding": [ { @@ -4083,20 +2174,20 @@ "type": "tidelift" } ], - "time": "2025-06-13T07:48:40+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", "shasum": "" }, "require": { @@ -4147,7 +2238,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/v7.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" }, "funding": [ { @@ -4163,20 +2254,20 @@ "type": "tidelift" } ], - "time": "2025-04-22T09:11:45+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -4185,12 +2276,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4223,7 +2314,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -4239,84 +2330,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" - }, - { - "name": "symfony/expression-language", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/expression-language.git", - "reference": "26f4884a455e755e630a5fc372df124a3578da2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/26f4884a455e755e630a5fc372df124a3578da2e", - "reference": "26f4884a455e755e630a5fc372df124a3578da2e", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/cache": "^6.4|^7.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ExpressionLanguage\\": "" - }, - "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 an engine that can compile and evaluate expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.3.0" - }, - "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": "2024-10-15T11:52:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/filesystem", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/802e87002f919296c9f606457d9fa327a0b3d6b2", + "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2", "shasum": "" }, "require": { @@ -4353,7 +2380,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.0" + "source": "https://github.com/symfony/filesystem/tree/v7.1.1" }, "funding": [ { @@ -4369,20 +2396,20 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/finder", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", + "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", "shasum": "" }, "require": { @@ -4417,7 +2444,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.0" + "source": "https://github.com/symfony/finder/tree/v7.1.1" }, "funding": [ { @@ -4433,29 +2460,26 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:26+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/flex", - "version": "v2.8.1", + "version": "v2.4.5", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "423c36e369361003dc31ef11c5f15fb589e52c01" + "reference": "b0a405f40614c9f584b489d54f91091817b0e26e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/423c36e369361003dc31ef11c5f15fb589e52c01", - "reference": "423c36e369361003dc31ef11c5f15fb589e52c01", + "url": "https://api.github.com/repos/symfony/flex/zipball/b0a405f40614c9f584b489d54f91091817b0e26e", + "reference": "b0a405f40614c9f584b489d54f91091817b0e26e", "shasum": "" }, "require": { "composer-plugin-api": "^2.1", "php": ">=8.0" }, - "conflict": { - "composer/semver": "<1.7.2" - }, "require-dev": { "composer/composer": "^2.1", "symfony/dotenv": "^5.4|^6.0", @@ -4485,7 +2509,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.8.1" + "source": "https://github.com/symfony/flex/tree/v2.4.5" }, "funding": [ { @@ -4501,27 +2525,27 @@ "type": "tidelift" } ], - "time": "2025-07-05T07:45:19+00:00" + "time": "2024-03-02T08:16:47+00:00" }, { "name": "symfony/form", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "e06b02dd21b33b0cd7bb942c7e446ef7b22a2a5a" + "reference": "b23a44f0edaceb8d70b0e7f8937feae81e6dede5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/e06b02dd21b33b0cd7bb942c7e446ef7b22a2a5a", - "reference": "e06b02dd21b33b0cd7bb942c7e446ef7b22a2a5a", + "url": "https://api.github.com/repos/symfony/form/zipball/b23a44f0edaceb8d70b0e7f8937feae81e6dede5", + "reference": "b23a44f0edaceb8d70b0e7f8937feae81e6dede5", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/options-resolver": "^7.3", + "symfony/options-resolver": "^6.4|^7.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", @@ -4582,7 +2606,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.3.1" + "source": "https://github.com/symfony/form/tree/v7.1.1" }, "funding": [ { @@ -4598,20 +2622,20 @@ "type": "tidelift" } ], - "time": "2025-06-13T07:48:40+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "91905f22f26aa350a33b3b9690bdf94976b0d0ab" + "reference": "79a20497022b8853416e20c836ee150b754c332a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/91905f22f26aa350a33b3b9690bdf94976b0d0ab", - "reference": "91905f22f26aa350a33b3b9690bdf94976b0d0ab", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/79a20497022b8853416e20c836ee150b754c332a", + "reference": "79a20497022b8853416e20c836ee150b754c332a", "shasum": "" }, "require": { @@ -4619,15 +2643,15 @@ "ext-xml": "*", "php": ">=8.2", "symfony/cache": "^6.4|^7.0", - "symfony/config": "^7.3", - "symfony/dependency-injection": "^7.2", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^7.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^7.3", + "symfony/error-handler": "^6.4|^7.0", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/filesystem": "^7.1", "symfony/finder": "^6.4|^7.0", - "symfony/http-foundation": "^7.3", - "symfony/http-kernel": "^7.2", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^6.4|^7.0" }, @@ -4643,27 +2667,23 @@ "symfony/dotenv": "<6.4", "symfony/form": "<6.4", "symfony/http-client": "<6.4", - "symfony/json-streamer": ">=7.4", "symfony/lock": "<6.4", "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", "symfony/mime": "<6.4", - "symfony/object-mapper": ">=7.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", - "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-core": "<6.4", - "symfony/security-csrf": "<7.2", - "symfony/serializer": "<7.2.5", + "symfony/security-csrf": "<6.4", + "symfony/serializer": "<6.4", "symfony/stopwatch": "<6.4", - "symfony/translation": "<7.3", + "symfony/translation": "<6.4", "symfony/twig-bridge": "<6.4", "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", - "symfony/webhook": "<7.2", - "symfony/workflow": "<7.3.0-beta2" + "symfony/workflow": "<6.4" }, "require-dev": { "doctrine/persistence": "^1.3|^2|^3", @@ -4682,13 +2702,11 @@ "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", - "symfony/json-streamer": "7.3.*", "symfony/lock": "^6.4|^7.0", "symfony/mailer": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", "symfony/notifier": "^6.4|^7.0", - "symfony/object-mapper": "^v7.3.0-beta2", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", @@ -4696,19 +2714,18 @@ "symfony/scheduler": "^6.4.4|^7.0.4", "symfony/security-bundle": "^6.4|^7.0", "symfony/semaphore": "^6.4|^7.0", - "symfony/serializer": "^7.2.5", + "symfony/serializer": "^6.4|^7.0", "symfony/stopwatch": "^6.4|^7.0", "symfony/string": "^6.4|^7.0", - "symfony/translation": "^7.3", + "symfony/translation": "^6.4|^7.0", "symfony/twig-bundle": "^6.4|^7.0", "symfony/type-info": "^7.1", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", - "symfony/webhook": "^7.2", - "symfony/workflow": "^7.3", + "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.12" + "twig/twig": "^3.0.4" }, "type": "symfony-bundle", "autoload": { @@ -4736,7 +2753,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.3.1" + "source": "https://github.com/symfony/framework-bundle/tree/v7.1.1" }, "funding": [ { @@ -4752,210 +2769,35 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" - }, - { - "name": "symfony/http-client", - "version": "v7.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/4403d87a2c16f33345dca93407a8714ee8c05a64", - "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.4|^3.5.2", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "amphp/amp": "<2.5", - "amphp/socket": "<1.1", - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.4" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "3.0" - }, - "require-dev": { - "amphp/http-client": "^4.2.1|^5.0", - "amphp/http-tunnel": "^1.0|^2.0", - "guzzlehttp/promises": "^1.4|^2.0", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/amphp-http-client-meta": "^1.0|^2.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "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/v7.3.1" - }, - "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": "2025-06-28T07:58:39+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "75d7043853a42837e68111812f4d964b01e5101c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", - "reference": "75d7043853a42837e68111812f4d964b01e5101c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" - }, - "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": "2025-04-29T11:18:49+00:00" + "time": "2024-06-04T06:40:14+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "23dd60256610c86a3414575b70c596e5deff6ed9" + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/23dd60256610c86a3414575b70c596e5deff6ed9", - "reference": "23dd60256610c86a3414575b70c596e5deff6ed9", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/74d171d5b6a1d9e4bfee09a41937c17a7536acfa", + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "conflict": { "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + "symfony/cache": "<6.4" }, "require-dev": { "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5", - "symfony/clock": "^6.4|^7.0", + "symfony/cache": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -4988,7 +2830,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.1" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.1" }, "funding": [ { @@ -5004,20 +2846,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T15:07:14+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831" + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1644879a66e4aa29c36fe33dfa6c54b450ce1831", - "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fa8d1c75b5f33b1302afccf81811f93976c6e26f", + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f", "shasum": "" }, "require": { @@ -5025,8 +2867,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^7.3", - "symfony/http-foundation": "^7.3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -5046,7 +2888,7 @@ "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", "symfony/var-dumper": "<6.4", - "twig/twig": "<3.12" + "twig/twig": "<3.0.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" @@ -5074,7 +2916,7 @@ "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.12" + "twig/twig": "^3.0.4" }, "type": "library", "autoload": { @@ -5102,7 +2944,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/v7.3.1" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.1" }, "funding": [ { @@ -5118,265 +2960,20 @@ "type": "tidelift" } ], - "time": "2025-06-28T08:24:55+00:00" - }, - { - "name": "symfony/intl", - "version": "v7.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/intl.git", - "reference": "bd50940329ac1cfc4af0491cc4468f477d967e45" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/bd50940329ac1cfc4af0491cc4468f477d967e45", - "reference": "bd50940329ac1cfc4af0491cc4468f477d967e45", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/string": "<7.1" - }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Intl\\": "" - }, - "exclude-from-classmap": [ - "/Tests/", - "/Resources/data/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - }, - { - "name": "Eriksen Costa", - "email": "eriksen.costa@infranology.com.br" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides access to the localization data of the ICU library", - "homepage": "https://symfony.com", - "keywords": [ - "i18n", - "icu", - "internationalization", - "intl", - "l10n", - "localization" - ], - "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.1" - }, - "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": "2025-06-06T16:10:07+00:00" - }, - { - "name": "symfony/monolog-bridge", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "1b188c8abbbef25b111da878797514b7a8d33990" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/1b188c8abbbef25b111da878797514b7a8d33990", - "reference": "1b188c8abbbef25b111da878797514b7a8d33990", - "shasum": "" - }, - "require": { - "monolog/monolog": "^3", - "php": ">=8.2", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/console": "<6.4", - "symfony/http-foundation": "<6.4", - "symfony/security-core": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/mailer": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Monolog\\": "" - }, - "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 integration for Monolog with various Symfony components", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.0" - }, - "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": "2025-03-21T12:17:46+00:00" - }, - { - "name": "symfony/monolog-bundle", - "version": "v3.10.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", - "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", - "shasum": "" - }, - "require": { - "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", - "php": ">=7.2.5", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", - "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/phpunit-bridge": "^6.3 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\MonologBundle\\": "" - }, - "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": "Symfony MonologBundle", - "homepage": "https://symfony.com", - "keywords": [ - "log", - "logging" - ], - "support": { - "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0" - }, - "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": "2023-11-06T17:08:13+00:00" + "time": "2024-06-04T06:52:15+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca" + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca", - "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", "shasum": "" }, "require": { @@ -5414,7 +3011,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" }, "funding": [ { @@ -5430,20 +3027,20 @@ "type": "tidelift" } ], - "time": "2025-04-04T13:12:05+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" + "reference": "4ad96eb7cf9e2f8f133ada95f2b8021769061662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/4ad96eb7cf9e2f8f133ada95f2b8021769061662", + "reference": "4ad96eb7cf9e2f8f133ada95f2b8021769061662", "shasum": "" }, "require": { @@ -5486,7 +3083,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" + "source": "https://github.com/symfony/password-hasher/tree/v7.1.1" }, "funding": [ { @@ -5502,24 +3099,24 @@ "type": "tidelift" } ], - "time": "2025-02-04T08:22:58+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.32.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" @@ -5527,8 +3124,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5564,7 +3161,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -5580,24 +3177,24 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.32.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811" + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance and support of other locales than \"en\"" @@ -5605,8 +3202,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5648,7 +3245,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" }, "funding": [ { @@ -5664,24 +3261,24 @@ "type": "tidelift" } ], - "time": "2024-12-21T18:38:29+00:00" + "time": "2024-01-29T20:12:16+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.32.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" @@ -5689,8 +3286,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5729,7 +3326,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -5745,25 +3342,24 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { - "ext-iconv": "*", - "php": ">=7.2" + "php": ">=7.1" }, "provide": { "ext-mbstring": "*" @@ -5774,8 +3370,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5810,7 +3406,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -5826,24 +3422,101 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { - "name": "symfony/polyfill-uuid", - "version": "v1.32.0", + "name": "symfony/polyfill-php83", + "version": "v1.29.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + }, + "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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "shasum": "" + }, + "require": { + "php": ">=7.1" }, "provide": { "ext-uuid": "*" @@ -5854,8 +3527,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5889,7 +3562,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" }, "funding": [ { @@ -5905,20 +3578,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/property-access", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "518d15c8cca726ebe665dcd7154074584cf862e8" + "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/518d15c8cca726ebe665dcd7154074584cf862e8", - "reference": "518d15c8cca726ebe665dcd7154074584cf862e8", + "url": "https://api.github.com/repos/symfony/property-access/zipball/74e39e6a6276b8e384f34c6ddbc10a6c9a60193a", + "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a", "shasum": "" }, "require": { @@ -5965,7 +3638,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.3.1" + "source": "https://github.com/symfony/property-access/tree/v7.1.1" }, "funding": [ { @@ -5981,38 +3654,36 @@ "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/property-info", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970" + "reference": "0f80f818c6728f15de30a4f89866d68e4912ae84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970", - "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970", + "url": "https://api.github.com/repos/symfony/property-info/zipball/0f80f818c6728f15de30a4f89866d68e4912ae84", + "reference": "0f80f818c6728f15de30a4f89866d68e4912ae84", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "~7.2.8|^7.3.1" + "symfony/type-info": "^7.1" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/cache": "<6.4", "symfony/dependency-injection": "<6.4", "symfony/serializer": "<6.4" }, "require-dev": { "phpdocumentor/reflection-docblock": "^5.2", - "phpstan/phpdoc-parser": "^1.0|^2.0", + "phpstan/phpdoc-parser": "^1.0", "symfony/cache": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/serializer": "^6.4|^7.0" @@ -6051,7 +3722,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.3.1" + "source": "https://github.com/symfony/property-info/tree/v7.1.1" }, "funding": [ { @@ -6067,20 +3738,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/routing", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8e213820c5fea844ecea29203d2a308019007c15" + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8e213820c5fea844ecea29203d2a308019007c15", - "reference": "8e213820c5fea844ecea29203d2a308019007c15", + "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", "shasum": "" }, "require": { @@ -6132,7 +3803,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.3.0" + "source": "https://github.com/symfony/routing/tree/v7.1.1" }, "funding": [ { @@ -6148,20 +3819,20 @@ "type": "tidelift" } ], - "time": "2025-05-24T20:43:28+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/runtime", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "9516056d432f8acdac9458eb41b80097da7a05c9" + "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/9516056d432f8acdac9458eb41b80097da7a05c9", - "reference": "9516056d432f8acdac9458eb41b80097da7a05c9", + "url": "https://api.github.com/repos/symfony/runtime/zipball/ea34522c447dd91a2b31cb330ee4540a56ba53f6", + "reference": "ea34522c447dd91a2b31cb330ee4540a56ba53f6", "shasum": "" }, "require": { @@ -6211,7 +3882,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.3.1" + "source": "https://github.com/symfony/runtime/tree/v7.1.1" }, "funding": [ { @@ -6227,131 +3898,24 @@ "type": "tidelift" } ], - "time": "2025-06-13T07:48:40+00:00" - }, - { - "name": "symfony/security-bundle", - "version": "v7.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-bundle.git", - "reference": "428a281fd66c8358adc2259c8578e6d81fbb7079" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/428a281fd66c8358adc2259c8578e6d81fbb7079", - "reference": "428a281fd66c8358adc2259c8578e6d81fbb7079", - "shasum": "" - }, - "require": { - "composer-runtime-api": ">=2.1", - "ext-xml": "*", - "php": ">=8.2", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^7.3", - "symfony/dependency-injection": "^6.4.11|^7.1.4", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/password-hasher": "^6.4|^7.0", - "symfony/security-core": "^7.3", - "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^7.3", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/browser-kit": "<6.4", - "symfony/console": "<6.4", - "symfony/framework-bundle": "<6.4", - "symfony/http-client": "<6.4", - "symfony/ldap": "<6.4", - "symfony/serializer": "<6.4", - "symfony/twig-bundle": "<6.4", - "symfony/validator": "<6.4" - }, - "require-dev": { - "symfony/asset": "^6.4|^7.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/ldap": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", - "symfony/twig-bundle": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.12", - "web-token/jwt-library": "^3.3.2|^4.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\SecurityBundle\\": "" - }, - "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 tight integration of the Security component into the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-bundle/tree/v7.3.1" - }, - "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": "2025-06-24T04:04:43+00:00" + "time": "2024-05-31T14:55:39+00:00" }, { "name": "symfony/security-core", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "fafab1003a31e51506e1a0a83e81c072211d81ba" + "reference": "536399671a46b0e615d69583f067e30ad25ad038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/fafab1003a31e51506e1a0a83e81c072211d81ba", - "reference": "fafab1003a31e51506e1a0a83e81c072211d81ba", + "url": "https://api.github.com/repos/symfony/security-core/zipball/536399671a46b0e615d69583f067e30ad25ad038", + "reference": "536399671a46b0e615d69583f067e30ad25ad038", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", "symfony/password-hasher": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" @@ -6404,7 +3968,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.3.1" + "source": "https://github.com/symfony/security-core/tree/v7.1.1" }, "funding": [ { @@ -6420,20 +3984,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T07:28:50+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/security-csrf", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3" + "reference": "27cd1bce9d7f3457a152a6ca9790712d6954dd21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/2b4b0c46c901729e4e90719eacd980381f53e0a3", - "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/27cd1bce9d7f3457a152a6ca9790712d6954dd21", + "reference": "27cd1bce9d7f3457a152a6ca9790712d6954dd21", "shasum": "" }, "require": { @@ -6444,9 +4008,7 @@ "symfony/http-foundation": "<6.4" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0" + "symfony/http-foundation": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6474,7 +4036,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v7.3.0" + "source": "https://github.com/symfony/security-csrf/tree/v7.1.1" }, "funding": [ { @@ -6490,206 +4052,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T18:42:10+00:00" - }, - { - "name": "symfony/security-http", - "version": "v7.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-http.git", - "reference": "b7182ed0fd2359297f78ff6d407265168255ea84" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/b7182ed0fd2359297f78ff6d407265168255ea84", - "reference": "b7182ed0fd2359297f78ff6d407265168255ea84", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/security-core": "^7.3", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/clock": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/http-client-contracts": "<3.0", - "symfony/security-bundle": "<6.4", - "symfony/security-csrf": "<6.4" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/cache": "^6.4|^7.0", - "symfony/clock": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/http-client-contracts": "^3.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", - "symfony/security-csrf": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "web-token/jwt-library": "^3.3.2|^4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\Http\\": "" - }, - "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": "Symfony Security Component - HTTP Integration", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-http/tree/v7.3.1" - }, - "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": "2025-06-24T04:04:43+00:00" - }, - { - "name": "symfony/serializer", - "version": "v7.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/serializer.git", - "reference": "feaf837cedbbc8287986602223175d3fd639922d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/feaf837cedbbc8287986602223175d3fd639922d", - "reference": "feaf837cedbbc8287986602223175d3fd639922d", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<6.4", - "symfony/property-access": "<6.4", - "symfony/property-info": "<6.4", - "symfony/uid": "<6.4", - "symfony/validator": "<6.4", - "symfony/yaml": "<6.4" - }, - "require-dev": { - "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", - "phpstan/phpdoc-parser": "^1.0|^2.0", - "seld/jsonlint": "^1.10", - "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^7.2", - "symfony/error-handler": "^6.4|^7.0", - "symfony/filesystem": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Serializer\\": "" - }, - "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/serializer/tree/v7.3.1" - }, - "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": "2025-06-27T19:55:54+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { @@ -6702,12 +4078,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -6743,7 +4119,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -6759,20 +4135,20 @@ "type": "tidelift" } ], - "time": "2025-04-25T09:37:31+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", - "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", "shasum": "" }, "require": { @@ -6805,7 +4181,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v7.1.1" }, "funding": [ { @@ -6821,20 +4197,20 @@ "type": "tidelift" } ], - "time": "2025-02-24T10:49:57+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/string", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" + "reference": "60bc311c74e0af215101235aa6f471bcbc032df2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", + "url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2", + "reference": "60bc311c74e0af215101235aa6f471bcbc032df2", "shasum": "" }, "require": { @@ -6892,7 +4268,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.0" + "source": "https://github.com/symfony/string/tree/v7.1.1" }, "funding": [ { @@ -6908,20 +4284,20 @@ "type": "tidelift" } ], - "time": "2025-04-20T20:19:01+00:00" + "time": "2024-06-04T06:40:14+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -6929,12 +4305,12 @@ }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -6970,7 +4346,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -6986,27 +4362,26 @@ "type": "tidelift" } ], - "time": "2024-09-27T08:32:26+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/twig-bridge", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "082eb15d8a4f9afee0acc4709fbe3aaf26d48891" + "reference": "96e6e12a63db80bcedefc012042d2cb2d1a015f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/082eb15d8a4f9afee0acc4709fbe3aaf26d48891", - "reference": "082eb15d8a4f9afee0acc4709fbe3aaf26d48891", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/96e6e12a63db80bcedefc012042d2cb2d1a015f8", + "reference": "96e6e12a63db80bcedefc012042d2cb2d1a015f8", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.21" + "twig/twig": "^3.9" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", @@ -7031,9 +4406,9 @@ "symfony/emoji": "^7.1", "symfony/expression-language": "^6.4|^7.0", "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4.20|^7.2.5", + "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^7.3", + "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", @@ -7047,13 +4422,12 @@ "symfony/serializer": "^6.4.3|^7.0.3", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/cssinliner-extra": "^3", - "twig/inky-extra": "^3", - "twig/markdown-extra": "^3" + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" }, "type": "symfony-bridge", "autoload": { @@ -7081,7 +4455,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.3.0" + "source": "https://github.com/symfony/twig-bridge/tree/v7.1.1" }, "funding": [ { @@ -7097,31 +4471,31 @@ "type": "tidelift" } ], - "time": "2025-05-19T13:28:56+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "bc23c11d9716fc2261ee26a32e654b0e8b1b1896" + "reference": "d48c2f08c2f315e749f0e18fc4945b7be8afe1e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/bc23c11d9716fc2261ee26a32e654b0e8b1b1896", - "reference": "bc23c11d9716fc2261ee26a32e654b0e8b1b1896", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/d48c2f08c2f315e749f0e18fc4945b7be8afe1e5", + "reference": "d48c2f08c2f315e749f0e18fc4945b7be8afe1e5", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^7.3", + "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/twig-bridge": "^7.3", - "twig/twig": "^3.12" + "symfony/twig-bridge": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "conflict": { "symfony/framework-bundle": "<6.4", @@ -7165,7 +4539,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v7.3.1" + "source": "https://github.com/symfony/twig-bundle/tree/v7.1.1" }, "funding": [ { @@ -7181,32 +4555,35 @@ "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/type-info", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150" + "reference": "60b28eb733f1453287f1263ed305b96091e0d1dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/5fa6e25e4195e73ce9e457b521ac5e61ec271150", - "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150", + "url": "https://api.github.com/repos/symfony/type-info/zipball/60b28eb733f1453287f1263ed305b96091e0d1dc", + "reference": "60b28eb733f1453287f1263ed305b96091e0d1dc", "shasum": "" }, "require": { "php": ">=8.2", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "psr/container": "^1.1|^2.0" }, "conflict": { - "phpstan/phpdoc-parser": "<1.30" + "phpstan/phpdoc-parser": "<1.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-info": "<6.4" }, "require-dev": { - "phpstan/phpdoc-parser": "^1.30|^2.0" + "phpstan/phpdoc-parser": "^1.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7244,7 +4621,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.3.1" + "source": "https://github.com/symfony/type-info/tree/v7.1.1" }, "funding": [ { @@ -7260,20 +4637,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2024-05-31T14:59:31+00:00" }, { "name": "symfony/uid", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", - "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", + "url": "https://api.github.com/repos/symfony/uid/zipball/bb59febeecc81528ff672fad5dab7f06db8c8277", + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277", "shasum": "" }, "require": { @@ -7318,7 +4695,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.3.1" + "source": "https://github.com/symfony/uid/tree/v7.1.1" }, "funding": [ { @@ -7334,20 +4711,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/validator", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "e2f2497c869fc57446f735fbf00cff4de32ae8c3" + "reference": "fcab7598968b21c361becc930fcae8846638c4c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/e2f2497c869fc57446f735fbf00cff4de32ae8c3", - "reference": "e2f2497c869fc57446f735fbf00cff4de32ae8c3", + "url": "https://api.github.com/repos/symfony/validator/zipball/fcab7598968b21c361becc930fcae8846638c4c0", + "reference": "fcab7598968b21c361becc930fcae8846638c4c0", "shasum": "" }, "require": { @@ -7384,7 +4761,6 @@ "symfony/mime": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", - "symfony/string": "^6.4|^7.0", "symfony/translation": "^6.4.3|^7.0.3", "symfony/type-info": "^7.1", "symfony/yaml": "^6.4|^7.0" @@ -7416,7 +4792,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.3.1" + "source": "https://github.com/symfony/validator/tree/v7.1.1" }, "funding": [ { @@ -7432,25 +4808,24 @@ "type": "tidelift" } ], - "time": "2025-06-26T13:22:23+00:00" + "time": "2024-06-04T05:58:56+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42" + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", - "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/deb2c2b506ff6fdbb340e00b34e9901e1605f293", + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -7462,7 +4837,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.12" + "twig/twig": "^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -7500,7 +4875,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.1" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.1" }, "funding": [ { @@ -7516,25 +4891,24 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c" + "reference": "db82c2b73b88734557cfc30e3270d83fa651b712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c9a1168891b5aaadfd6332ef44393330b3498c4c", - "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/db82c2b73b88734557cfc30e3270d83fa651b712", + "reference": "db82c2b73b88734557cfc30e3270d83fa651b712", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.2" }, "require-dev": { "symfony/property-access": "^6.4|^7.0", @@ -7577,7 +4951,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.3.0" + "source": "https://github.com/symfony/var-exporter/tree/v7.1.1" }, "funding": [ { @@ -7593,108 +4967,24 @@ "type": "tidelift" } ], - "time": "2025-05-15T09:04:05+00:00" - }, - { - "name": "symfony/web-link", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/web-link.git", - "reference": "7697f74fce67555665339423ce453cc8216a98ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/7697f74fce67555665339423ce453cc8216a98ff", - "reference": "7697f74fce67555665339423ce453cc8216a98ff", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/link": "^1.1|^2.0" - }, - "conflict": { - "symfony/http-kernel": "<6.4" - }, - "provide": { - "psr/link-implementation": "1.0|2.0" - }, - "require-dev": { - "symfony/http-kernel": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\WebLink\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "dunglas@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Manages links between resources", - "homepage": "https://symfony.com", - "keywords": [ - "dns-prefetch", - "http", - "http2", - "link", - "performance", - "prefetch", - "preload", - "prerender", - "psr13", - "push" - ], - "support": { - "source": "https://github.com/symfony/web-link/tree/v7.3.0" - }, - "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": "2025-05-19T13:28:18+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/yaml", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb" + "reference": "fa34c77015aa6720469db7003567b9f772492bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0c3555045a46ab3cd4cc5a69d161225195230edb", - "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb", + "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", + "reference": "fa34c77015aa6720469db7003567b9f772492bf2", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7732,7 +5022,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.3.1" + "source": "https://github.com/symfony/yaml/tree/v7.1.1" }, "funding": [ { @@ -7748,168 +5038,30 @@ "type": "tidelift" } ], - "time": "2025-06-03T06:57:57+00:00" - }, - { - "name": "twig/extra-bundle", - "version": "v3.21.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896", - "shasum": "" - }, - "require": { - "php": ">=8.1.0", - "symfony/framework-bundle": "^5.4|^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.4|^7.0", - "twig/twig": "^3.2|^4.0" - }, - "require-dev": { - "league/commonmark": "^1.0|^2.0", - "symfony/phpunit-bridge": "^6.4|^7.0", - "twig/cache-extra": "^3.0", - "twig/cssinliner-extra": "^3.0", - "twig/html-extra": "^3.0", - "twig/inky-extra": "^3.0", - "twig/intl-extra": "^3.0", - "twig/markdown-extra": "^3.0", - "twig/string-extra": "^3.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Twig\\Extra\\TwigExtraBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Symfony bundle for extra Twig extensions", - "homepage": "https://twig.symfony.com", - "keywords": [ - "bundle", - "extra", - "twig" - ], - "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2025-02-19T14:29:33+00:00" - }, - { - "name": "twig/intl-extra", - "version": "v3.21.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/intl-extra.git", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146", - "shasum": "" - }, - "require": { - "php": ">=8.1.0", - "symfony/intl": "^5.4|^6.4|^7.0", - "twig/twig": "^3.13|^4.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Twig\\Extra\\Intl\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Twig extension for Intl", - "homepage": "https://twig.symfony.com", - "keywords": [ - "intl", - "twig" - ], - "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "twig/twig", - "version": "v3.21.1", + "version": "v3.10.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" + "reference": "67f29781ffafa520b0bbfbd8384674b42db04572" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572", + "reference": "67f29781ffafa520b0bbfbd8384674b42db04572", "shasum": "" }, "require": { - "php": ">=8.1.0", + "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.22" }, "require-dev": { - "phpstan/phpstan": "^2.0", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -7953,7 +5105,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.21.1" + "source": "https://github.com/twigphp/Twig/tree/v3.10.3" }, "funding": [ { @@ -7965,241 +5117,34 @@ "type": "tidelift" } ], - "time": "2025-05-03T07:21:55+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - }, - { - "name": "willdurand/negotiation", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/willdurand/Negotiation.git", - "reference": "68e9ea0553ef6e2ee8db5c1d98829f111e623ec2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/68e9ea0553ef6e2ee8db5c1d98829f111e623ec2", - "reference": "68e9ea0553ef6e2ee8db5c1d98829f111e623ec2", - "shasum": "" - }, - "require": { - "php": ">=7.1.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Negotiation\\": "src/Negotiation" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "William Durand", - "email": "will+git@drnd.me" - } - ], - "description": "Content Negotiation tools for PHP provided as a standalone library.", - "homepage": "http://williamdurand.fr/Negotiation/", - "keywords": [ - "accept", - "content", - "format", - "header", - "negotiation" - ], - "support": { - "issues": "https://github.com/willdurand/Negotiation/issues", - "source": "https://github.com/willdurand/Negotiation/tree/3.1.0" - }, - "time": "2022-01-30T20:08:53+00:00" + "time": "2024-05-16T10:04:27+00:00" } ], "packages-dev": [ - { - "name": "brianium/paratest", - "version": "v7.8.3", - "source": { - "type": "git", - "url": "https://github.com/paratestphp/paratest.git", - "reference": "a585c346ddf1bec22e51e20b5387607905604a71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/a585c346ddf1bec22e51e20b5387607905604a71", - "reference": "a585c346ddf1bec22e51e20b5387607905604a71", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.2.0", - "jean85/pretty-package-versions": "^2.1.0", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "phpunit/php-code-coverage": "^11.0.9 || ^12.0.4", - "phpunit/php-file-iterator": "^5.1.0 || ^6", - "phpunit/php-timer": "^7.0.1 || ^8", - "phpunit/phpunit": "^11.5.11 || ^12.0.6", - "sebastian/environment": "^7.2.0 || ^8", - "symfony/console": "^6.4.17 || ^7.2.1", - "symfony/process": "^6.4.19 || ^7.2.4" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0.0", - "ext-pcov": "*", - "ext-posix": "*", - "phpstan/phpstan": "^2.1.6", - "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpstan/phpstan-phpunit": "^2.0.4", - "phpstan/phpstan-strict-rules": "^2.0.3", - "squizlabs/php_codesniffer": "^3.11.3", - "symfony/filesystem": "^6.4.13 || ^7.2.0" - }, - "bin": [ - "bin/paratest", - "bin/paratest_for_phpstorm" - ], - "type": "library", - "autoload": { - "psr-4": { - "ParaTest\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Scaturro", - "email": "scaturrob@gmail.com", - "role": "Developer" - }, - { - "name": "Filippo Tessarotto", - "email": "zoeslam@gmail.com", - "role": "Developer" - } - ], - "description": "Parallel testing for PHP", - "homepage": "https://github.com/paratestphp/paratest", - "keywords": [ - "concurrent", - "parallel", - "phpunit", - "testing" - ], - "support": { - "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.8.3" - }, - "funding": [ - { - "url": "https://github.com/sponsors/Slamdunk", - "type": "github" - }, - { - "url": "https://paypal.me/filippotessarotto", - "type": "paypal" - } - ], - "time": "2025-03-05T08:29:11+00:00" - }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.1.1", + "version": "v1.0.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "6e0fa428497bf560152ee73ffbb8af5c6a56b0dd" + "reference": "4be43904336affa5c2f70744a348312336afd0da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/6e0fa428497bf560152ee73ffbb8af5c6a56b0dd", - "reference": "6e0fa428497bf560152ee73ffbb8af5c6a56b0dd", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", "shasum": "" }, "require": { - "composer-plugin-api": "^2.2", + "composer-plugin-api": "^1.0 || ^2.0", "php": ">=5.4", "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" }, "require-dev": { - "composer/composer": "^2.2", + "composer/composer": "*", "ext-json": "*", "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.4.0", + "php-parallel-lint/php-parallel-lint": "^1.3.1", "phpcompatibility/php-compatibility": "^9.0", "yoast/phpunit-polyfills": "^1.0" }, @@ -8219,9 +5164,9 @@ "authors": [ { "name": "Franck Nijhof", - "email": "opensource@frenck.dev", - "homepage": "https://frenck.dev", - "role": "Open source developer" + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" }, { "name": "Contributors", @@ -8229,6 +5174,7 @@ } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", "keywords": [ "PHPCodeSniffer", "PHP_CodeSniffer", @@ -8249,490 +5195,23 @@ ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", - "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", "source": "https://github.com/PHPCSStandards/composer-installer" }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" - } - ], - "time": "2025-06-27T17:24:01+00:00" - }, - { - "name": "doctrine/data-fixtures", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "f65b353922b7ac48f360428e19b22fcce5aba134" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f65b353922b7ac48f360428e19b22fcce5aba134", - "reference": "f65b353922b7ac48f360428e19b22fcce5aba134", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^3.1 || ^4.0", - "php": "^8.1", - "psr/log": "^1.1 || ^2 || ^3" - }, - "conflict": { - "doctrine/dbal": "<3.5 || >=5", - "doctrine/orm": "<2.14 || >=4", - "doctrine/phpcr-odm": "<1.3.0" - }, - "require-dev": { - "doctrine/coding-standard": "^13", - "doctrine/dbal": "^3.5 || ^4", - "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", - "doctrine/orm": "^2.14 || ^3", - "ext-sqlite3": "*", - "fig/log-test": "^1", - "phpstan/phpstan": "2.1.17", - "phpunit/phpunit": "10.5.45", - "symfony/cache": "^6.4 || ^7", - "symfony/var-exporter": "^6.4 || ^7" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", - "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", - "doctrine/orm": "For loading ORM fixtures", - "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\DataFixtures\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Data Fixtures for all Doctrine Object Managers", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "database" - ], - "support": { - "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.0.3" - }, - "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%2Fdata-fixtures", - "type": "tidelift" - } - ], - "time": "2025-06-27T19:59:58+00:00" - }, - { - "name": "doctrine/doctrine-fixtures-bundle", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "a06db6b81ff20a2980bf92063d80c013bb8b4b7c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/a06db6b81ff20a2980bf92063d80c013bb8b4b7c", - "reference": "a06db6b81ff20a2980bf92063d80c013bb8b4b7c", - "shasum": "" - }, - "require": { - "doctrine/data-fixtures": "^2.0", - "doctrine/doctrine-bundle": "^2.2", - "doctrine/orm": "^2.14.0 || ^3.0", - "doctrine/persistence": "^2.4 || ^3.0 || ^4.0", - "php": "^8.1", - "psr/log": "^2 || ^3", - "symfony/config": "^6.4 || ^7.0", - "symfony/console": "^6.4 || ^7.0", - "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^6.4.16 || ^7.1.9", - "symfony/http-kernel": "^6.4 || ^7.0" - }, - "conflict": { - "doctrine/dbal": "< 3" - }, - "require-dev": { - "doctrine/coding-standard": "13.0.0", - "phpstan/phpstan": "2.1.11", - "phpunit/phpunit": "^10.5.38 || 11.4.14" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\FixturesBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Doctrine Project", - "homepage": "https://www.doctrine-project.org" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DoctrineFixturesBundle", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "Fixture", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/4.1.0" - }, - "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%2Fdoctrine-fixtures-bundle", - "type": "tidelift" - } - ], - "time": "2025-03-26T10:56:26+00:00" - }, - { - "name": "fidry/cpu-core-counter", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "fidry/makefile": "^0.2.0", - "fidry/php-cs-fixer-config": "^1.1.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Fidry\\CpuCoreCounter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com" - } - ], - "description": "Tiny utility to get the number of CPU cores.", - "keywords": [ - "CPU", - "core" - ], - "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" - }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2024-08-06T10:04:20+00:00" - }, - { - "name": "filp/whoops", - "version": "2.18.3", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "59a123a3d459c5a23055802237cb317f609867e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/59a123a3d459c5a23055802237cb317f609867e5", - "reference": "59a123a3d459c5a23055802237cb317f609867e5", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "require-dev": { - "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", - "whoops/soap": "Formats errors as SOAP responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Whoops\\": "src/Whoops/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" - } - ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", - "keywords": [ - "error", - "exception", - "handling", - "library", - "throwable", - "whoops" - ], - "support": { - "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.18.3" - }, - "funding": [ - { - "url": "https://github.com/denis-sokolov", - "type": "github" - } - ], - "time": "2025-06-16T00:02:10+00:00" - }, - { - "name": "jean85/pretty-package-versions", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", - "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.1.0", - "php": "^7.4|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "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": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A library to get pretty versions strings of installed dependencies", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" - }, - "time": "2025-03-19T14:43:43+00:00" - }, - { - "name": "liip/test-fixtures-bundle", - "version": "3.5.0", - "source": { - "type": "git", - "url": "https://github.com/liip/LiipTestFixturesBundle.git", - "reference": "f385458e47026b7bf5e73efe2a96c6b74805edc5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/liip/LiipTestFixturesBundle/zipball/f385458e47026b7bf5e73efe2a96c6b74805edc5", - "reference": "f385458e47026b7bf5e73efe2a96c6b74805edc5", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^1.3.3 || ^2.0 || ^3.0 || ^4.0", - "php": "^8.1", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/event-dispatcher": "^5.4 || ^6.3 || ^7.0", - "symfony/event-dispatcher-contracts": "^1 || ^2 || ^3", - "symfony/framework-bundle": "^5.4 || ^6.3 || ^7.0", - "symfony/yaml": "^5.4 || ^6.3 || ^7.0" - }, - "conflict": { - "doctrine/annotations": "<1.13.1 || >=3.0", - "doctrine/dbal": "<2.13.1 || ~3.0.0 || >=5.0", - "doctrine/mongodb-odm": "<2.2 || >=3.0", - "doctrine/orm": "<2.14 || >=4.0" - }, - "require-dev": { - "doctrine/data-fixtures": "^1.7 || ^2.0.1", - "doctrine/doctrine-bundle": "^2.11", - "doctrine/doctrine-fixtures-bundle": "^3.5.1 || ^4.0", - "doctrine/mongodb-odm": "^2.5", - "doctrine/mongodb-odm-bundle": "^4.4 || ^5.0", - "doctrine/orm": "^2.14 || ^3.1.0", - "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", - "phpunit/phpunit": "^10.5.11 || ^11.0.4 || ^12.0.0", - "symfony/doctrine-bridge": "^5.4 || ^6.3 || ^7.0", - "symfony/monolog-bridge": "^5.4 || ^6.3 || ^7.0", - "symfony/monolog-bundle": "^3.2", - "theofidry/alice-data-fixtures": "^1.5.2" - }, - "suggest": { - "doctrine/dbal": "Required when using the fixture loading functionality with an ORM and SQLite", - "doctrine/doctrine-fixtures-bundle": "Required when using the fixture loading functionality", - "doctrine/orm": "Required when using the fixture loading functionality with an ORM and SQLite", - "hautelook/alice-bundle": "Required when using loadFixtureFiles functionality with custom providers", - "theofidry/alice-data-fixtures": "Required when using loadFixtureFiles functionality" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Liip\\TestFixturesBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Liip AG", - "homepage": "http://www.liip.ch/" - }, - { - "name": "Community contributions", - "homepage": "https://github.com/liip/LiipTestFixturesBundle/contributors" - } - ], - "description": "This bundles enables efficient loading of Doctrine fixtures in functional test-cases for Symfony applications", - "keywords": [ - "fixtures", - "symfony", - "testing" - ], - "support": { - "issues": "https://github.com/liip/LiipTestFixturesBundle/issues", - "source": "https://github.com/liip/LiipTestFixturesBundle/tree/3.5.0" - }, - "time": "2025-07-06T19:52:28+00:00" + "time": "2023-01-05T11:28:13+00:00" }, { "name": "lubiana/code-quality", - "version": "1.7.3", + "version": "1.7.0", "source": { "type": "git", "url": "https://git.php.fail/lubiana/code-quality.git", - "reference": "85f220919f8b478eb25ca0ca1028f045b8f0c4c4" + "reference": "2793c36fa9c9daf0c51f4bf0fce1fce76ccc85fc" }, "require": { "php": "^8.3", - "rector/rector": "^2.1.0", - "slevomat/coding-standard": "^8.19.1", - "symplify/easy-coding-standard": "^12.5.20" + "rector/rector": "^1.0.4", + "slevomat/coding-standard": "^8.15.0", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", "autoload": { @@ -8747,7 +5226,7 @@ "keywords": [ "dev" ], - "time": "2025-06-29T17:02:17+00:00" + "time": "2024-05-04T18:26:43+00:00" }, { "name": "masterminds/html5", @@ -8818,16 +5297,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.3", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "faed855a7b5f4d4637717c2b3863e277116beb36" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36", - "reference": "faed855a7b5f4d4637717c2b3863e277116beb36", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -8866,7 +5345,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.3" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -8874,20 +5353,20 @@ "type": "tidelift" } ], - "time": "2025-07-05T12:25:42+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nikic/php-parser", - "version": "v5.5.0", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { @@ -8898,7 +5377,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -8930,519 +5409,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2025-05-31T08:24:38+00:00" - }, - { - "name": "nunomaduro/collision", - "version": "v8.8.2", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", - "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", - "shasum": "" - }, - "require": { - "filp/whoops": "^2.18.1", - "nunomaduro/termwind": "^2.3.1", - "php": "^8.2.0", - "symfony/console": "^7.3.0" - }, - "conflict": { - "laravel/framework": "<11.44.2 || >=13.0.0", - "phpunit/phpunit": "<11.5.15 || >=13.0.0" - }, - "require-dev": { - "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.4.2", - "laravel/framework": "^11.44.2 || ^12.18", - "laravel/pint": "^1.22.1", - "laravel/sail": "^1.43.1", - "laravel/sanctum": "^4.1.1", - "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.4", - "pestphp/pest": "^3.8.2", - "sebastian/environment": "^7.2.1 || ^8.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - }, - "branch-alias": { - "dev-8.x": "8.x-dev" - } - }, - "autoload": { - "files": [ - "./src/Adapters/Phpunit/Autoload.php" - ], - "psr-4": { - "NunoMaduro\\Collision\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Cli error handling for console/command-line PHP applications.", - "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "dev", - "error", - "handling", - "laravel", - "laravel-zero", - "php", - "symfony" - ], - "support": { - "issues": "https://github.com/nunomaduro/collision/issues", - "source": "https://github.com/nunomaduro/collision" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2025-06-25T02:12:12+00:00" - }, - { - "name": "nunomaduro/termwind", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", - "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^8.2", - "symfony/console": "^7.2.6" - }, - "require-dev": { - "illuminate/console": "^11.44.7", - "laravel/pint": "^1.22.0", - "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0 || ^3.8.2", - "phpstan/phpstan": "^1.12.25", - "phpstan/phpstan-strict-rules": "^1.6.2", - "symfony/var-dumper": "^7.2.6", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] - }, - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "files": [ - "src/Functions.php" - ], - "psr-4": { - "Termwind\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Its like Tailwind CSS, but for the console.", - "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" - ], - "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://github.com/xiCO2k", - "type": "github" - } - ], - "time": "2025-05-08T08:14:37+00:00" - }, - { - "name": "pestphp/pest", - "version": "v3.8.2", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest.git", - "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/c6244a8712968dbac88eb998e7ff3b5caa556b0d", - "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d", - "shasum": "" - }, - "require": { - "brianium/paratest": "^7.8.3", - "nunomaduro/collision": "^8.8.0", - "nunomaduro/termwind": "^2.3.0", - "pestphp/pest-plugin": "^3.0.0", - "pestphp/pest-plugin-arch": "^3.1.0", - "pestphp/pest-plugin-mutate": "^3.0.5", - "php": "^8.2.0", - "phpunit/phpunit": "^11.5.15" - }, - "conflict": { - "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.5.15", - "sebastian/exporter": "<6.0.0", - "webmozart/assert": "<1.11.0" - }, - "require-dev": { - "pestphp/pest-dev-tools": "^3.4.0", - "pestphp/pest-plugin-type-coverage": "^3.5.0", - "symfony/process": "^7.2.5" - }, - "bin": [ - "bin/pest" - ], - "type": "library", - "extra": { - "pest": { - "plugins": [ - "Pest\\Mutate\\Plugins\\Mutate", - "Pest\\Plugins\\Configuration", - "Pest\\Plugins\\Bail", - "Pest\\Plugins\\Cache", - "Pest\\Plugins\\Coverage", - "Pest\\Plugins\\Init", - "Pest\\Plugins\\Environment", - "Pest\\Plugins\\Help", - "Pest\\Plugins\\Memory", - "Pest\\Plugins\\Only", - "Pest\\Plugins\\Printer", - "Pest\\Plugins\\ProcessIsolation", - "Pest\\Plugins\\Profile", - "Pest\\Plugins\\Retry", - "Pest\\Plugins\\Snapshot", - "Pest\\Plugins\\Verbose", - "Pest\\Plugins\\Version", - "Pest\\Plugins\\Parallel" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "files": [ - "src/Functions.php", - "src/Pest.php" - ], - "psr-4": { - "Pest\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "The elegant PHP Testing Framework.", - "keywords": [ - "framework", - "pest", - "php", - "test", - "testing", - "unit" - ], - "support": { - "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.8.2" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2025-04-17T10:53:02+00:00" - }, - { - "name": "pestphp/pest-plugin", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.0.0", - "composer-runtime-api": "^2.2.2", - "php": "^8.2" - }, - "conflict": { - "pestphp/pest": "<3.0.0" - }, - "require-dev": { - "composer/composer": "^2.7.9", - "pestphp/pest": "^3.0.0", - "pestphp/pest-dev-tools": "^3.0.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Pest\\Plugin\\Manager" - }, - "autoload": { - "psr-4": { - "Pest\\Plugin\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Pest plugin manager", - "keywords": [ - "framework", - "manager", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2024-09-08T23:21:41+00:00" - }, - { - "name": "pestphp/pest-plugin-arch", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/db7bd9cb1612b223e16618d85475c6f63b9c8daa", - "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa", - "shasum": "" - }, - "require": { - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", - "ta-tikoma/phpunit-architecture-test": "^0.8.4" - }, - "require-dev": { - "pestphp/pest": "^3.8.1", - "pestphp/pest-dev-tools": "^3.4.0" - }, - "type": "library", - "extra": { - "pest": { - "plugins": [ - "Pest\\Arch\\Plugin" - ] - } - }, - "autoload": { - "files": [ - "src/Autoload.php" - ], - "psr-4": { - "Pest\\Arch\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Arch plugin for Pest PHP.", - "keywords": [ - "arch", - "architecture", - "framework", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2025-04-16T22:59:48+00:00" - }, - { - "name": "pestphp/pest-plugin-mutate", - "version": "v3.0.5", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin-mutate.git", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.2.0", - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", - "psr/simple-cache": "^3.0.0" - }, - "require-dev": { - "pestphp/pest": "^3.0.8", - "pestphp/pest-dev-tools": "^3.0.0", - "pestphp/pest-plugin-type-coverage": "^3.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Pest\\Mutate\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sandro Gehri", - "email": "sandrogehri@gmail.com" - } - ], - "description": "Mutates your code to find untested cases", - "keywords": [ - "framework", - "mutate", - "mutation", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/gehrisandro", - "type": "github" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2024-09-22T07:54:40+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { "name": "phar-io/manifest", @@ -9563,21 +5532,68 @@ "time": "2022-02-21T01:04:05+00:00" }, { - "name": "phpstan/phpstan", - "version": "2.1.17", + "name": "phpstan/phpdoc-parser", + "version": "1.29.1", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", - "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "shasum": "" }, "require": { - "php": "^7.4|^8.0" + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" + }, + "time": "2024-05-31T08:52:43+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.11.4", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "9100a76ce8015b9aa7125b9171ae3a76887b6c82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9100a76ce8015b9aa7125b9171ae3a76887b6c82", + "reference": "9100a76ce8015b9aa7125b9171ae3a76887b6c82", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -9618,39 +5634,39 @@ "type": "github" } ], - "time": "2025-05-21T20:55:28+00:00" + "time": "2024-06-06T12:19:22+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "11.0.10", + "version": "9.2.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "1a800a7446add2d79cc6b3c01c45381810367d76" + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1a800a7446add2d79cc6b3c01c45381810367d76", - "reference": "1a800a7446add2d79cc6b3c01c45381810367d76", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.2.3" + "nikic/php-parser": "^4.18 || ^5.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" }, "require-dev": { - "phpunit/phpunit": "^11.5.2" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -9659,7 +5675,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0.x-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -9688,52 +5704,40 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/show" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" }, "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/phpunit/php-code-coverage", - "type": "tidelift" } ], - "time": "2025-06-18T08:56:18+00:00" + "time": "2024-03-02T06:37:42+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -9760,8 +5764,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -9769,28 +5772,28 @@ "type": "github" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", - "version": "5.0.1", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcntl": "*" @@ -9798,7 +5801,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -9824,8 +5827,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, "funding": [ { @@ -9833,32 +5835,32 @@ "type": "github" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2020-09-28T05:58:55+00:00" }, { "name": "phpunit/php-text-template", - "version": "4.0.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -9884,8 +5886,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { @@ -9893,32 +5894,32 @@ "type": "github" } ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { "name": "phpunit/php-timer", - "version": "7.0.1", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -9944,8 +5945,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { @@ -9953,52 +5953,54 @@ "type": "github" } ], - "time": "2024-07-03T05:09:35+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "11.5.15", + "version": "9.6.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c" + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", "shasum": "" }, "require": { + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.0", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.9", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.1", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.0", - "sebastian/exporter": "^6.3.0", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.2", - "sebastian/version": "^5.0.2", - "staabm/side-effects-detector": "^1.0.5" + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.28", + "phpunit/php-file-iterator": "^3.0.5", + "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", + "sebastian/version": "^3.0.2" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "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" @@ -10006,7 +6008,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -10038,7 +6040,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.15" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" }, "funding": [ { @@ -10054,76 +6056,25 @@ "type": "tidelift" } ], - "time": "2025-03-23T16:02:11+00:00" - }, - { - "name": "psr/simple-cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" - }, - "time": "2021-10-29T13:26:27+00:00" + "time": "2024-04-05T04:35:58+00:00" }, { "name": "rector/rector", - "version": "2.1.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "d513dea45a94394b660e15c155d1fa27826f8e30" + "reference": "556509e2dcf527369892b7d411379c4a02f31859" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/d513dea45a94394b660e15c155d1fa27826f8e30", - "reference": "d513dea45a94394b660e15c155d1fa27826f8e30", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/556509e2dcf527369892b7d411379c4a02f31859", + "reference": "556509e2dcf527369892b7d411379c4a02f31859", "shasum": "" }, "require": { - "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.17" + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.11" }, "conflict": { "rector/rector-doctrine": "*", @@ -10148,7 +6099,6 @@ "MIT" ], "description": "Instant Upgrade and Automated Refactoring of any PHP code", - "homepage": "https://getrector.com/", "keywords": [ "automation", "dev", @@ -10157,7 +6107,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.1.0" + "source": "https://github.com/rectorphp/rector/tree/1.1.0" }, "funding": [ { @@ -10165,32 +6115,32 @@ "type": "github" } ], - "time": "2025-06-24T20:26:57+00:00" + "time": "2024-05-18T09:40:27+00:00" }, { "name": "sebastian/cli-parser", - "version": "3.0.2", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -10213,8 +6163,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -10222,32 +6171,32 @@ "type": "github" } ], - "time": "2024-07-03T04:41:36+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", - "version": "3.0.3", + "version": "1.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -10270,8 +6219,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" }, "funding": [ { @@ -10279,32 +6227,32 @@ "type": "github" } ], - "time": "2025-03-19T07:56:08+00:00" + "time": "2020-10-26T13:08:54+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -10326,8 +6274,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -10335,39 +6282,34 @@ "type": "github" } ], - "time": "2024-07-03T04:45:54+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "6.3.1", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^11.4" - }, - "suggest": { - "ext-bcmath": "For comparing BcMath\\Number objects" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -10406,8 +6348,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -10415,33 +6356,33 @@ "type": "github" } ], - "time": "2025-03-07T06:57:01+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", - "version": "4.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -10464,8 +6405,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -10473,33 +6413,33 @@ "type": "github" } ], - "time": "2024-07-03T04:49:50+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "6.0.2", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0", + "phpunit/phpunit": "^9.3", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -10531,8 +6471,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -10540,27 +6479,27 @@ "type": "github" } ], - "time": "2024-07-03T04:53:05+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", - "version": "7.2.1", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -10568,7 +6507,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -10587,7 +6526,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", + "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -10595,55 +6534,42 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "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/environment", - "type": "tidelift" } ], - "time": "2025-05-21T11:55:47+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "6.3.0", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -10685,8 +6611,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -10694,35 +6619,38 @@ "type": "github" } ], - "time": "2024-12-05T09:17:50+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "7.0.2", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -10741,14 +6669,13 @@ } ], "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -10756,33 +6683,33 @@ "type": "github" } ], - "time": "2024-07-03T04:57:36+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", - "version": "3.0.1", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -10805,8 +6732,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -10814,34 +6740,34 @@ "type": "github" } ], - "time": "2024-07-03T04:58:38+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "6.0.1", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -10863,8 +6789,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { @@ -10872,32 +6797,32 @@ "type": "github" } ], - "time": "2024-07-03T05:00:13+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "4.0.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -10919,8 +6844,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { @@ -10928,32 +6852,32 @@ "type": "github" } ], - "time": "2024-07-03T05:01:32+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "6.0.2", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -10983,8 +6907,7 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -10992,32 +6915,86 @@ "type": "github" } ], - "time": "2024-07-03T05:10:34+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { - "name": "sebastian/type", - "version": "5.1.2", + "name": "sebastian/resource-operations", + "version": "3.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" } }, "autoload": { @@ -11040,8 +7017,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -11049,29 +7025,29 @@ "type": "github" } ], - "time": "2025-03-18T13:35:50+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "5.0.2", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -11094,8 +7070,7 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, "funding": [ { @@ -11103,36 +7078,36 @@ "type": "github" } ], - "time": "2024-10-09T05:16:32+00:00" + "time": "2020-09-28T06:39:44+00:00" }, { "name": "slevomat/coding-standard", - "version": "8.19.1", + "version": "8.15.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "458d665acd49009efebd7e0cb385d71ae9ac3220" + "reference": "7d1d957421618a3803b593ec31ace470177d7817" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/458d665acd49009efebd7e0cb385d71ae9ac3220", - "reference": "458d665acd49009efebd7e0cb385d71ae9ac3220", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/7d1d957421618a3803b593ec31ace470177d7817", + "reference": "7d1d957421618a3803b593ec31ace470177d7817", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", - "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^2.1.0", - "squizlabs/php_codesniffer": "^3.13.0" + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.23.1", + "squizlabs/php_codesniffer": "^3.9.0" }, "require-dev": { - "phing/phing": "3.0.1", - "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.17", - "phpstan/phpstan-deprecation-rules": "2.0.3", - "phpstan/phpstan-phpunit": "2.0.6", - "phpstan/phpstan-strict-rules": "2.0.4", - "phpunit/phpunit": "9.6.8|10.5.45|11.4.4|11.5.21|12.1.3" + "phing/phing": "2.17.4", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpstan/phpstan": "1.10.60", + "phpstan/phpstan-deprecation-rules": "1.1.4", + "phpstan/phpstan-phpunit": "1.3.16", + "phpstan/phpstan-strict-rules": "1.5.2", + "phpunit/phpunit": "8.5.21|9.6.8|10.5.11" }, "type": "phpcodesniffer-standard", "extra": { @@ -11156,7 +7131,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.19.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.15.0" }, "funding": [ { @@ -11168,20 +7143,20 @@ "type": "tidelift" } ], - "time": "2025-06-09T17:53:57+00:00" + "time": "2024-03-09T15:20:58+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.13.2", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "5b5e3821314f947dd040c70f7992a64eac89025c" + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c", - "reference": "5b5e3821314f947dd040c70f7992a64eac89025c", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", "shasum": "" }, "require": { @@ -11246,78 +7221,22 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" } ], - "time": "2025-06-17T22:17:01+00:00" - }, - { - "name": "staabm/side-effects-detector", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.6", - "phpunit/phpunit": "^9.6.21", - "symfony/var-dumper": "^5.4.43", - "tomasvotruba/type-coverage": "1.0.0", - "tomasvotruba/unused-public": "1.0.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A static analysis tool to detect side effects in PHP code", - "keywords": [ - "static analysis" - ], - "support": { - "issues": "https://github.com/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" - }, - "funding": [ - { - "url": "https://github.com/staabm", - "type": "github" - } - ], - "time": "2024-10-20T05:08:20+00:00" + "time": "2024-05-22T21:24:41+00:00" }, { "name": "symfony/browser-kit", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "5384291845e74fd7d54f3d925c4a86ce12336593" + "reference": "9c13742e3175b5815e272b981876ae329bec2040" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/5384291845e74fd7d54f3d925c4a86ce12336593", - "reference": "5384291845e74fd7d54f3d925c4a86ce12336593", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/9c13742e3175b5815e272b981876ae329bec2040", + "reference": "9c13742e3175b5815e272b981876ae329bec2040", "shasum": "" }, "require": { @@ -11356,7 +7275,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.3.0" + "source": "https://github.com/symfony/browser-kit/tree/v7.1.1" }, "funding": [ { @@ -11372,20 +7291,20 @@ "type": "tidelift" } ], - "time": "2025-03-05T10:15:41+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/css-selector", - "version": "v7.3.0", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", "shasum": "" }, "require": { @@ -11421,7 +7340,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.3.0" + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" }, "funding": [ { @@ -11437,20 +7356,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.3.1", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9" + "reference": "01ce8174447f1f1dd33a5854b01beef79061d9fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/01ce8174447f1f1dd33a5854b01beef79061d9fa", + "reference": "01ce8174447f1f1dd33a5854b01beef79061d9fa", "shasum": "" }, "require": { @@ -11488,7 +7407,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.3.1" + "source": "https://github.com/symfony/dom-crawler/tree/v7.1.1" }, "funding": [ { @@ -11504,25 +7423,25 @@ "type": "tidelift" } ], - "time": "2025-06-15T10:07:06+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.64.0", + "version": "v1.60.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a" + "reference": "c305a02a22974670f359d4274c9431e1a191f559" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c86da84640b0586e92aee2b276ee3638ef2f425a", - "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c305a02a22974670f359d4274c9431e1a191f559", + "reference": "c305a02a22974670f359d4274c9431e1a191f559", "shasum": "" }, "require": { "doctrine/inflector": "^2.0", - "nikic/php-parser": "^5.0", + "nikic/php-parser": "^4.18|^5.0", "php": ">=8.1", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -11545,7 +7464,6 @@ "symfony/http-client": "^6.4|^7.0", "symfony/phpunit-bridge": "^6.4.1|^7.0", "symfony/security-core": "^6.4|^7.0", - "symfony/security-http": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", "twig/twig": "^3.0|^4.x-dev" }, @@ -11581,7 +7499,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.64.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.60.0" }, "funding": [ { @@ -11597,20 +7515,102 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:08+00:00" + "time": "2024-06-10T06:03:18+00:00" }, { - "name": "symfony/process", - "version": "v7.3.0", + "name": "symfony/phpunit-bridge", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "3e1cb8c4dee341cfe96ae9fe29b1acda52a6bb16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3e1cb8c4dee341cfe96ae9fe29b1acda52a6bb16", + "reference": "3e1cb8c4dee341cfe96ae9fe29b1acda52a6bb16", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.1" + }, + "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": "2024-06-04T06:50:37+00:00" + }, + { + "name": "symfony/process", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", "shasum": "" }, "require": { @@ -11642,7 +7642,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.3.0" + "source": "https://github.com/symfony/process/tree/v7.1.1" }, "funding": [ { @@ -11658,105 +7658,20 @@ "type": "tidelift" } ], - "time": "2025-04-17T09:11:12+00:00" - }, - { - "name": "symfony/web-profiler-bundle", - "version": "v7.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "47c994d8f08817122ffb48bf2ea4fb97b7e00d51" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/47c994d8f08817122ffb48bf2ea4fb97b7e00d51", - "reference": "47c994d8f08817122ffb48bf2ea4fb97b7e00d51", - "shasum": "" - }, - "require": { - "composer-runtime-api": ">=2.1", - "php": ">=8.2", - "symfony/config": "^7.3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", - "symfony/twig-bundle": "^6.4|^7.0", - "twig/twig": "^3.12" - }, - "conflict": { - "symfony/form": "<6.4", - "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4", - "symfony/serializer": "<7.2", - "symfony/workflow": "<7.3" - }, - "require-dev": { - "symfony/browser-kit": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" - }, - "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 development tool that gives detailed information about the execution of any request", - "homepage": "https://symfony.com", - "keywords": [ - "dev" - ], - "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.1" - }, - "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": "2025-06-05T09:30:41+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symplify/config-transformer", - "version": "12.4.0", + "version": "12.3.4", "source": { "type": "git", "url": "https://github.com/symplify/config-transformer.git", - "reference": "d9a0f2d6c6f80cb0672544ed5273d5e701a3e092" + "reference": "9fb4f5acf7ec4261ba426bee9eb7aeed174eb600" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/config-transformer/zipball/d9a0f2d6c6f80cb0672544ed5273d5e701a3e092", - "reference": "d9a0f2d6c6f80cb0672544ed5273d5e701a3e092", + "url": "https://api.github.com/repos/symplify/config-transformer/zipball/9fb4f5acf7ec4261ba426bee9eb7aeed174eb600", + "reference": "9fb4f5acf7ec4261ba426bee9eb7aeed174eb600", "shasum": "" }, "require": { @@ -11773,7 +7688,7 @@ "description": "Prefixed version of Symfony YAML/XML to PHP/YAML config converter", "support": { "issues": "https://github.com/symplify/config-transformer/issues", - "source": "https://github.com/symplify/config-transformer/tree/12.4.0" + "source": "https://github.com/symplify/config-transformer/tree/12.3.4" }, "funding": [ { @@ -11785,20 +7700,20 @@ "type": "github" } ], - "time": "2025-01-22T23:08:18+00:00" + "time": "2024-01-15T21:58:26+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "12.5.20", + "version": "12.2.1", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4" + "reference": "095fe591b2e51fd84edd21b8c9be74402eadc50e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", - "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/095fe591b2e51fd84edd21b8c9be74402eadc50e", + "reference": "095fe591b2e51fd84edd21b8c9be74402eadc50e", "shasum": "" }, "require": { @@ -11834,7 +7749,7 @@ ], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.20" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.2.1" }, "funding": [ { @@ -11846,66 +7761,7 @@ "type": "github" } ], - "time": "2025-05-30T11:42:07+00:00" - }, - { - "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.5", - "source": { - "type": "git", - "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "cf6fb197b676ba716837c886baca842e4db29005" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", - "reference": "cf6fb197b676ba716837c886baca842e4db29005", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18.0 || ^5.0.0", - "php": "^8.1.0", - "phpdocumentor/reflection-docblock": "^5.3.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", - "symfony/finder": "^6.4.0 || ^7.0.0" - }, - "require-dev": { - "laravel/pint": "^1.13.7", - "phpstan/phpstan": "^1.10.52" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPUnit\\Architecture\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ni Shi", - "email": "futik0ma011@gmail.com" - }, - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Methods for testing application architecture", - "keywords": [ - "architecture", - "phpunit", - "stucture", - "test", - "testing" - ], - "support": { - "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" - }, - "time": "2025-04-20T20:23:40+00:00" + "time": "2024-06-02T01:25:21+00:00" }, { "name": "theseer/tokenizer", @@ -11960,17 +7816,17 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.4", + "php": ">=8.3", "ext-ctype": "*", "ext-iconv": "*" }, - "platform-dev": {}, + "platform-dev": [], "platform-overrides": { - "php": "8.4" + "php": "8.3" }, "plugin-api-version": "2.6.0" } diff --git a/config/bundles.php b/config/bundles.php index c0a4eeb..d43fe1e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -1,18 +1,10 @@ [ @@ -30,31 +22,4 @@ return [ TwigBundle::class => [ 'all' => true, ], - DoctrineFixturesBundle::class => [ - 'dev' => true, - 'test' => true, - ], - WebProfilerBundle::class => [ - 'dev' => true, - 'test' => true, - ], - SecurityBundle::class => [ - 'all' => true, - ], - NelmioCorsBundle::class => [ - 'all' => true, - ], - LiipTestFixturesBundle::class => [ - 'dev' => true, - 'test' => true, - ], - TwigExtraBundle::class => [ - 'all' => true, - ], - MonologBundle::class => [ - 'all' => true, - ], - ApiPlatformBundle::class => [ - 'all' => true, - ], ]; diff --git a/config/packages/api_platform.php b/config/packages/api_platform.php deleted file mode 100644 index d19bc6e..0000000 --- a/config/packages/api_platform.php +++ /dev/null @@ -1,20 +0,0 @@ -extension('api_platform', [ - 'title' => 'Hello API Platform', - 'version' => '1.0.0', - 'defaults' => [ - 'stateless' => true, - 'cache_headers' => [ - 'vary' => [ - 'Content-Type', - 'Authorization', - 'Origin', - ], - ], - ], - ]); -}; diff --git a/config/packages/asset_mapper.php b/config/packages/asset_mapper.php deleted file mode 100644 index aa061ef..0000000 --- a/config/packages/asset_mapper.php +++ /dev/null @@ -1,19 +0,0 @@ -assetMapper() - ->path('assets/', true) - ->missingImportMode('strict') - ->importmapPolyfill(false) - ; - if ($containerConfigurator->env() === 'prod') { - $frameworkConfig->assetMapper() - ->missingImportMode('warn'); - } -}; diff --git a/config/packages/csrf.php b/config/packages/csrf.php deleted file mode 100644 index 82d6a65..0000000 --- a/config/packages/csrf.php +++ /dev/null @@ -1,20 +0,0 @@ -extension('framework', [ - 'form' => [ - 'csrf_protection' => [ - 'token_id' => 'submit', - ], - ], - 'csrf_protection' => [ - 'stateless_token_ids' => [ - 'submit', - 'authenticate', - 'logout', - ], - ], - ]); -}; diff --git a/config/packages/monolog.php b/config/packages/monolog.php deleted file mode 100644 index a4075ba..0000000 --- a/config/packages/monolog.php +++ /dev/null @@ -1,95 +0,0 @@ -extension('monolog', [ - 'channels' => [ - 'deprecation', - ], - ]); - if ($containerConfigurator->env() === 'dev') { - $containerConfigurator->extension('monolog', [ - 'handlers' => [ - 'main' => [ - 'type' => 'stream', - 'path' => '%kernel.logs_dir%/%kernel.environment%.log', - 'level' => 'debug', - 'channels' => [ - '!event', - ], - ], - 'console' => [ - 'type' => 'console', - 'process_psr_3_messages' => false, - 'channels' => [ - '!event', - '!doctrine', - '!console', - ], - ], - ], - ]); - } - if ($containerConfigurator->env() === 'test') { - $containerConfigurator->extension('monolog', [ - 'handlers' => [ - 'main' => [ - 'type' => 'fingers_crossed', - 'action_level' => 'error', - 'handler' => 'nested', - 'excluded_http_codes' => [ - 404, - 405, - ], - 'channels' => [ - '!event', - ], - ], - 'nested' => [ - 'type' => 'stream', - 'path' => '%kernel.logs_dir%/%kernel.environment%.log', - 'level' => 'debug', - ], - ], - ]); - } - if ($containerConfigurator->env() === 'prod') { - $containerConfigurator->extension('monolog', [ - 'handlers' => [ - 'main' => [ - 'type' => 'fingers_crossed', - 'action_level' => 'error', - 'handler' => 'nested', - 'excluded_http_codes' => [ - 404, - 405, - ], - 'buffer_size' => 50, - ], - 'nested' => [ - 'type' => 'stream', - 'path' => 'php://stderr', - 'level' => 'debug', - 'formatter' => 'monolog.formatter.json', - ], - 'console' => [ - 'type' => 'console', - 'process_psr_3_messages' => false, - 'channels' => [ - '!event', - '!doctrine', - ], - ], - 'deprecation' => [ - 'type' => 'stream', - 'channels' => [ - 'deprecation', - ], - 'path' => 'php://stderr', - 'formatter' => 'monolog.formatter.json', - ], - ], - ]); - } -}; diff --git a/config/packages/nelmio_cors.php b/config/packages/nelmio_cors.php deleted file mode 100644 index 7c4ad55..0000000 --- a/config/packages/nelmio_cors.php +++ /dev/null @@ -1,33 +0,0 @@ -extension('nelmio_cors', [ - 'defaults' => [ - 'origin_regex' => true, - 'allow_origin' => [ - '%env(CORS_ALLOW_ORIGIN)%', - ], - 'allow_methods' => [ - 'GET', - 'OPTIONS', - 'POST', - 'PUT', - 'PATCH', - 'DELETE', - ], - 'allow_headers' => [ - 'Content-Type', - 'Authorization', - ], - 'expose_headers' => [ - 'Link', - ], - 'max_age' => 3600, - ], - 'paths' => [ - '^/' => null, - ], - ]); -}; diff --git a/config/packages/property_info.php b/config/packages/property_info.php deleted file mode 100644 index 9213243..0000000 --- a/config/packages/property_info.php +++ /dev/null @@ -1,11 +0,0 @@ -extension('framework', [ - 'property_info' => [ - 'with_constructor_extractor' => true, - ], - ]); -}; diff --git a/config/packages/security.php b/config/packages/security.php deleted file mode 100644 index a022682..0000000 --- a/config/packages/security.php +++ /dev/null @@ -1,40 +0,0 @@ -extension('security', [ - 'password_hashers' => [ - PasswordAuthenticatedUserInterface::class => 'auto', - ], - 'providers' => [ - 'users_in_memory' => [ - 'memory' => null, - ], - ], - 'firewalls' => [ - 'dev' => [ - 'pattern' => '^/(_(profiler|wdt)|css|images|js)/', - 'security' => false, - ], - 'main' => [ - 'lazy' => true, - 'provider' => 'users_in_memory', - ], - ], - 'access_control' => null, - ]); - if ($containerConfigurator->env() === 'test') { - $containerConfigurator->extension('security', [ - 'password_hashers' => [ - PasswordAuthenticatedUserInterface::class => [ - 'algorithm' => 'auto', - 'cost' => 4, - 'time_cost' => 3, - 'memory_cost' => 10, - ], - ], - ]); - } -}; diff --git a/config/packages/twig.php b/config/packages/twig.php index 06be512..23db999 100644 --- a/config/packages/twig.php +++ b/config/packages/twig.php @@ -1,16 +1,14 @@ extension('twig', [ + 'file_name_pattern' => '*.twig', + ]); if ($containerConfigurator->env() === 'test') { - $twig->strictVariables(true); + $containerConfigurator->extension('twig', [ + 'strict_variables' => true, + ]); } - $twig->formThemes(['bootstrap_5_layout.html.twig']); - $twig->fileNamePattern('*.twig'); - $twig->global('favicon', '@App\Service\Favicon'); }; diff --git a/config/packages/web_profiler.php b/config/packages/web_profiler.php deleted file mode 100644 index 28614cc..0000000 --- a/config/packages/web_profiler.php +++ /dev/null @@ -1,29 +0,0 @@ -env() === 'dev') { - $containerConfigurator->extension('web_profiler', [ - 'toolbar' => true, - 'intercept_redirects' => false, - ]); - $containerConfigurator->extension('framework', [ - 'profiler' => [ - 'only_exceptions' => false, - 'collect_serializer_data' => true, - ], - ]); - } - if ($containerConfigurator->env() === 'test') { - $containerConfigurator->extension('web_profiler', [ - 'toolbar' => false, - 'intercept_redirects' => false, - ]); - $containerConfigurator->extension('framework', [ - 'profiler' => [ - 'collect' => false, - ], - ]); - } -}; diff --git a/config/routes/api_platform.php b/config/routes/api_platform.php deleted file mode 100644 index 7d9d7d7..0000000 --- a/config/routes/api_platform.php +++ /dev/null @@ -1,8 +0,0 @@ -import('.', 'api_platform') - ->prefix('/api'); -}; diff --git a/config/routes/security.php b/config/routes/security.php deleted file mode 100644 index a19b2c1..0000000 --- a/config/routes/security.php +++ /dev/null @@ -1,7 +0,0 @@ -import('security.route_loader.logout', 'service'); -}; diff --git a/config/routes/web_profiler.php b/config/routes/web_profiler.php deleted file mode 100644 index 6356a1f..0000000 --- a/config/routes/web_profiler.php +++ /dev/null @@ -1,12 +0,0 @@ -env() === 'dev') { - $routingConfigurator->import('@WebProfilerBundle/Resources/config/routing/wdt.xml') - ->prefix('/_wdt'); - $routingConfigurator->import('@WebProfilerBundle/Resources/config/routing/profiler.xml') - ->prefix('/_profiler'); - } -}; diff --git a/deploy/Dockerfile b/deploy/Dockerfile new file mode 100644 index 0000000..47bc55b --- /dev/null +++ b/deploy/Dockerfile @@ -0,0 +1,2 @@ +FROM git.php.fail/lubiana/container/php:8.3 as phpbuild + diff --git a/deploy/etc/php83/php-fpm.d/www.conf b/deploy/etc/php83/php-fpm.d/www.conf new file mode 100644 index 0000000..113b8c2 --- /dev/null +++ b/deploy/etc/php83/php-fpm.d/www.conf @@ -0,0 +1,10 @@ +[www] + +user = nobody +group = nobody +listen = 9001 +pm = dynamic +pm.max_children = 5 +pm.start_servers = 2 +pm.min_spare_servers = 1 +pm.max_spare_servers = 3 \ No newline at end of file diff --git a/deploy/etc/php84/php-fpm.d/www.conf b/deploy/etc/php84/php-fpm.d/www.conf deleted file mode 100644 index e5a895d..0000000 --- a/deploy/etc/php84/php-fpm.d/www.conf +++ /dev/null @@ -1,13 +0,0 @@ -[www] - -user = root -group = root -listen = 9001 -pm = dynamic -pm.max_children = 5 -pm.start_servers = 2 -pm.min_spare_servers = 1 -pm.max_spare_servers = 3 -env[APP_ENV]=$APP_ENV -env[APP_SECRET]=$APP_SECRET -catch_workers_output = yes diff --git a/deploy/install.sh b/deploy/install.sh new file mode 100755 index 0000000..d4b64b7 --- /dev/null +++ b/deploy/install.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env sh + +if [ ! -d "var" ]; then + mkdir var +fi +podman pod stop futtern +podman pod rm futtern + +podman pod create \ + --label "io.containers.autoupdate=registry" \ + --name futtern \ + -p 8087:8087 + +podman run -d \ + --pod futtern \ + --name futtern-php \ + --volume $(pwd)/etc/php83/php-fpm.d/www.conf:/etc/php83/php-fpm.d/www.conf \ + --volume $(pwd)/futtern-app:/var/www/html \ + --volume $(pwd)/var:/var/www/html/var \ + --env 'APP_ENV=prod' \ + git.php.fail/lubiana/container/php:8.3-fpm + +podman run -d \ + --pod futtern \ + --name futtern-caddy \ + --volume $(pwd)/etc/caddy/Caddyfile:/etc/caddy/Caddyfile \ + --volume $(pwd)/futtern-app:/var/www/html \ + --volume caddy_data:/data \ + docker.io/caddy/caddy:alpine + +echo 'yes' | podman exec -it futtern-php /var/www/html/bin/console doctrine:migrations:migrate diff --git a/deploy/local-deploy.sh b/deploy/local-deploy.sh deleted file mode 100755 index 32536fe..0000000 --- a/deploy/local-deploy.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh - -export HOMEDIR='/home/c3h-futtern/' - -. ./deploy/prepare-deploy.sh -ssh leitstelle-futtern 'systemctl --user stop pod-futtern' -ssh leitstelle-futtern "cp ${HOMEDIR}/futtern/app/var/data.db ${HOMEDIR}/backup/data.db-$(date +\"%Y%m%d%H%M%S\")" -ssh leitstelle-futtern "find ${HOMEDIR}/backup/ -type f | sort | head -n -10 | xargs rm -f" -rsync -avz --delete deploy/ leitstelle-futtern:futtern --exclude=var -ssh leitstelle-futtern '/home/c3h-futtern/futtern/update.sh' \ No newline at end of file diff --git a/deploy/prepare-deploy.sh b/deploy/prepare-deploy.sh old mode 100755 new mode 100644 index b57c20c..c0ad1ed --- a/deploy/prepare-deploy.sh +++ b/deploy/prepare-deploy.sh @@ -1,6 +1,6 @@ #!/usr/bin/env sh -TARGETDIR='deploy/app' +TARGETDIR='futtern-app' if [ -d $TARGETDIR ]; then rm -rf $TARGETDIR @@ -8,15 +8,23 @@ fi mkdir $TARGETDIR cd $TARGETDIR || return -pathsToCopy="assets public bin config migrations src templates composer.json composer.lock symfony.lock .env importmap.php" +pathsToCopy="public bin config migrations src templates composer.json composer.lock symfony.lock .env etc" for path in $pathsToCopy do cp -r ../../"$path" ./ done +rm ./bin/phpunit APP_ENV=prod composer install --no-dev -a -rm -rf ./var/cache +mkdir -p ~/.ssh/ +# Print the SSH key, replacing newline characters with actual new lines +echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa +# Set appropriate permissions for the SSH key +chmod 600 ~/.ssh/id_rsa +# Add the remote host's key to the known_hosts file to avoid authenticity confirmation +ssh-keyscan -H $HOST >> ~/.ssh/known_hosts +# SCP files to the remote host +rsync -avz --delete public/ ${USERNAME}@${HOST}:${TARGETDIR} -cd - diff --git a/deploy/systemd/container-futtern-caddy.service b/deploy/systemd/container-futtern-caddy.service deleted file mode 100644 index 1067128..0000000 --- a/deploy/systemd/container-futtern-caddy.service +++ /dev/null @@ -1,43 +0,0 @@ -# container-futtern-caddy.service -# autogenerated by Podman 4.3.1 -# Sun Jun 23 05:33:51 UTC 2024 - -[Unit] -Description=Podman container-futtern-caddy.service -Documentation=man:podman-generate-systemd(1) -Wants=network-online.target -After=network-online.target -RequiresMountsFor=%t/containers -BindsTo=pod-futtern.service -After=pod-futtern.service - -[Service] -Environment=PODMAN_SYSTEMD_UNIT=%n -Restart=on-failure -TimeoutStopSec=70 -ExecStartPre=/bin/rm \ - -f %t/%n.ctr-id -ExecStart=/usr/bin/podman run \ - --cidfile=%t/%n.ctr-id \ - --cgroups=no-conmon \ - --rm \ - --pod-id-file %t/pod-futtern.pod-id \ - --sdnotify=conmon \ - --replace \ - -d \ - --name futtern-caddy \ - --volume %h/futtern/etc/caddy/Caddyfile:/etc/caddy/Caddyfile \ - --volume %h/futtern/app:/var/www/html \ - --volume caddy_data:/data docker.io/caddy/caddy:alpine -ExecStop=/usr/bin/podman stop \ - --ignore -t 10 \ - --cidfile=%t/%n.ctr-id -ExecStopPost=/usr/bin/podman rm \ - -f \ - --ignore -t 10 \ - --cidfile=%t/%n.ctr-id -Type=notify -NotifyAccess=all - -[Install] -WantedBy=default.target diff --git a/deploy/systemd/container-futtern-php.service b/deploy/systemd/container-futtern-php.service deleted file mode 100644 index 8701c04..0000000 --- a/deploy/systemd/container-futtern-php.service +++ /dev/null @@ -1,46 +0,0 @@ -# container-futtern-php.service -# autogenerated by Podman 4.3.1 -# Sun Jun 23 05:33:51 UTC 2024 - -[Unit] -Description=Podman container-futtern-php.service -Documentation=man:podman-generate-systemd(1) -Wants=network-online.target -After=network-online.target -RequiresMountsFor=%t/containers -BindsTo=pod-futtern.service -After=pod-futtern.service - -[Service] -Environment=PODMAN_SYSTEMD_UNIT=%n -Restart=on-failure -TimeoutStopSec=70 -ExecStartPre=/bin/rm \ - -f %t/%n.ctr-id -ExecStart=/usr/bin/podman run \ - --cidfile=%t/%n.ctr-id \ - --cgroups=no-conmon \ - --rm \ - --pod-id-file %t/pod-futtern.pod-id \ - --sdnotify=conmon \ - --replace \ - -d \ - --name futtern-php \ - --volume %h/futtern/etc/php84/php-fpm.d/www.conf:/etc/php84/php-fpm.d/www.conf \ - --volume %h/futtern/app:/var/www/html \ - --volume %h/futtern/app/var:/var/www/html/var \ - --env APP_ENV=prod \ - --env APP_SECRET=UwUtHiSisNotSecurePlZcHanGeMe \ - git.php.fail/lubiana/container/php:8.4-fpm -ExecStop=/usr/bin/podman stop \ - --ignore -t 10 \ - --cidfile=%t/%n.ctr-id -ExecStopPost=/usr/bin/podman rm \ - -f \ - --ignore -t 10 \ - --cidfile=%t/%n.ctr-id -Type=notify -NotifyAccess=all - -[Install] -WantedBy=default.target diff --git a/deploy/systemd/pod-futtern.service b/deploy/systemd/pod-futtern.service deleted file mode 100644 index 10a8fb0..0000000 --- a/deploy/systemd/pod-futtern.service +++ /dev/null @@ -1,42 +0,0 @@ -# pod-futtern.service -# autogenerated by Podman 4.3.1 -# Sun Jun 23 05:33:51 UTC 2024 - -[Unit] -Description=Podman pod-futtern.service -Documentation=man:podman-generate-systemd(1) -Wants=network-online.target -After=network-online.target -RequiresMountsFor=/run/user/%U/containers -Wants=container-futtern-caddy.service container-futtern-php.service -Before=container-futtern-caddy.service container-futtern-php.service - -[Service] -Environment=PODMAN_SYSTEMD_UNIT=%n -Restart=on-failure -TimeoutStopSec=70 -ExecStartPre=/bin/rm \ - -f %t/pod-futtern.pid %t/pod-futtern.pod-id -ExecStartPre=/usr/bin/podman pod create \ - --infra-conmon-pidfile %t/pod-futtern.pid \ - --pod-id-file %t/pod-futtern.pod-id \ - --exit-policy=stop \ - --label io.containers.autoupdate=registry \ - --name futtern \ - -p 8087:8087 \ - --replace -ExecStart=/usr/bin/podman pod start \ - --pod-id-file %t/pod-futtern.pod-id -ExecStop=/usr/bin/podman pod stop \ - --ignore \ - --pod-id-file %t/pod-futtern.pod-id \ - -t 10 -ExecStopPost=/usr/bin/podman pod rm \ - --ignore \ - -f \ - --pod-id-file %t/pod-futtern.pod-id -PIDFile=%t/pod-futtern.pid -Type=forking - -[Install] -WantedBy=default.target diff --git a/deploy/update.sh b/deploy/update.sh deleted file mode 100755 index 59ea373..0000000 --- a/deploy/update.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env sh - -systemctl --user stop pod-futtern -systemctl --user start pod-futtern -sleep 2 -podman exec -it futtern-php /var/www/html/bin/console cache:clear -podman exec -it futtern-php /var/www/html/bin/console cache:warmup -podman exec -it futtern-php /var/www/html/bin/console asset-map:compile - - -echo 'yes' | podman exec -it futtern-php /var/www/html/bin/console doctrine:migrations:migrate diff --git a/ecs.php b/ecs.php index c26fa01..4815bcb 100644 --- a/ecs.php +++ b/ecs.php @@ -13,7 +13,5 @@ return ECSConfig::configure() __DIR__ . '/tests', ]) ->withRootFiles() - ->withRules([ - FinalClassFixer::class, - ]) + ->withRules([FinalClassFixer::class]) ->withSets([LubiSetList::ECS]); diff --git a/importmap.php b/importmap.php deleted file mode 100644 index 3f89e51..0000000 --- a/importmap.php +++ /dev/null @@ -1,32 +0,0 @@ - [ - 'path' => './assets/app.js', - 'entrypoint' => true, - ], - 'bootstrap' => [ - 'version' => '5.3.7', - ], - '@popperjs/core' => [ - 'version' => '2.11.8', - ], - 'bootstrap/dist/css/bootstrap.min.css' => [ - 'version' => '5.3.7', - 'type' => 'css', - ], - 'htmx.org' => [ - 'version' => '2.0.5', - ], -]; diff --git a/migrations/Version20240626175246.php b/migrations/Version20240626175246.php deleted file mode 100644 index 7c43d78..0000000 --- a/migrations/Version20240626175246.php +++ /dev/null @@ -1,73 +0,0 @@ -addSql('CREATE TABLE menu_item (id BLOB NOT NULL, name VARCHAR(255) NOT NULL, food_vendor_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_D754D5506EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('CREATE INDEX IDX_D754D5506EF983E8 ON menu_item (food_vendor_id)'); - $this->addSql('CREATE TEMPORARY TABLE __temp__food_order AS SELECT id, food_vendor_id, closed_at FROM food_order'); - $this->addSql('DROP TABLE food_order'); - $this->addSql('CREATE TABLE food_order (id BLOB NOT NULL, food_vendor_id BLOB NOT NULL, closed_at DATETIME DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_44856726EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO food_order (id, food_vendor_id, closed_at) SELECT id, food_vendor_id, closed_at FROM __temp__food_order'); - $this->addSql('DROP TABLE __temp__food_order'); - $this->addSql('CREATE INDEX IDX_44856726EF983E8 ON food_order (food_vendor_id)'); - $this->addSql('CREATE TEMPORARY TABLE __temp__food_vendor AS SELECT id, name FROM food_vendor'); - $this->addSql('DROP TABLE food_vendor'); - $this->addSql('CREATE TABLE food_vendor (id BLOB NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('INSERT INTO food_vendor (id, name) SELECT id, name FROM __temp__food_vendor'); - $this->addSql('DROP TABLE __temp__food_vendor'); - $this->addSql('CREATE TEMPORARY TABLE __temp__order_item AS SELECT id, food_order_id, name, extras FROM order_item'); - $this->addSql('DROP TABLE order_item'); - $this->addSql('CREATE TABLE order_item (id BLOB NOT NULL, food_order_id BLOB DEFAULT NULL, name VARCHAR(255) NOT NULL, extras VARCHAR(255) DEFAULT NULL, menu_item_id BLOB DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_52EA1F09A5D24A7A FOREIGN KEY (food_order_id) REFERENCES food_order (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_52EA1F099AB44FE0 FOREIGN KEY (menu_item_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO order_item (id, food_order_id, name, extras) SELECT id, food_order_id, name, extras FROM __temp__order_item'); - $this->addSql('DROP TABLE __temp__order_item'); - $this->addSql('CREATE INDEX IDX_52EA1F09A5D24A7A ON order_item (food_order_id)'); - $this->addSql('CREATE INDEX IDX_52EA1F099AB44FE0 ON order_item (menu_item_id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('DROP TABLE menu_item'); - $this->addSql('CREATE TEMPORARY TABLE __temp__food_order AS SELECT id, closed_at, food_vendor_id FROM food_order'); - $this->addSql('DROP TABLE food_order'); - $this->addSql('CREATE TABLE food_order (id BLOB NOT NULL --(DC2Type:ulid) - , closed_at DATETIME DEFAULT NULL --(DC2Type:datetime_immutable) - , food_vendor_id BLOB NOT NULL --(DC2Type:ulid) - , PRIMARY KEY(id), CONSTRAINT FK_44856726EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO food_order (id, closed_at, food_vendor_id) SELECT id, closed_at, food_vendor_id FROM __temp__food_order'); - $this->addSql('DROP TABLE __temp__food_order'); - $this->addSql('CREATE INDEX IDX_44856726EF983E8 ON food_order (food_vendor_id)'); - $this->addSql('CREATE TEMPORARY TABLE __temp__food_vendor AS SELECT id, name FROM food_vendor'); - $this->addSql('DROP TABLE food_vendor'); - $this->addSql('CREATE TABLE food_vendor (id BLOB NOT NULL --(DC2Type:ulid) - , name VARCHAR(50) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('INSERT INTO food_vendor (id, name) SELECT id, name FROM __temp__food_vendor'); - $this->addSql('DROP TABLE __temp__food_vendor'); - $this->addSql('CREATE TEMPORARY TABLE __temp__order_item AS SELECT id, name, extras, food_order_id FROM order_item'); - $this->addSql('DROP TABLE order_item'); - $this->addSql('CREATE TABLE order_item (id BLOB NOT NULL --(DC2Type:ulid) - , name VARCHAR(255) NOT NULL, extras VARCHAR(255) DEFAULT NULL, food_order_id BLOB NOT NULL --(DC2Type:ulid) - , PRIMARY KEY(id), CONSTRAINT FK_52EA1F09A5D24A7A FOREIGN KEY (food_order_id) REFERENCES food_order (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO order_item (id, name, extras, food_order_id) SELECT id, name, extras, food_order_id FROM __temp__order_item'); - $this->addSql('DROP TABLE __temp__order_item'); - $this->addSql('CREATE INDEX IDX_52EA1F09A5D24A7A ON order_item (food_order_id)'); - } -} diff --git a/migrations/Version20240626182031.php b/migrations/Version20240626182031.php deleted file mode 100644 index 8f74202..0000000 --- a/migrations/Version20240626182031.php +++ /dev/null @@ -1,43 +0,0 @@ -addSql('CREATE TEMPORARY TABLE __temp__order_item AS SELECT id, food_order_id, name, extras, menu_item_id FROM order_item'); - $this->addSql('DROP TABLE order_item'); - $this->addSql('CREATE TABLE order_item (id BLOB NOT NULL, food_order_id BLOB DEFAULT NULL, name VARCHAR(255) NOT NULL, extras VARCHAR(255) DEFAULT NULL, menu_item_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_52EA1F09A5D24A7A FOREIGN KEY (food_order_id) REFERENCES food_order (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_52EA1F099AB44FE0 FOREIGN KEY (menu_item_id) REFERENCES menu_item (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO order_item (id, food_order_id, name, extras, menu_item_id) SELECT id, food_order_id, name, extras, menu_item_id FROM __temp__order_item'); - $this->addSql('DROP TABLE __temp__order_item'); - $this->addSql('CREATE INDEX IDX_52EA1F099AB44FE0 ON order_item (menu_item_id)'); - $this->addSql('CREATE INDEX IDX_52EA1F09A5D24A7A ON order_item (food_order_id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TEMPORARY TABLE __temp__order_item AS SELECT id, name, extras, food_order_id, menu_item_id FROM order_item'); - $this->addSql('DROP TABLE order_item'); - $this->addSql('CREATE TABLE order_item (id BLOB NOT NULL, name VARCHAR(255) NOT NULL, extras VARCHAR(255) DEFAULT NULL, food_order_id BLOB DEFAULT NULL, menu_item_id BLOB DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_52EA1F09A5D24A7A FOREIGN KEY (food_order_id) REFERENCES food_order (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_52EA1F099AB44FE0 FOREIGN KEY (menu_item_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO order_item (id, name, extras, food_order_id, menu_item_id) SELECT id, name, extras, food_order_id, menu_item_id FROM __temp__order_item'); - $this->addSql('DROP TABLE __temp__order_item'); - $this->addSql('CREATE INDEX IDX_52EA1F09A5D24A7A ON order_item (food_order_id)'); - $this->addSql('CREATE INDEX IDX_52EA1F099AB44FE0 ON order_item (menu_item_id)'); - } -} diff --git a/migrations/Version20240627212849.php b/migrations/Version20240627212849.php deleted file mode 100644 index 2a5650b..0000000 --- a/migrations/Version20240627212849.php +++ /dev/null @@ -1,44 +0,0 @@ -addSql('ALTER TABLE food_order ADD COLUMN created_by VARCHAR(255) DEFAULT \'nobody\' NOT NULL'); - $this->addSql('ALTER TABLE order_item ADD COLUMN created_by VARCHAR(255) DEFAULT \'nobody\' NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TEMPORARY TABLE __temp__food_order AS SELECT id, closed_at, food_vendor_id FROM food_order'); - $this->addSql('DROP TABLE food_order'); - $this->addSql('CREATE TABLE food_order (id BLOB NOT NULL, closed_at DATETIME DEFAULT NULL, food_vendor_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_44856726EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO food_order (id, closed_at, food_vendor_id) SELECT id, closed_at, food_vendor_id FROM __temp__food_order'); - $this->addSql('DROP TABLE __temp__food_order'); - $this->addSql('CREATE INDEX IDX_44856726EF983E8 ON food_order (food_vendor_id)'); - $this->addSql('CREATE TEMPORARY TABLE __temp__order_item AS SELECT id, name, extras, food_order_id, menu_item_id FROM order_item'); - $this->addSql('DROP TABLE order_item'); - $this->addSql('CREATE TABLE order_item (id BLOB NOT NULL, name VARCHAR(255) NOT NULL, extras VARCHAR(255) DEFAULT NULL, food_order_id BLOB DEFAULT NULL, menu_item_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_52EA1F09A5D24A7A FOREIGN KEY (food_order_id) REFERENCES food_order (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_52EA1F099AB44FE0 FOREIGN KEY (menu_item_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO order_item (id, name, extras, food_order_id, menu_item_id) SELECT id, name, extras, food_order_id, menu_item_id FROM __temp__order_item'); - $this->addSql('DROP TABLE __temp__order_item'); - $this->addSql('CREATE INDEX IDX_52EA1F09A5D24A7A ON order_item (food_order_id)'); - $this->addSql('CREATE INDEX IDX_52EA1F099AB44FE0 ON order_item (menu_item_id)'); - } -} diff --git a/migrations/Version20240815151510.php b/migrations/Version20240815151510.php deleted file mode 100644 index 4c83c05..0000000 --- a/migrations/Version20240815151510.php +++ /dev/null @@ -1,36 +0,0 @@ -addSql('ALTER TABLE menu_item ADD COLUMN deleted_at DATETIME DEFAULT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TEMPORARY TABLE __temp__menu_item AS SELECT id, name, food_vendor_id FROM menu_item'); - $this->addSql('DROP TABLE menu_item'); - $this->addSql('CREATE TABLE menu_item (id BLOB NOT NULL, name VARCHAR(255) NOT NULL, food_vendor_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_D754D5506EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO menu_item (id, name, food_vendor_id) SELECT id, name, food_vendor_id FROM __temp__menu_item'); - $this->addSql('DROP TABLE __temp__menu_item'); - $this->addSql('CREATE INDEX IDX_D754D5506EF983E8 ON menu_item (food_vendor_id)'); - } -} diff --git a/migrations/Version20240816193410.php b/migrations/Version20240816193410.php deleted file mode 100644 index dbcb6e8..0000000 --- a/migrations/Version20240816193410.php +++ /dev/null @@ -1,35 +0,0 @@ -addSql('ALTER TABLE food_vendor ADD COLUMN menu_link VARCHAR(255) DEFAULT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TEMPORARY TABLE __temp__food_vendor AS SELECT name, id FROM food_vendor'); - $this->addSql('DROP TABLE food_vendor'); - $this->addSql('CREATE TABLE food_vendor (name VARCHAR(50) NOT NULL, id BLOB NOT NULL, PRIMARY KEY(id))'); - $this->addSql('INSERT INTO food_vendor (name, id) SELECT name, id FROM __temp__food_vendor'); - $this->addSql('DROP TABLE __temp__food_vendor'); - } -} diff --git a/migrations/Version20241218235101.php b/migrations/Version20241218235101.php deleted file mode 100644 index 86337fa..0000000 --- a/migrations/Version20241218235101.php +++ /dev/null @@ -1,35 +0,0 @@ -addSql('ALTER TABLE food_vendor ADD COLUMN phone VARCHAR(50) DEFAULT \'\''); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TEMPORARY TABLE __temp__food_vendor AS SELECT name, menu_link, id FROM food_vendor'); - $this->addSql('DROP TABLE food_vendor'); - $this->addSql('CREATE TABLE food_vendor (name VARCHAR(50) NOT NULL, menu_link VARCHAR(255) DEFAULT NULL, id BLOB NOT NULL, PRIMARY KEY(id))'); - $this->addSql('INSERT INTO food_vendor (name, menu_link, id) SELECT name, menu_link, id FROM __temp__food_vendor'); - $this->addSql('DROP TABLE __temp__food_vendor'); - } -} diff --git a/migrations/Version20250124234947.php b/migrations/Version20250124234947.php deleted file mode 100644 index 4c9d782..0000000 --- a/migrations/Version20250124234947.php +++ /dev/null @@ -1,42 +0,0 @@ -addSql('CREATE TEMPORARY TABLE __temp__menu_item AS SELECT id, name, food_vendor_id, deleted_at FROM menu_item'); - $this->addSql('DROP TABLE menu_item'); - $this->addSql('CREATE TABLE menu_item (id BLOB NOT NULL, name VARCHAR(255) NOT NULL, food_vendor_id BLOB NOT NULL, deleted_at DATETIME DEFAULT NULL, alias_of_id BLOB DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_D754D5506EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_D754D55061F0AFC5 FOREIGN KEY (alias_of_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO menu_item (id, name, food_vendor_id, deleted_at) SELECT id, name, food_vendor_id, deleted_at FROM __temp__menu_item'); - $this->addSql('DROP TABLE __temp__menu_item'); - $this->addSql('CREATE INDEX IDX_D754D5506EF983E8 ON menu_item (food_vendor_id)'); - $this->addSql('CREATE INDEX IDX_D754D55061F0AFC5 ON menu_item (alias_of_id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TEMPORARY TABLE __temp__menu_item AS SELECT name, deleted_at, id, food_vendor_id FROM menu_item'); - $this->addSql('DROP TABLE menu_item'); - $this->addSql('CREATE TABLE menu_item (name VARCHAR(255) NOT NULL, deleted_at DATETIME DEFAULT NULL, id BLOB NOT NULL, food_vendor_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_D754D5506EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) NOT DEFERRABLE INITIALLY IMMEDIATE)'); - $this->addSql('INSERT INTO menu_item (name, deleted_at, id, food_vendor_id) SELECT name, deleted_at, id, food_vendor_id FROM __temp__menu_item'); - $this->addSql('DROP TABLE __temp__menu_item'); - $this->addSql('CREATE INDEX IDX_D754D5506EF983E8 ON menu_item (food_vendor_id)'); - } -} diff --git a/migrations/Version20250621131822.php b/migrations/Version20250621131822.php deleted file mode 100644 index 735b90d..0000000 --- a/migrations/Version20250621131822.php +++ /dev/null @@ -1,47 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE food_vendor ADD COLUMN emojis VARCHAR(30) DEFAULT NULL - SQL); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql(<<<'SQL' - CREATE TEMPORARY TABLE __temp__food_vendor AS SELECT name, phone, menu_link, id FROM food_vendor - SQL); - $this->addSql(<<<'SQL' - DROP TABLE food_vendor - SQL); - $this->addSql(<<<'SQL' - CREATE TABLE food_vendor (name VARCHAR(50) NOT NULL, phone VARCHAR(50) DEFAULT '', menu_link VARCHAR(255) DEFAULT NULL, id BLOB NOT NULL, PRIMARY KEY(id)) - SQL); - $this->addSql(<<<'SQL' - INSERT INTO food_vendor (name, phone, menu_link, id) SELECT name, phone, menu_link, id FROM __temp__food_vendor - SQL); - $this->addSql(<<<'SQL' - DROP TABLE __temp__food_vendor - SQL); - } -} diff --git a/migrations/Version20250629160123.php b/migrations/Version20250629160123.php deleted file mode 100644 index 78542b7..0000000 --- a/migrations/Version20250629160123.php +++ /dev/null @@ -1,56 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE order_item ADD COLUMN is_paid BOOLEAN DEFAULT 0 NOT NULL - SQL); - $this->addSql(<<<'SQL' - ALTER TABLE order_item ADD COLUMN price_cents INTEGER DEFAULT 0 NOT NULL - SQL); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql(<<<'SQL' - CREATE TEMPORARY TABLE __temp__order_item AS SELECT name, extras, created_by, id, food_order_id, menu_item_id FROM order_item - SQL); - $this->addSql(<<<'SQL' - DROP TABLE order_item - SQL); - $this->addSql(<<<'SQL' - CREATE TABLE order_item (name VARCHAR(255) NOT NULL, extras VARCHAR(255) DEFAULT NULL, created_by VARCHAR(255) DEFAULT 'nobody' NOT NULL, id BLOB NOT NULL, food_order_id BLOB DEFAULT NULL, menu_item_id BLOB NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_52EA1F09A5D24A7A FOREIGN KEY (food_order_id) REFERENCES food_order (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_52EA1F099AB44FE0 FOREIGN KEY (menu_item_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE) - SQL); - $this->addSql(<<<'SQL' - INSERT INTO order_item (name, extras, created_by, id, food_order_id, menu_item_id) SELECT name, extras, created_by, id, food_order_id, menu_item_id FROM __temp__order_item - SQL); - $this->addSql(<<<'SQL' - DROP TABLE __temp__order_item - SQL); - $this->addSql(<<<'SQL' - CREATE INDEX IDX_52EA1F09A5D24A7A ON order_item (food_order_id) - SQL); - $this->addSql(<<<'SQL' - CREATE INDEX IDX_52EA1F099AB44FE0 ON order_item (menu_item_id) - SQL); - } -} diff --git a/migrations/Version20250629160639.php b/migrations/Version20250629160639.php deleted file mode 100644 index b567250..0000000 --- a/migrations/Version20250629160639.php +++ /dev/null @@ -1,53 +0,0 @@ -addSql(<<<'SQL' - ALTER TABLE menu_item ADD COLUMN price_cents INTEGER DEFAULT 0 NOT NULL - SQL); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql(<<<'SQL' - CREATE TEMPORARY TABLE __temp__menu_item AS SELECT name, deleted_at, id, food_vendor_id, alias_of_id FROM menu_item - SQL); - $this->addSql(<<<'SQL' - DROP TABLE menu_item - SQL); - $this->addSql(<<<'SQL' - CREATE TABLE menu_item (name VARCHAR(255) NOT NULL, deleted_at DATETIME DEFAULT NULL, id BLOB NOT NULL, food_vendor_id BLOB NOT NULL, alias_of_id BLOB DEFAULT NULL, PRIMARY KEY(id), CONSTRAINT FK_D754D5506EF983E8 FOREIGN KEY (food_vendor_id) REFERENCES food_vendor (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_D754D55061F0AFC5 FOREIGN KEY (alias_of_id) REFERENCES menu_item (id) NOT DEFERRABLE INITIALLY IMMEDIATE) - SQL); - $this->addSql(<<<'SQL' - INSERT INTO menu_item (name, deleted_at, id, food_vendor_id, alias_of_id) SELECT name, deleted_at, id, food_vendor_id, alias_of_id FROM __temp__menu_item - SQL); - $this->addSql(<<<'SQL' - DROP TABLE __temp__menu_item - SQL); - $this->addSql(<<<'SQL' - CREATE INDEX IDX_D754D5506EF983E8 ON menu_item (food_vendor_id) - SQL); - $this->addSql(<<<'SQL' - CREATE INDEX IDX_D754D55061F0AFC5 ON menu_item (alias_of_id) - SQL); - } -} diff --git a/php-styler.php b/php-styler.php new file mode 100644 index 0000000..f5f8632 --- /dev/null +++ b/php-styler.php @@ -0,0 +1,20 @@ + - - - - tests/Feature - tests/Unit - - - - - - src - - - src/Kernel.php - src/Service/Favicon.php - - - - - - - - - - diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 6c4bfed..3417900 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,7 +14,8 @@ - + + diff --git a/public/static/css/simple.min.css b/public/static/css/simple.min.css new file mode 100644 index 0000000..9db8fe6 --- /dev/null +++ b/public/static/css/simple.min.css @@ -0,0 +1 @@ +:root,::backdrop{--sans-font:-apple-system,BlinkMacSystemFont,"Avenir Next",Avenir,"Nimbus Sans L",Roboto,"Noto Sans","Segoe UI",Arial,Helvetica,"Helvetica Neue",sans-serif;--mono-font:Consolas,Menlo,Monaco,"Andale Mono","Ubuntu Mono",monospace;--standard-border-radius:5px;--bg:#fff;--accent-bg:#f5f7ff;--text:#212121;--text-light:#585858;--border:#898ea4;--accent:#0d47a1;--accent-hover:#1266e2;--accent-text:var(--bg);--code:#d81b60;--preformatted:#444;--marked:#fd3;--disabled:#efefef}@media (prefers-color-scheme:dark){:root,::backdrop{color-scheme:dark;--bg:#212121;--accent-bg:#2b2b2b;--text:#dcdcdc;--text-light:#ababab;--accent:#ffb300;--accent-hover:#ffe099;--accent-text:var(--bg);--code:#f06292;--preformatted:#ccc;--disabled:#111}img,video{opacity:.8}}*,:before,:after{box-sizing:border-box}textarea,select,input,progress{-webkit-appearance:none;-moz-appearance:none;appearance:none}html{font-family:var(--sans-font);scroll-behavior:smooth}body{color:var(--text);background-color:var(--bg);grid-template-columns:1fr min(45rem,90%) 1fr;margin:0;font-size:1.15rem;line-height:1.5;display:grid}body>*{grid-column:2}body>header{background-color:var(--accent-bg);border-bottom:1px solid var(--border);text-align:center;grid-column:1/-1;padding:0 .5rem 2rem}body>header>:only-child{margin-block-start:2rem}body>header h1{max-width:1200px;margin:1rem auto}body>header p{max-width:40rem;margin:1rem auto}main{padding-top:1.5rem}body>footer{color:var(--text-light);text-align:center;border-top:1px solid var(--border);margin-top:4rem;padding:2rem 1rem 1.5rem;font-size:.9rem}h1{font-size:3rem}h2{margin-top:3rem;font-size:2.6rem}h3{margin-top:3rem;font-size:2rem}h4{font-size:1.44rem}h5{font-size:1.15rem}h6{font-size:.96rem}p{margin:1.5rem 0}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}h1,h2,h3{line-height:1.1}@media only screen and (width<=720px){h1{font-size:2.5rem}h2{font-size:2.1rem}h3{font-size:1.75rem}h4{font-size:1.25rem}}a,a:visited{color:var(--accent)}a:hover{text-decoration:none}button,.button,a.button,input[type=submit],input[type=reset],input[type=button],label[type=button]{border:1px solid var(--accent);background-color:var(--accent);color:var(--accent-text);padding:.5rem .9rem;line-height:normal;text-decoration:none}.button[aria-disabled=true],input:disabled,textarea:disabled,select:disabled,button[disabled]{cursor:not-allowed;background-color:var(--disabled);border-color:var(--disabled);color:var(--text-light)}input[type=range]{padding:0}abbr[title]{cursor:help;text-decoration-line:underline;text-decoration-style:dotted}button:enabled:hover,.button:not([aria-disabled=true]):hover,input[type=submit]:enabled:hover,input[type=reset]:enabled:hover,input[type=button]:enabled:hover,label[type=button]:hover{background-color:var(--accent-hover);border-color:var(--accent-hover);cursor:pointer}.button:focus-visible,button:focus-visible:where(:enabled),input:enabled:focus-visible:where([type=submit],[type=reset],[type=button]){outline:2px solid var(--accent);outline-offset:1px}header>nav{padding:1rem 0 0;font-size:1rem;line-height:2}header>nav ul,header>nav ol{flex-flow:wrap;place-content:space-around center;align-items:center;margin:0;padding:0;list-style-type:none;display:flex}header>nav ul li,header>nav ol li{display:inline-block}header>nav a,header>nav a:visited{border:1px solid var(--border);border-radius:var(--standard-border-radius);color:var(--text);margin:0 .5rem 1rem;padding:.1rem 1rem;text-decoration:none;display:inline-block}header>nav a:hover,header>nav a.current,header>nav a[aria-current=page]{border-color:var(--accent);color:var(--accent);cursor:pointer}@media only screen and (width<=720px){header>nav a{border:none;padding:0;line-height:1;text-decoration:underline}}aside,details,pre,progress{background-color:var(--accent-bg);border:1px solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem}aside{float:right;width:30%;margin-inline-start:15px;padding:0 15px;font-size:1rem}[dir=rtl] aside{float:left}@media only screen and (width<=720px){aside{float:none;width:100%;margin-inline-start:0}}article,fieldset,dialog{border:1px solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem;padding:1rem}article h2:first-child,section h2:first-child,article h3:first-child,section h3:first-child{margin-top:1rem}section{border-top:1px solid var(--border);border-bottom:1px solid var(--border);margin:3rem 0;padding:2rem 1rem}section+section,section:first-child{border-top:0;padding-top:0}section+section{margin-top:0}section:last-child{border-bottom:0;padding-bottom:0}details{padding:.7rem 1rem}summary{cursor:pointer;word-break:break-all;margin:-.7rem -1rem;padding:.7rem 1rem;font-weight:700}details[open]>summary+*{margin-top:0}details[open]>summary{margin-bottom:.5rem}details[open]>:last-child{margin-bottom:0}table{border-collapse:collapse;margin:1.5rem 0}figure>table{width:max-content;margin:0}td,th{border:1px solid var(--border);text-align:start;padding:.5rem}th{background-color:var(--accent-bg);font-weight:700}tr:nth-child(2n){background-color:var(--accent-bg)}table caption{margin-bottom:.5rem;font-weight:700}textarea,select,input,button,.button{font-size:inherit;border-radius:var(--standard-border-radius);box-shadow:none;max-width:100%;margin-bottom:.5rem;padding:.5rem;font-family:inherit;display:inline-block}textarea,select,input{color:var(--text);background-color:var(--bg);border:1px solid var(--border)}label{display:block}textarea:not([cols]){width:100%}select:not([multiple]){background-image:linear-gradient(45deg,transparent 49%,var(--text)51%),linear-gradient(135deg,var(--text)51%,transparent 49%);background-position:calc(100% - 15px),calc(100% - 10px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-inline-end:25px}[dir=rtl] select:not([multiple]){background-position:10px,15px}input[type=checkbox],input[type=radio]{vertical-align:middle;width:min-content;position:relative}input[type=checkbox]+label,input[type=radio]+label{display:inline-block}input[type=radio]{border-radius:100%}input[type=checkbox]:checked,input[type=radio]:checked{background-color:var(--accent)}input[type=checkbox]:checked:after{content:" ";border-right:solid var(--bg).08em;border-bottom:solid var(--bg).08em;background-color:#0000;border-radius:0;width:.18em;height:.32em;font-size:1.8em;position:absolute;top:.05em;left:.17em;transform:rotate(45deg)}input[type=radio]:checked:after{content:" ";background-color:var(--bg);border-radius:100%;width:.25em;height:.25em;font-size:32px;position:absolute;top:.125em;left:.125em}@media only screen and (width<=720px){textarea,select,input{width:100%}}input[type=color]{height:2.5rem;padding:.2rem}input[type=file]{border:0}hr{background:var(--border);border:none;height:1px;margin:1rem auto}mark{border-radius:var(--standard-border-radius);background-color:var(--marked);color:#000;padding:2px 5px}mark a{color:#0d47a1}img,video{border-radius:var(--standard-border-radius);max-width:100%;height:auto}figure{margin:0;display:block;overflow-x:auto}figure>img,figure>picture>img{margin-inline:auto;display:block}figcaption{text-align:center;color:var(--text-light);margin-block:1rem;font-size:.9rem}blockquote{border-inline-start:.35rem solid var(--accent);color:var(--text-light);margin-block:2rem;margin-inline:2rem 0;padding:.4rem .8rem;font-style:italic}cite{color:var(--text-light);font-size:.9rem;font-style:normal}dt{color:var(--text-light)}code,pre,pre span,kbd,samp{font-family:var(--mono-font);color:var(--code)}kbd{color:var(--preformatted);border:1px solid var(--preformatted);border-bottom:3px solid var(--preformatted);border-radius:var(--standard-border-radius);padding:.1rem .4rem}pre{color:var(--preformatted);max-width:100%;padding:1rem 1.4rem;overflow:auto}pre code{color:var(--preformatted);background:0 0;margin:0;padding:0}progress{width:100%}progress:indeterminate{background-color:var(--accent-bg)}progress::-webkit-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent-bg)}progress::-webkit-progress-value{border-radius:var(--standard-border-radius);background-color:var(--accent)}progress::-moz-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent);transition-property:width;transition-duration:.3s}progress:indeterminate::-moz-progress-bar{background-color:var(--accent-bg)}dialog{max-width:40rem;margin:auto}dialog::backdrop{background-color:var(--bg);opacity:.8}@media only screen and (width<=720px){dialog{max-width:100%;margin:auto 1em}}sup,sub{vertical-align:baseline;position:relative}sup{top:-.4em}sub{top:.3em}.notice{background:var(--accent-bg);border:2px solid var(--border);border-radius:var(--standard-border-radius);margin:2rem 0;padding:1.5rem} \ No newline at end of file diff --git a/public/static/css/water.min.css b/public/static/css/water.min.css new file mode 100644 index 0000000..6a9b7f7 --- /dev/null +++ b/public/static/css/water.min.css @@ -0,0 +1 @@ +:root{--background-body:#fff;--background:#efefef;--background-alt:#f7f7f7;--selection:#9e9e9e;--text-main:#363636;--text-bright:#000;--text-muted:#70777f;--links:#0076d1;--focus:rgba(0,150,191,0.67);--border:#dbdbdb;--code:#000;--animation-duration:0.1s;--button-base:#d0cfcf;--button-hover:#9b9b9b;--scrollbar-thumb:#aaa;--scrollbar-thumb-hover:var(--button-hover);--form-placeholder:#949494;--form-text:#1d1d1d;--variable:#39a33c;--highlight:#ff0;--select-arrow:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23161f27'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E")}@media (prefers-color-scheme:dark){:root{--background-body:#202b38;--background:#161f27;--background-alt:#1a242f;--selection:#1c76c5;--text-main:#dbdbdb;--text-bright:#fff;--text-muted:#a9b1ba;--links:#41adff;--focus:rgba(0,150,191,0.67);--border:#526980;--code:#ffbe85;--animation-duration:0.1s;--button-base:#0c151c;--button-hover:#040a0f;--scrollbar-thumb:var(--button-hover);--scrollbar-thumb-hover:#000;--form-placeholder:#a9a9a9;--form-text:#fff;--variable:#d941e2;--highlight:#efdb43;--select-arrow:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23efefef'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E")}}html{scrollbar-color:#aaa #fff;scrollbar-color:var(--scrollbar-thumb) var(--background-body);scrollbar-width:thin}@media (prefers-color-scheme:dark){html{scrollbar-color:#040a0f #202b38;scrollbar-color:var(--scrollbar-thumb) var(--background-body)}}body{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Segoe UI Emoji,Apple Color Emoji,Noto Color Emoji,sans-serif;line-height:1.4;max-width:800px;margin:20px auto;padding:0 10px;word-wrap:break-word;color:#363636;color:var(--text-main);background:#fff;background:var(--background-body);text-rendering:optimizeLegibility}@media (prefers-color-scheme:dark){body{background:#202b38;background:var(--background-body);color:#dbdbdb;color:var(--text-main)}}button{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}@media (prefers-color-scheme:dark){button{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}}input{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}@media (prefers-color-scheme:dark){input{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}}textarea{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}@media (prefers-color-scheme:dark){textarea{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}}h1{font-size:2.2em;margin-top:0}h1,h2,h3,h4,h5,h6{margin-bottom:12px;margin-top:24px}h1{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h1{color:#fff;color:var(--text-bright)}}h2{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h2{color:#fff;color:var(--text-bright)}}h3{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h3{color:#fff;color:var(--text-bright)}}h4{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h4{color:#fff;color:var(--text-bright)}}h5{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h5{color:#fff;color:var(--text-bright)}}h6{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){h6{color:#fff;color:var(--text-bright)}}strong{color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){strong{color:#fff;color:var(--text-bright)}}b,h1,h2,h3,h4,h5,h6,strong,th{font-weight:600}q:after,q:before{content:none}blockquote{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus);margin:1.5em 0;padding:.5em 1em;font-style:italic}@media (prefers-color-scheme:dark){blockquote{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus)}}q{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus);margin:1.5em 0;padding:.5em 1em;font-style:italic}@media (prefers-color-scheme:dark){q{border-left:4px solid rgba(0,150,191,.67);border-left:4px solid var(--focus)}}blockquote>footer{font-style:normal;border:0}address,blockquote cite{font-style:normal}a[href^=mailto\:]:before{content:"📧 "}a[href^=tel\:]:before{content:"📞 "}a[href^=sms\:]:before{content:"💬 "}mark{background-color:#ff0;background-color:var(--highlight);border-radius:2px;padding:0 2px;color:#000}@media (prefers-color-scheme:dark){mark{background-color:#efdb43;background-color:var(--highlight)}}a>code,a>strong{color:inherit}button,input[type=button],input[type=checkbox],input[type=radio],input[type=range],input[type=reset],input[type=submit],select{cursor:pointer}input,select{display:block}[type=checkbox],[type=radio]{display:initial}input{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){input{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}button{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){button{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}textarea{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){textarea{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}select{color:#1d1d1d;color:var(--form-text);background-color:#efefef;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:none}@media (prefers-color-scheme:dark){select{background-color:#161f27;background-color:var(--background);color:#fff;color:var(--form-text)}}button{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){button{background-color:#0c151c;background-color:var(--button-base)}}input[type=submit]{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){input[type=submit]{background-color:#0c151c;background-color:var(--button-base)}}input[type=reset]{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){input[type=reset]{background-color:#0c151c;background-color:var(--button-base)}}input[type=button]{background-color:#d0cfcf;background-color:var(--button-base);padding-right:30px;padding-left:30px}@media (prefers-color-scheme:dark){input[type=button]{background-color:#0c151c;background-color:var(--button-base)}}button:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){button:hover{background:#040a0f;background:var(--button-hover)}}input[type=submit]:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){input[type=submit]:hover{background:#040a0f;background:var(--button-hover)}}input[type=reset]:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){input[type=reset]:hover{background:#040a0f;background:var(--button-hover)}}input[type=button]:hover{background:#9b9b9b;background:var(--button-hover)}@media (prefers-color-scheme:dark){input[type=button]:hover{background:#040a0f;background:var(--button-hover)}}input[type=color]{min-height:2rem;padding:8px;cursor:pointer}input[type=checkbox],input[type=radio]{height:1em;width:1em}input[type=radio]{border-radius:100%}input{vertical-align:top}label{vertical-align:middle;margin-bottom:4px;display:inline-block}button,input:not([type=checkbox]):not([type=radio]),input[type=range],select,textarea{-webkit-appearance:none}textarea{display:block;margin-right:0;box-sizing:border-box;resize:vertical}textarea:not([cols]){width:100%}textarea:not([rows]){min-height:40px;height:140px}select{background:#efefef url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23161f27'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E") calc(100% - 12px) 50%/12px no-repeat;background:var(--background) var(--select-arrow) calc(100% - 12px) 50%/12px no-repeat;padding-right:35px}@media (prefers-color-scheme:dark){select{background:#161f27 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23efefef'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E") calc(100% - 12px) 50%/12px no-repeat;background:var(--background) var(--select-arrow) calc(100% - 12px) 50%/12px no-repeat}}select::-ms-expand{display:none}select[multiple]{padding-right:10px;background-image:none;overflow-y:auto}input:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){input:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}select:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){select:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}button:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){button:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}textarea:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}@media (prefers-color-scheme:dark){textarea:focus{box-shadow:0 0 0 2px rgba(0,150,191,.67);box-shadow:0 0 0 2px var(--focus)}}button:active,input[type=button]:active,input[type=checkbox]:active,input[type=radio]:active,input[type=range]:active,input[type=reset]:active,input[type=submit]:active{transform:translateY(2px)}button:disabled,input:disabled,select:disabled,textarea:disabled{cursor:not-allowed;opacity:.5}::-moz-placeholder{color:#949494;color:var(--form-placeholder)}:-ms-input-placeholder{color:#949494;color:var(--form-placeholder)}::-ms-input-placeholder{color:#949494;color:var(--form-placeholder)}::placeholder{color:#949494;color:var(--form-placeholder)}@media (prefers-color-scheme:dark){::-moz-placeholder{color:#a9a9a9;color:var(--form-placeholder)}:-ms-input-placeholder{color:#a9a9a9;color:var(--form-placeholder)}::-ms-input-placeholder{color:#a9a9a9;color:var(--form-placeholder)}::placeholder{color:#a9a9a9;color:var(--form-placeholder)}}fieldset{border:1px solid rgba(0,150,191,.67);border:1px solid var(--focus);border-radius:6px;margin:0 0 12px;padding:10px}@media (prefers-color-scheme:dark){fieldset{border:1px solid rgba(0,150,191,.67);border:1px solid var(--focus)}}legend{font-size:.9em;font-weight:600}input[type=range]{margin:10px 0;padding:10px 0;background:transparent}input[type=range]:focus{outline:none}input[type=range]::-webkit-slider-runnable-track{width:100%;height:9.5px;-webkit-transition:.2s;transition:.2s;background:#efefef;background:var(--background);border-radius:3px}@media (prefers-color-scheme:dark){input[type=range]::-webkit-slider-runnable-track{background:#161f27;background:var(--background)}}input[type=range]::-webkit-slider-thumb{box-shadow:0 1px 1px #000,0 0 1px #0d0d0d;height:20px;width:20px;border-radius:50%;background:#dbdbdb;background:var(--border);-webkit-appearance:none;margin-top:-7px}@media (prefers-color-scheme:dark){input[type=range]::-webkit-slider-thumb{background:#526980;background:var(--border)}}input[type=range]:focus::-webkit-slider-runnable-track{background:#efefef;background:var(--background)}@media (prefers-color-scheme:dark){input[type=range]:focus::-webkit-slider-runnable-track{background:#161f27;background:var(--background)}}input[type=range]::-moz-range-track{width:100%;height:9.5px;-moz-transition:.2s;transition:.2s;background:#efefef;background:var(--background);border-radius:3px}@media (prefers-color-scheme:dark){input[type=range]::-moz-range-track{background:#161f27;background:var(--background)}}input[type=range]::-moz-range-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;height:20px;width:20px;border-radius:50%;background:#dbdbdb;background:var(--border)}@media (prefers-color-scheme:dark){input[type=range]::-moz-range-thumb{background:#526980;background:var(--border)}}input[type=range]::-ms-track{width:100%;height:9.5px;background:transparent;border-color:transparent;border-width:16px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#efefef;background:var(--background);border:.2px solid #010101;border-radius:3px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}@media (prefers-color-scheme:dark){input[type=range]::-ms-fill-lower{background:#161f27;background:var(--background)}}input[type=range]::-ms-fill-upper{background:#efefef;background:var(--background);border:.2px solid #010101;border-radius:3px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}@media (prefers-color-scheme:dark){input[type=range]::-ms-fill-upper{background:#161f27;background:var(--background)}}input[type=range]::-ms-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;border:1px solid #000;height:20px;width:20px;border-radius:50%;background:#dbdbdb;background:var(--border)}@media (prefers-color-scheme:dark){input[type=range]::-ms-thumb{background:#526980;background:var(--border)}}input[type=range]:focus::-ms-fill-lower{background:#efefef;background:var(--background)}@media (prefers-color-scheme:dark){input[type=range]:focus::-ms-fill-lower{background:#161f27;background:var(--background)}}input[type=range]:focus::-ms-fill-upper{background:#efefef;background:var(--background)}@media (prefers-color-scheme:dark){input[type=range]:focus::-ms-fill-upper{background:#161f27;background:var(--background)}}a{text-decoration:none;color:#0076d1;color:var(--links)}@media (prefers-color-scheme:dark){a{color:#41adff;color:var(--links)}}a:hover{text-decoration:underline}code{background:#efefef;background:var(--background);color:#000;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}@media (prefers-color-scheme:dark){code{color:#ffbe85;color:var(--code);background:#161f27;background:var(--background)}}samp{background:#efefef;background:var(--background);color:#000;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}@media (prefers-color-scheme:dark){samp{color:#ffbe85;color:var(--code);background:#161f27;background:var(--background)}}time{background:#efefef;background:var(--background);color:#000;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}@media (prefers-color-scheme:dark){time{color:#ffbe85;color:var(--code);background:#161f27;background:var(--background)}}pre>code{padding:10px;display:block;overflow-x:auto}var{color:#39a33c;color:var(--variable);font-style:normal;font-family:monospace}@media (prefers-color-scheme:dark){var{color:#d941e2;color:var(--variable)}}kbd{background:#efefef;background:var(--background);border:1px solid #dbdbdb;border:1px solid var(--border);border-radius:2px;color:#363636;color:var(--text-main);padding:2px 4px}@media (prefers-color-scheme:dark){kbd{color:#dbdbdb;color:var(--text-main);border:1px solid #526980;border:1px solid var(--border);background:#161f27;background:var(--background)}}img,video{max-width:100%;height:auto}hr{border:none;border-top:1px solid #dbdbdb;border-top:1px solid var(--border)}@media (prefers-color-scheme:dark){hr{border-top:1px solid #526980;border-top:1px solid var(--border)}}table{border-collapse:collapse;margin-bottom:10px;width:100%;table-layout:fixed}table caption,td,th{text-align:left}td,th{padding:6px;vertical-align:top;word-wrap:break-word}thead{border-bottom:1px solid #dbdbdb;border-bottom:1px solid var(--border)}@media (prefers-color-scheme:dark){thead{border-bottom:1px solid #526980;border-bottom:1px solid var(--border)}}tfoot{border-top:1px solid #dbdbdb;border-top:1px solid var(--border)}@media (prefers-color-scheme:dark){tfoot{border-top:1px solid #526980;border-top:1px solid var(--border)}}tbody tr:nth-child(2n){background-color:#efefef;background-color:var(--background)}@media (prefers-color-scheme:dark){tbody tr:nth-child(2n){background-color:#161f27;background-color:var(--background)}}tbody tr:nth-child(2n) button{background-color:#f7f7f7;background-color:var(--background-alt)}@media (prefers-color-scheme:dark){tbody tr:nth-child(2n) button{background-color:#1a242f;background-color:var(--background-alt)}}tbody tr:nth-child(2n) button:hover{background-color:#fff;background-color:var(--background-body)}@media (prefers-color-scheme:dark){tbody tr:nth-child(2n) button:hover{background-color:#202b38;background-color:var(--background-body)}}::-webkit-scrollbar{height:10px;width:10px}::-webkit-scrollbar-track{background:#efefef;background:var(--background);border-radius:6px}@media (prefers-color-scheme:dark){::-webkit-scrollbar-track{background:#161f27;background:var(--background)}}::-webkit-scrollbar-thumb{background:#aaa;background:var(--scrollbar-thumb);border-radius:6px}@media (prefers-color-scheme:dark){::-webkit-scrollbar-thumb{background:#040a0f;background:var(--scrollbar-thumb)}}::-webkit-scrollbar-thumb:hover{background:#9b9b9b;background:var(--scrollbar-thumb-hover)}@media (prefers-color-scheme:dark){::-webkit-scrollbar-thumb:hover{background:#000;background:var(--scrollbar-thumb-hover)}}::-moz-selection{background-color:#9e9e9e;background-color:var(--selection);color:#000;color:var(--text-bright)}::selection{background-color:#9e9e9e;background-color:var(--selection);color:#000;color:var(--text-bright)}@media (prefers-color-scheme:dark){::-moz-selection{color:#fff;color:var(--text-bright)}::selection{color:#fff;color:var(--text-bright)}}@media (prefers-color-scheme:dark){::-moz-selection{background-color:#1c76c5;background-color:var(--selection)}::selection{background-color:#1c76c5;background-color:var(--selection)}}details{display:flex;flex-direction:column;align-items:flex-start;background-color:#f7f7f7;background-color:var(--background-alt);padding:10px 10px 0;margin:1em 0;border-radius:6px;overflow:hidden}@media (prefers-color-scheme:dark){details{background-color:#1a242f;background-color:var(--background-alt)}}details[open]{padding:10px}details>:last-child{margin-bottom:0}details[open] summary{margin-bottom:10px}summary{display:list-item;background-color:#efefef;background-color:var(--background);padding:10px;margin:-10px -10px 0;cursor:pointer;outline:none}@media (prefers-color-scheme:dark){summary{background-color:#161f27;background-color:var(--background)}}summary:focus,summary:hover{text-decoration:underline}details>:not(summary){margin-top:0}summary::-webkit-details-marker{color:#363636;color:var(--text-main)}@media (prefers-color-scheme:dark){summary::-webkit-details-marker{color:#dbdbdb;color:var(--text-main)}}dialog{background-color:#f7f7f7;background-color:var(--background-alt);color:#363636;color:var(--text-main);border-radius:6px;border:#dbdbdb;border-color:var(--border);padding:10px 30px}@media (prefers-color-scheme:dark){dialog{border-color:#526980;border-color:var(--border);color:#dbdbdb;color:var(--text-main);background-color:#1a242f;background-color:var(--background-alt)}}dialog>header:first-child{background-color:#efefef;background-color:var(--background);border-radius:6px 6px 0 0;margin:-10px -30px 10px;padding:10px;text-align:center}@media (prefers-color-scheme:dark){dialog>header:first-child{background-color:#161f27;background-color:var(--background)}}dialog::-webkit-backdrop{background:rgba(0,0,0,.61);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}dialog::backdrop{background:rgba(0,0,0,.61);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}footer{border-top:1px solid #dbdbdb;border-top:1px solid var(--border);padding-top:10px;color:#70777f;color:var(--text-muted)}@media (prefers-color-scheme:dark){footer{color:#a9b1ba;color:var(--text-muted);border-top:1px solid #526980;border-top:1px solid var(--border)}}body>footer{margin-top:40px}@media print{body,button,code,details,input,pre,summary,textarea{background-color:#fff}button,input,textarea{border:1px solid #000}body,button,code,footer,h1,h2,h3,h4,h5,h6,input,pre,strong,summary,textarea{color:#000}summary::marker{color:#000}summary::-webkit-details-marker{color:#000}tbody tr:nth-child(2n){background-color:#f2f2f2}a{color:#00f;text-decoration:underline}} \ No newline at end of file diff --git a/public/static/img/pizza.svg b/public/static/img/pizza.svg deleted file mode 100644 index f2eafa4..0000000 --- a/public/static/img/pizza.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/public/static/img/slice-of-pizza.png b/public/static/img/slice-of-pizza.png deleted file mode 100644 index 300e7e7..0000000 Binary files a/public/static/img/slice-of-pizza.png and /dev/null differ diff --git a/public/static/js/htmx.min.js b/public/static/js/htmx.min.js new file mode 100644 index 0000000..de5f0f1 --- /dev/null +++ b/public/static/js/htmx.min.js @@ -0,0 +1 @@ +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.12"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t){return new RegExp("<"+e+"(\\s[^>]*>|>)([\\s\\S]*?)<\\/"+e+">",!!t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function A(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function s(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function N(e){return/",0);var a=i.querySelector("template").content;if(Q.config.allowScriptTags){oe(a.querySelectorAll("script"),function(e){if(Q.config.inlineScriptNonce){e.nonce=Q.config.inlineScriptNonce}e.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1})}else{oe(a.querySelectorAll("script"),function(e){_(e)})}return a}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s(""+n+"
",1);case"col":return s(""+n+"
",2);case"tr":return s(""+n+"
",2);case"td":case"th":return s(""+n+"
",3);case"script":case"style":return s("
"+n+"
",1);default:return s(n,0)}}function ie(e){if(e){e()}}function I(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return I(e,"Function")}function P(e){return I(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function M(e){var t=[];if(e){for(var r=0;r=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function D(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function U(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function B(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function j(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function _(e,t){e=p(e);if(t){setTimeout(function(){_(e);e=null},t)}else{e.parentElement.removeChild(e)}}function z(e,t,r){e=p(e);if(r){setTimeout(function(){z(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=p(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function $(e,t){e=p(e);e.classList.toggle(t)}function W(e,t){e=p(e);oe(e.parentElement.children,function(e){n(e,t)});z(e,t)}function v(e,t){e=p(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function g(e,t){return e.substring(0,t.length)===t}function G(e,t){return e.substring(e.length-t.length)===t}function J(e){var t=e.trim();if(g(t,"<")&&G(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Z(e,t){if(t.indexOf("closest ")===0){return[v(e,J(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,J(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[K(e,J(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[Y(e,J(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(J(t))}}var K=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Z(e,t)[0]}else{return Z(re().body,e)[0]}}function p(e){if(I(e,"String")){return C(e)}else{return e}}function ve(e,t,r){if(k(t)){return{target:re().body,event:e,listener:t}}else{return{target:p(e),event:t,listener:r}}}function de(t,r,n){jr(function(){var e=ve(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=k(r);return e?r:n}function ge(t,r,n){jr(function(){var e=ve(t,r,n);e.target.removeEventListener(e.event,e.listener)});return k(r)?r:n}var pe=re().createElement("output");function me(e,t){var r=ne(e,t);if(r){if(r==="this"){return[xe(e,t)]}else{var n=Z(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[pe]}else{return n}}}}function xe(e,t){return c(e,function(e){return te(e,t)!=null})}function ye(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return xe(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function be(e){var t=Q.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Se(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){Fe(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Ce(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();we(e,i);s.tasks.push(function(){we(e,a)})}}})}function Oe(e){return function(){n(e,Q.config.addedClass);zt(e);Nt(e);qe(e);ce(e,"htmx:load")}}function qe(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){Te(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;z(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Oe(i))}}}function He(e,t){var r=0;while(r-1){var t=e.replace(H,"");var r=t.match(q);if(r){return r[2]}}}function je(e,t,r,n,i,a){i.title=Ve(n);var o=l(n);if(o){Ce(r,o,i);o=Be(r,o,a);Re(o);return Fe(e,r,t,o,i)}}function _e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!P(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=Tr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Qe(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function tt(e){var t;if(e.length>0&&Ze.test(e[0])){e.shift();t=y(e,Ke).trim();e.shift()}else{t=y(e,x)}return t}var rt="input, textarea, select";function nt(e,t,r){var n=[];var i=Ye(t);do{y(i,Je);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Je);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Je);var l=et(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=et(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Je);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ze.test(i[0])){var c=tt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=tt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=tt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=tt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Je)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function it(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||nt(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,rt)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function at(e){ae(e).cancelled=true}function ot(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!ct(r,e,Wt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}ot(e,t,r)}},r.pollInterval)}function st(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function lt(t,r,e){if(t.tagName==="A"&&st(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){ht(t,function(e,t){if(v(e,Q.config.disableSelector)){m(e);return}he(n,i,e,t)},r,e,true)})}}function ut(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ft(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function ct(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function ht(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Z(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ft(a,e)){return}if(l||ut(e,a)){e.preventDefault()}if(ct(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var vt=false;var dt=null;function gt(){if(!dt){dt=function(){vt=true};window.addEventListener("scroll",dt);setInterval(function(){if(vt){vt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){pt(e)})}},200)}}function pt(t){if(!o(t,"data-hx-revealed")&&X(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function mt(e,t,r){var n=D(r);for(var i=0;i=0){var t=wt(n);setTimeout(function(){xt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(yt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=M(n.children);for(var a=0;a0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ut(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function wt(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(e,t,r){var n=D(r);for(var i=0;i0){setTimeout(i,n)}else{i()}}function Ht(t,i,e){var a=false;oe(w,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Lt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){m(e);return}he(r,n,e,t)})})}});return a}function Lt(n,e,t,r){if(e.sseEvent){Rt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){gt();ht(n,r,t,e);pt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t0){t.polling=true;ot(n,r,e)}else{ht(n,r,t,e)}}function At(e){if(!e.htmxExecuted&&Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function Nt(e){if(h(e,"script")){At(e)}oe(f(e,"script"),function(e){At(e)})}function It(e){var t=e.attributes;if(!t){return false}for(var r=0;r0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Bt(o)}for(var l in r){Ft(e,l,r[l])}}}function jt(e){Ae(e);for(var t=0;tQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Yt(e){if(!U()){return null}e=B(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Zt();var r=T(t);var n=Ve(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ue(t,e,r);nr(r.tasks);Jt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function ar(e){er();e=e||location.pathname+location.search;var t=Yt(e);if(t){var r=l(t.content);var n=Zt();var i=T(n);Ue(n,r,i);nr(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Jt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{ir(e)}}}function or(e){var t=me(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function sr(e){var t=me(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function lr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function ur(e,t){for(var r=0;r=0}function wr(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!br(e)){n["show"]="top"}if(r){var i=D(r);if(i.length>0){for(var a=0;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Sr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Er(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Sr(r)){return mr(n)}else{return pr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Cr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Rr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=Tr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Rr(u(e),t,r,n)}function Tr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Or(e,t){return Rr(e,"hx-vars",true,t)}function qr(e,t){return Rr(e,"hx-vals",false,t)}function Hr(e){return le(Or(e),qr(e))}function Lr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Ar(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Nr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||I(r,"String")){return he(e,t,null,null,{targetOverride:p(r),returnPromise:true})}else{return he(e,t,p(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:p(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Ir(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function kr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=g(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Mr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||ye(n);if(u==null||u==pe){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var p=ne(n,"hx-sync");var m=null;var x=false;if(p){var B=p.split(":");var F=B[0].trim();if(F==="this"){g=xe(n,"hx-sync")}else{g=ue(n,F)}p=(B[1]||"drop").trim();f=ae(g);if(p==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(p==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(p==="replace"){ce(g,"htmx:abort")}else if(p.indexOf("queue")===0){var V=p.split(" ");m=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(m==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){m=y.triggerSpec.queue}}if(m==null){m="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(m==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(m==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(m==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=xr(n,u,S);if(t!=="get"&&!Sr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=dr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Hr(n);var $=le(R,z);var T=yr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Rr(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=pr(T);if(L){A+="#"+L}}}if(!kr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Lr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Ir(n);I.pathInfo.responsePath=Ar(b);M(n,I);lr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=or(n);var P=sr(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Er(b,n,T);b.send(Y);return l}function Pr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Mr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){_e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){er();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}Nr("GET",r,v).then(function(){tr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Pr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var p=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:p},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;p=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){at(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){er()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=wr(l,s);if(v.hasOwnProperty("ignoreTitle")){p=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var m=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){tr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{rr(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);je(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}_e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!p){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Cr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}_e(f,"HX-Trigger-After-Settle",r)}ie(m)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){m=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Xr={};function Dr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ur(e,t){if(t.init){t.init(r)}Xr[e]=le(Dr(),t)}function Br(e){delete Xr[e]}function Fr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Xr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Fr(u(e),r,n)}var Vr=false;re().addEventListener("DOMContentLoaded",function(){Vr=true});function jr(e){if(Vr||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function _r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","")}}function zr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function $r(){var e=zr();if(e){Q.config=le(Q.config,e)}}jr(function(){$r();_r();var e=re().body;zt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){ar();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()}); \ No newline at end of file diff --git a/src/Command/FakeDataCommand.php b/src/Command/FakeDataCommand.php new file mode 100644 index 0000000..c4fdd5d --- /dev/null +++ b/src/Command/FakeDataCommand.php @@ -0,0 +1,35 @@ +fakeData->resetDb(); + $this->fakeData->generate(); + + $io->success('Added some fake data to database'); + return Command::SUCCESS; + } +} diff --git a/src/Controller/FoodOrderController.php b/src/Controller/FoodOrderController.php index 815fba5..7251951 100644 --- a/src/Controller/FoodOrderController.php +++ b/src/Controller/FoodOrderController.php @@ -4,7 +4,6 @@ namespace App\Controller; use App\Entity\FoodOrder; use App\Form\FoodOrderType; -use App\Form\OrderFinalize; use App\Repository\FoodOrderRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -15,59 +14,11 @@ use Symfony\Component\Routing\Attribute\Route; #[Route('/food/order')] final class FoodOrderController extends AbstractController { - #[Route( - path: '/list/archive/{page}', - name: 'app_food_order_archive', - requirements: [ - 'page' => '\d+', - ], - methods: ['GET'] - )] - public function archive(FoodOrderRepository $foodOrderRepository, int $page = 1): Response - { - $nextPage = $page + 1; - $prevPage = $page - 1; - $itemsPerPage = 10; - $count = $foodOrderRepository->count(); - if ($count < $page * $itemsPerPage) { - $nextPage = $page; - } - - return $this->render('food_order/index.html.twig', [ - 'food_orders' => $foodOrderRepository->findLatestEntries( - page: $page, - pagesize: $itemsPerPage, - days: 0 - ), - 'current_page' => $page, - 'next_page' => $nextPage, - 'prev_page' => $prevPage, - ]); - } - - #[Route('/{id}/close', name: 'app_food_order_close', methods: ['GET'])] - public function close(FoodOrder $foodOrder, FoodOrderRepository $repository): Response - { - $foodOrder->close(); - $repository->save(); - return $this->redirectToRoute('app_food_order_show', [ - 'id' => $foodOrder->getId(), - ], Response::HTTP_SEE_OTHER); - } - - #[Route( - path: '/list', - name: 'app_food_order_index', - methods: ['GET'] - )] + #[Route('/', name: 'app_food_order_index', methods: ['GET'])] public function index(FoodOrderRepository $foodOrderRepository): Response { - return $this->render('food_order/index.html.twig', [ - 'food_orders' => $foodOrderRepository->findLatestEntries(days: 3), - 'current_page' => 0, - 'next_page' => 0, - 'prev_page' => 0, + 'food_orders' => $foodOrderRepository->findLatestEntries(), ]); } @@ -75,8 +26,6 @@ final class FoodOrderController extends AbstractController public function new(Request $request, EntityManagerInterface $entityManager): Response { $foodOrder = new FoodOrder; - $username = $request->cookies->get('username', 'nobody'); - $foodOrder->setCreatedBy($username); $form = $this->createForm(FoodOrderType::class, $foodOrder, [ 'action' => $this->generateUrl('app_food_order_new'), ]); @@ -95,31 +44,29 @@ final class FoodOrderController extends AbstractController ]); } - #[Route('/{id}/open', name: 'app_food_order_open', methods: ['GET'])] - public function open(FoodOrder $foodOrder, FoodOrderRepository $repository): Response + #[Route('/{id}', name: 'app_food_order_show', methods: ['GET'])] + public function show(FoodOrder $foodOrder): Response { - $foodOrder->open(); - $repository->save(); + return $this->render('food_order/show.html.twig', [ + 'food_order' => $foodOrder, + ]); + } + + #[Route('/{id}/close', name: 'app_food_order_close', methods: ['GET'])] + public function close(FoodOrder $foodOrder, FoodOrderRepository $repository): Response + { + $repository->save($foodOrder->close()); return $this->redirectToRoute('app_food_order_show', [ 'id' => $foodOrder->getId(), ], Response::HTTP_SEE_OTHER); } - #[Route('/{id}', name: 'app_food_order_show', methods: ['GET', 'POST'])] - public function show(Request $request, FoodOrder $foodOrder, EntityManagerInterface $entityManager): Response + #[Route('/{id}/open', name: 'app_food_order_open', methods: ['GET'])] + public function open(FoodOrder $foodOrder, FoodOrderRepository $repository): Response { - $form = null; - if ($foodOrder->isClosed()) { - $form = $this->createForm(OrderFinalize::class, $foodOrder); - $form->handleRequest($request); - if ($form->isSubmitted() && $form->isValid()) { - $entityManager->persist($foodOrder); - $entityManager->flush(); - } - } - return $this->render('food_order/show.html.twig', [ - 'food_order' => $foodOrder, - 'form' => $form, - ]); + $repository->save($foodOrder->open()); + return $this->redirectToRoute('app_food_order_show', [ + 'id' => $foodOrder->getId(), + ], Response::HTTP_SEE_OTHER); } } diff --git a/src/Controller/FoodVendorController.php b/src/Controller/FoodVendorController.php index cb7c02c..0cb790a 100644 --- a/src/Controller/FoodVendorController.php +++ b/src/Controller/FoodVendorController.php @@ -14,23 +14,6 @@ use Symfony\Component\Routing\Attribute\Route; #[Route('/food/vendor')] final class FoodVendorController extends AbstractController { - #[Route('/{id}/edit', name: 'app_food_vendor_edit', methods: ['GET', 'POST'])] - public function edit(Request $request, FoodVendor $foodVendor, EntityManagerInterface $entityManager): Response - { - $form = $this->createForm(FoodVendorType::class, $foodVendor); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $entityManager->flush(); - - return $this->redirectToRoute('app_food_vendor_index', [], Response::HTTP_SEE_OTHER); - } - - return $this->render('food_vendor/edit.html.twig', [ - 'form' => $form, - ]); - } - #[Route('/', name: 'app_food_vendor_index', methods: ['GET'])] public function index(FoodVendorRepository $foodVendorRepository): Response { @@ -40,10 +23,8 @@ final class FoodVendorController extends AbstractController } #[Route('/new', name: 'app_food_vendor_new', methods: ['GET', 'POST'])] - public function new( - Request $request, - EntityManagerInterface $entityManager - ): Response { + public function new(Request $request, EntityManagerInterface $entityManager): Response + { $foodVendor = new FoodVendor; $form = $this->createForm(FoodVendorType::class, $foodVendor); $form->handleRequest($request); @@ -68,4 +49,22 @@ final class FoodVendorController extends AbstractController 'food_vendor' => $foodVendor, ]); } + + #[Route('/{id}/edit', name: 'app_food_vendor_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, FoodVendor $foodVendor, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(FoodVendorType::class, $foodVendor); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_food_vendor_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('food_vendor/edit.html.twig', [ + 'food_vendor' => $foodVendor, + 'form' => $form, + ]); + } } diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 46c90c7..a9bd31e 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -2,46 +2,16 @@ namespace App\Controller; -use App\Form\UserNameFormType; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\RedirectResponse; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -final class HomeController extends AbstractController +final class HomeController { - public const string DEFAULT_USERNAME = 'nobody'; - #[Route('/', name: 'home')] public function home(UrlGeneratorInterface $router): Response { return new RedirectResponse($router->generate('app_food_order_index')); } - - #[Route('/username', name: 'username')] - public function usernameForm(Request $request, UrlGeneratorInterface $router): Response - { - $form = $this->createForm(UsernameFormType::class); - $form->handleRequest($request); - if ($form->isSubmitted() && $form->isValid()) { - $username = $form->getData()['username'] ?? self::DEFAULT_USERNAME; - $response = new RedirectResponse($router->generate('app_food_order_index')); - if ($username === self::DEFAULT_USERNAME || $username === '') { - $response->headers->clearCookie('username'); - return $response; - } - $response->headers->setCookie(new Cookie('username', $username)); - return $response; - } - $username = $request->cookies->get('username', self::DEFAULT_USERNAME); - $form->setData([ - 'username' => $username, - ]); - return $this->render('username.html.twig', [ - 'form' => $form, - ]); - } } diff --git a/src/Controller/MenuItemController.php b/src/Controller/MenuItemController.php deleted file mode 100644 index 0686062..0000000 --- a/src/Controller/MenuItemController.php +++ /dev/null @@ -1,68 +0,0 @@ -isCsrfTokenValid('delete' . $menuItem->getId(), $request->getPayload()->getString('_token'))) { - $menuItem->delete(); - $entityManager->flush(); - } - - return $this->redirectToRoute('app_food_vendor_show', [ - 'id' => $menuItem->getFoodVendor() - ->getId(), - ], Response::HTTP_SEE_OTHER); - } - - #[Route('/{id}/edit', name: 'app_menu_item_edit', methods: ['GET', 'POST'])] - public function edit(Request $request, MenuItem $menuItem, EntityManagerInterface $entityManager): Response - { - $form = $this->createForm(MenuItemType::class, $menuItem); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - foreach ($menuItem->getFoodVendor()->getMenuItems() as $vendorItem) { - if ($menuItem->getAliases()->contains($vendorItem)) { - $vendorItem->setAliasOf($menuItem); - } elseif ($vendorItem->getAliasOf() === $menuItem) { - $vendorItem->setAliasOf(null); - - } - $entityManager->persist($vendorItem); - } - $entityManager->persist($menuItem); - - $entityManager->flush(); - - return $this->redirectToRoute('app_menu_item_show', [ - 'id' => $menuItem->getId(), - ], Response::HTTP_SEE_OTHER); - } - - return $this->render('menu_item/edit.html.twig', [ - 'menu_item' => $menuItem, - 'form' => $form, - ]); - } - - #[Route('/{id}', name: 'app_menu_item_show', methods: ['GET'])] - public function show(MenuItem $menuItem): Response - { - return $this->render('menu_item/show.html.twig', [ - 'menu_item' => $menuItem, - ]); - } -} diff --git a/src/Controller/OrderItemController.php b/src/Controller/OrderItemController.php index 689f3eb..5f819ef 100644 --- a/src/Controller/OrderItemController.php +++ b/src/Controller/OrderItemController.php @@ -5,7 +5,6 @@ namespace App\Controller; use App\Entity\FoodOrder; use App\Entity\OrderItem; use App\Form\OrderItemType; -use App\Repository\MenuItemRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -15,6 +14,35 @@ use Symfony\Component\Routing\Attribute\Route; #[Route('/order/item')] final class OrderItemController extends AbstractController { + #[Route('/new/{foodOrder}', name: 'app_order_item_new', methods: ['GET', 'POST'])] + public function new(Request $request, FoodOrder $foodOrder, EntityManagerInterface $entityManager): Response + { + if ($foodOrder->isClosed()) { + return $this->redirectToRoute('app_food_order_show', [ + 'id' => $foodOrder->getId(), + ], Response::HTTP_SEE_OTHER); + } + $orderItem = new OrderItem; + $form = $this->createForm(OrderItemType::class, $orderItem); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $orderItem->setFoodOrder($foodOrder); + $entityManager->persist($orderItem); + $entityManager->flush(); + + return $this->redirectToRoute('app_food_order_show', [ + 'id' => $foodOrder->getId(), + ], Response::HTTP_SEE_OTHER); + } + + return $this->render('order_item/new.html.twig', [ + 'order_item' => $orderItem, + 'food_order' => $foodOrder, + 'form' => $form, + ]); + } + #[Route('/{id}/copy', name: 'app_order_item_copy', methods: ['GET'])] public function copy(OrderItem $orderItem, EntityManagerInterface $entityManager): Response { @@ -28,7 +56,6 @@ final class OrderItemController extends AbstractController $newOrderItem->setFoodOrder($orderItem->getFoodOrder()); $newOrderItem->setName($orderItem->getName()); $newOrderItem->setExtras($orderItem->getExtras()); - $newOrderItem->setMenuItem($orderItem->getMenuItem()); $entityManager->persist($newOrderItem); $entityManager->flush(); @@ -38,6 +65,33 @@ final class OrderItemController extends AbstractController ], Response::HTTP_SEE_OTHER); } + #[Route('/{id}/edit', name: 'app_order_item_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, OrderItem $orderItem, EntityManagerInterface $entityManager): Response + { + $foodOrder = $orderItem->getFoodOrder(); + if ($foodOrder->isClosed()) { + return $this->redirectToRoute('app_food_order_show', [ + 'id' => $foodOrder->getId(), + ], Response::HTTP_SEE_OTHER); + } + $form = $this->createForm(OrderItemType::class, $orderItem); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_food_order_show', [ + 'id' => $orderItem->getFoodOrder() + ->getId(), + ], Response::HTTP_SEE_OTHER); + } + + return $this->render('order_item/edit.html.twig', [ + 'order_item' => $orderItem, + 'form' => $form, + ]); + } + #[Route('/delete/{id}', name: 'app_order_item_delete')] public function delete(OrderItem $orderItem, EntityManagerInterface $entityManager): Response { @@ -54,77 +108,4 @@ final class OrderItemController extends AbstractController ->getId(), ], Response::HTTP_SEE_OTHER); } - - #[Route('/{id}/edit', name: 'app_order_item_edit', methods: ['GET', 'POST'])] - public function edit( - Request $request, - OrderItem $orderItem, - EntityManagerInterface $entityManager, - MenuItemRepository $menuItemRepository, - ): Response { - $foodOrder = $orderItem->getFoodOrder(); - if ($foodOrder->isClosed()) { - return $this->redirectToRoute('app_food_order_show', [ - 'id' => $foodOrder->getId(), - ], Response::HTTP_SEE_OTHER); - } - $orderItem->setName($orderItem->getMenuItem()->getName()); - $form = $this->createForm(OrderItemType::class, $orderItem); - $form->setData($orderItem); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $orderItem->setFoodOrder($foodOrder); - $entityManager->persist($orderItem); - $entityManager->flush(); - - return $this->redirectToRoute('app_food_order_show', [ - 'id' => $orderItem->getFoodOrder() - ->getId(), - ], Response::HTTP_SEE_OTHER); - } - - return $this->render('order_item/edit.html.twig', [ - 'order_item' => $orderItem, - 'form' => $form, - ]); - } - - #[Route('/new/{foodOrder}', name: 'app_order_item_new', methods: ['GET', 'POST'])] - public function new(Request $request, FoodOrder $foodOrder, EntityManagerInterface $entityManager, MenuItemRepository $menuItemRepository): Response - { - if ($foodOrder->isClosed()) { - return $this->redirectToRoute('app_food_order_show', [ - 'id' => $foodOrder->getId(), - ], Response::HTTP_SEE_OTHER); - } - - $orderItem = new OrderItem; - $username = $request->cookies->get('username', 'nobody'); - $orderItem->setCreatedBy($username); - - $form = $this->createForm(OrderItemType::class, $orderItem); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $orderItem->setFoodOrder($foodOrder); - $entityManager->persist($orderItem); - $entityManager->flush(); - - return $this->redirectToRoute('app_food_order_show', [ - 'id' => $foodOrder->getId(), - ], Response::HTTP_SEE_OTHER); - } - $menuItems = $menuItemRepository->findBy([ - 'foodVendor' => $foodOrder->getFoodVendor(), - 'deletedAt' => null, - ]); - - return $this->render('order_item/new.html.twig', [ - 'order_item' => $orderItem, - 'food_order' => $foodOrder, - 'form' => $form, - 'menuItems' => $menuItems, - ]); - } } diff --git a/src/DataFixtures/AppFixtures.php b/src/DataFixtures/AppFixtures.php deleted file mode 100644 index b8a30b3..0000000 --- a/src/DataFixtures/AppFixtures.php +++ /dev/null @@ -1,66 +0,0 @@ -setName("{$vendor->getName()} Item {$i}"); - $item->setFoodVendor($vendor); - $this->manager->persist($item); - $this->manager->flush(); - $menuItems[] = $item; - } - - $order = new FoodOrder; - $order->setFoodVendor($vendor); - - $this->manager->persist($order); - foreach ($menuItems as $item) { - $orderItem = new OrderItem; - $orderItem->setMenuItem($item); - $orderItem->setCreatedBy('John'); - $order->addOrderItem($orderItem); - $this->manager->persist($orderItem); - } - } - - public function createVendor(string $name): FoodVendor - { - $vendorA = new FoodVendor; - $vendorA->setName($name); - $vendorA->setMenuLink('https://vendora.com'); - $vendorA->setPhone('1234567890'); - - $this->manager->persist($vendorA); - $this->manager->flush(); - return $vendorA; - } - - #[Override] - public function load(ObjectManager $manager): void - { - $this->manager = $manager; - $vendorA = $this->createVendor('Vendor A'); - $this->addMenuItemsToVendor($vendorA); - - $vendorB = $this->createVendor('Vendor B'); - $this->addMenuItemsToVendor($vendorB); - } -} diff --git a/src/Entity/FoodOrder.php b/src/Entity/FoodOrder.php index 2ca9e80..847542b 100644 --- a/src/Entity/FoodOrder.php +++ b/src/Entity/FoodOrder.php @@ -2,82 +2,97 @@ namespace App\Entity; -use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\Delete; -use ApiPlatform\Metadata\Get; -use ApiPlatform\Metadata\GetCollection; -use ApiPlatform\Metadata\Post; -use ApiPlatform\Metadata\Put; use App\Repository\FoodOrderRepository; -use App\State\LatestOrderProvider; -use App\State\OpenOrdersProvider; -use DateInterval; use DateTimeImmutable; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; use Symfony\Bridge\Doctrine\Types\UlidType; -use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Uid\Ulid; -use function iterator_to_array; - -#[ApiResource( - operations: [ - new GetCollection( - uriTemplate: 'food_orders/open', - description: 'Get only open orders', - provider: OpenOrdersProvider::class, - ), - new Get( - uriTemplate: 'food_orders/latest', - description: 'Get the latest created order', - provider: LatestOrderProvider::class, - normalizationContext: [ - 'groups' => ['food_order:read', 'food_order:latest'], - ] - ), - new GetCollection, - new Get, - new Post, - new Put, - new Delete, - ] -)] #[ORM\Entity(repositoryClass: FoodOrderRepository::class)] class FoodOrder { - #[Groups(['food_order:read'])] + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'CUSTOM')] + #[ORM\Column(type: UlidType::NAME, unique: true)] + #[ORM\CustomIdGenerator(class: UlidGenerator::class)] + private Ulid|null $id = null; + #[ORM\Column(nullable: true)] private DateTimeImmutable|null $closedAt = null; - #[Groups(['food_order:read'])] - #[ORM\Column(length: 255, options: [ - 'default' => 'nobody', - ])] - private string|null $createdBy = 'nobody'; - - #[Groups(['food_order:read', 'food_order:latest'])] - #[ORM\JoinColumn(nullable: false)] #[ORM\ManyToOne(inversedBy: 'foodOrders')] + #[ORM\JoinColumn(nullable: false)] private FoodVendor|null $foodVendor = null; /** * @var Collection */ - #[Groups(['food_order:read', 'food_order:latest'])] #[ORM\OneToMany(targetEntity: OrderItem::class, mappedBy: 'foodOrder', orphanRemoval: true)] private Collection $orderItems; - public function __construct( - #[Groups(['food_order:read'])] - #[ORM\Column(type: UlidType::NAME, unique: true)] - #[ORM\Id] - private Ulid|null $id = new Ulid - ) { - $this->id ??= new Ulid; + public function __construct() + { $this->orderItems = new ArrayCollection; - $this->open(); + } + + public function getId(): Ulid|null + { + return $this->id; + } + + public function getCreatedAt(): DateTimeImmutable + { + return $this->id->getDateTime(); + } + + public function getClosedAt(): DateTimeImmutable|null + { + return $this->closedAt; + } + + public function setClosedAt(DateTimeImmutable|null $closedAt): static + { + $this->closedAt = $closedAt; + + return $this; + } + + public function isClosed(): bool + { + return $this->closedAt instanceof DateTimeImmutable; + } + + public function close(): static + { + return $this->setClosedAt(new DateTimeImmutable); + } + + public function open(): static + { + return $this->setClosedAt(null); + } + + public function getFoodVendor(): FoodVendor|null + { + return $this->foodVendor; + } + + public function setFoodVendor(FoodVendor|null $foodVendor): static + { + $this->foodVendor = $foodVendor; + + return $this; + } + + /** + * @return Collection + */ + public function getOrderItems(): Collection + { + return $this->orderItems; } public function addOrderItem(OrderItem $orderItem): static @@ -90,104 +105,13 @@ class FoodOrder return $this; } - public function close(): static - { - return $this->setClosedAt(new DateTimeImmutable); - } - - public function getClosedAt(): DateTimeImmutable|null - { - return $this->closedAt; - } - - #[Groups(['food_order:read'])] - public function getCreatedAt(): DateTimeImmutable - { - return $this->id->getDateTime(); - } - - public function getCreatedBy(): string|null - { - return $this->createdBy; - } - - public function getFoodVendor(): FoodVendor|null - { - return $this->foodVendor; - } - - public function getId(): Ulid|null - { - return $this->id; - } - - /** - * @return Collection - */ - public function getOrderItems(): Collection - { - return $this->orderItems; - } - - /** - * @return Collection - */ - public function getOrderItemsSortedByName(): Collection - { - $iterator = $this->getOrderItems() - ->getIterator(); - $iterator->uasort( - static fn(OrderItem $a, OrderItem $b): int => $a->getName() <=> $b->getName() - ); - return new ArrayCollection( - iterator_to_array( - $iterator - ) - ); - } - - public function isClosed(): bool - { - if (! $this->closedAt instanceof DateTimeImmutable) { - return false; - } - return $this->closedAt < new DateTimeImmutable; - } - - public function open(): static - { - $this->closedAt = (new DateTimeImmutable)->add(new DateInterval('PT1H')); - return $this; - } - public function removeOrderItem(OrderItem $orderItem): static { // set the owning side to null (unless already changed) - if ($this->orderItems->removeElement($orderItem)) { + if ($this->orderItems->removeElement($orderItem) && $orderItem->getFoodOrder() === $this) { $orderItem->setFoodOrder(null); } return $this; } - - public function setClosedAt(DateTimeImmutable|null $closedAt = null): static - { - $this->closedAt = $closedAt; - - return $this; - } - - public function setCreatedBy(string $createdBy): static - { - $this->createdBy = $createdBy; - - return $this; - } - - public function setFoodVendor(FoodVendor|null $foodVendor): static - { - $this->foodVendor = $foodVendor; - - return $this; - } } diff --git a/src/Entity/FoodVendor.php b/src/Entity/FoodVendor.php index 123be49..67a8018 100644 --- a/src/Entity/FoodVendor.php +++ b/src/Entity/FoodVendor.php @@ -2,31 +2,25 @@ namespace App\Entity; -use ApiPlatform\Metadata\ApiResource; use App\Repository\FoodVendorRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; -use InvalidArgumentException; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; use Symfony\Bridge\Doctrine\Types\UlidType; -use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Uid\Ulid; -use Symfony\Component\Validator\Constraints\Length; -use function mb_strlen; - -#[ApiResource] #[ORM\Entity(repositoryClass: FoodVendorRepository::class)] class FoodVendor { - /** - * String of emojis (max 30 characters) - */ - #[Groups(['food_order:latest', 'food_vendor:read'])] - #[Length(max: 10)] - #[ORM\Column(length: 30, nullable: true)] - private string|null $emojis = null; + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'CUSTOM')] + #[ORM\Column(type: UlidType::NAME, unique: true)] + #[ORM\CustomIdGenerator(class: UlidGenerator::class)] + private Ulid|null $id = null; + + #[ORM\Column(length: 50)] + private string|null $name = null; /** * @var Collection @@ -34,37 +28,34 @@ class FoodVendor #[ORM\OneToMany(targetEntity: FoodOrder::class, mappedBy: 'foodVendor', orphanRemoval: true)] private Collection $foodOrders; - /** - * @var Collection - */ - #[ORM\OneToMany(targetEntity: MenuItem::class, mappedBy: 'foodVendor', orphanRemoval: true)] - private Collection $menuItems; - - #[Groups(['food_order:latest'])] - #[ORM\Column(length: 255, nullable: true)] - private string|null $menuLink = null; - - #[Groups(['food_order:latest', 'food_vendor:read'])] - #[ORM\Column(length: 50)] - private string|null $name = null; - - #[Groups(['food_order:latest', 'food_vendor:read'])] - #[ORM\Column(length: 50, nullable: true, options: [ - 'default' => '', - ])] - private string|null $phone = null; - - public function __construct( - #[Groups(['food_order:latest'])] - #[ORM\Column(type: UlidType::NAME, unique: true)] - #[ORM\CustomIdGenerator(class: UlidGenerator::class)] - #[ORM\GeneratedValue(strategy: 'CUSTOM')] - #[ORM\Id] - private Ulid|null $id = new Ulid - ) { - $this->id ??= new Ulid; + public function __construct() + { $this->foodOrders = new ArrayCollection; - $this->menuItems = new ArrayCollection; + } + + public function getId(): Ulid|null + { + return $this->id; + } + + public function getName(): string|null + { + return $this->name; + } + + public function setName(string $name): static + { + $this->name = $name; + + return $this; + } + + /** + * @return Collection + */ + public function getFoodOrders(): Collection + { + return $this->foodOrders; } public function addFoodOrder(FoodOrder $foodOrder): static @@ -77,109 +68,13 @@ class FoodVendor return $this; } - public function addMenuItem(MenuItem $menuItem): static - { - if (! $this->menuItems->contains($menuItem)) { - $this->menuItems->add($menuItem); - $menuItem->setFoodVendor($this); - } - - return $this; - } - - public function getEmojis(): string|null - { - return $this->emojis; - } - - /** - * @return Collection - */ - public function getFoodOrders(): Collection - { - return $this->foodOrders; - } - - public function getId(): Ulid|null - { - return $this->id; - } - - /** - * @return Collection - */ - public function getMenuItems(bool $withDeleted = false): Collection - { - if ($withDeleted) { - return $this->menuItems; - } - return $this->menuItems->filter( - static fn(MenuItem $item): bool => $item->isDeleted() === false - ); - } - - public function getMenuLink(): string|null - { - return $this->menuLink; - } - - public function getName(): string|null - { - return $this->name; - } - - public function getPhone(): string|null - { - return $this->phone; - } - public function removeFoodOrder(FoodOrder $foodOrder): static { // set the owning side to null (unless already changed) - if ($this->foodOrders->removeElement($foodOrder)) { + if ($this->foodOrders->removeElement($foodOrder) && $foodOrder->getFoodVendor() === $this) { $foodOrder->setFoodVendor(null); } return $this; } - - public function removeMenuItem(MenuItem $menuItem): static - { - // set the owning side to null (unless already changed) - if ($this->menuItems->removeElement($menuItem)) { - $menuItem->setFoodVendor(null); - } - - return $this; - } - - public function setEmojis(string|null $emojis): static - { - if ($emojis !== null && mb_strlen($emojis) > 30) { - throw new InvalidArgumentException('A maximum of 30 characters is allowed for emojis'); - } - - $this->emojis = $emojis; - return $this; - } - - public function setMenuLink(string|null $menuLink): static - { - $this->menuLink = $menuLink; - - return $this; - } - - public function setName(string $name): static - { - $this->name = $name; - - return $this; - } - - public function setPhone(string|null $phone): static - { - $this->phone = $phone; - return $this; - } } diff --git a/src/Entity/MenuItem.php b/src/Entity/MenuItem.php deleted file mode 100644 index 7ccf40f..0000000 --- a/src/Entity/MenuItem.php +++ /dev/null @@ -1,158 +0,0 @@ - - */ - #[ORM\OneToMany(targetEntity: self::class, mappedBy: 'aliasOf')] - private Collection $aliases; - - #[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'aliases')] - private self|null $aliasOf = null; - - #[ORM\Column(nullable: true)] - private DateTimeImmutable|null $deletedAt = null; - - #[ORM\JoinColumn(nullable: false)] - #[ORM\ManyToOne(inversedBy: 'menuItems')] - private FoodVendor|null $foodVendor = null; - - #[ORM\Column(length: 255)] - private string|null $name = null; - - #[ORM\Column(type: 'integer', options: [ - 'default' => 0, - ])] - #[Positive] - private int $priceCents = 0; - - public function __construct( - #[ORM\Column(type: UlidType::NAME, unique: true)] - #[ORM\CustomIdGenerator(class: UlidGenerator::class)] - #[ORM\GeneratedValue(strategy: 'CUSTOM')] - #[ORM\Id] - private Ulid|null $id = new Ulid - ) { - $this->id ??= new Ulid; - $this->aliases = new ArrayCollection; - } - - public function addAlias(self $alias): static - { - if (! $this->aliases->contains($alias)) { - $this->aliases->add($alias); - $alias->setAliasOf($this); - } - - return $this; - } - - public function delete(): static - { - $this->setDeletedAt(new DateTimeImmutable); - return $this; - } - - /** - * @return Collection - */ - public function getAliases(): Collection - { - return $this->aliases; - } - - public function getAliasOf(): self|null - { - return $this->aliasOf; - } - - public function getDeletedAt(): DateTimeImmutable|null - { - return $this->deletedAt; - } - - public function getFoodVendor(): FoodVendor|null - { - return $this->foodVendor; - } - - public function getId(): Ulid|null - { - return $this->id; - } - - public function getName(): string|null - { - return $this->name; - } - - public function getPriceCents(): int - { - return $this->priceCents; - } - - public function isDeleted(): bool - { - return $this->getDeletedAt() instanceof DateTimeImmutable; - } - - public function removeAlias(self $alias): static - { - // set the owning side to null (unless already changed) - if ($this->aliases->removeElement($alias) && $alias->getAliasOf() === $this) { - $alias->setAliasOf(null); - } - - return $this; - } - - public function setAliasOf(self|null $aliasOf): static - { - $this->aliasOf = $aliasOf; - - return $this; - } - - public function setDeletedAt(DateTimeImmutable|null $deletedAt = new DateTimeImmutable): static - { - $this->deletedAt = $deletedAt; - - return $this; - } - - public function setFoodVendor(FoodVendor|null $foodVendor): static - { - $this->foodVendor = $foodVendor; - - return $this; - } - - public function setName(string $name): static - { - $this->name = $name; - - return $this; - } - - public function setPriceCents(int $priceCents): self - { - $this->priceCents = $priceCents; - return $this; - } -} diff --git a/src/Entity/OrderItem.php b/src/Entity/OrderItem.php index e91c1c0..4bff23a 100644 --- a/src/Entity/OrderItem.php +++ b/src/Entity/OrderItem.php @@ -2,140 +2,41 @@ namespace App\Entity; -use ApiPlatform\Metadata\ApiResource; use App\Repository\OrderItemRepository; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; use Symfony\Bridge\Doctrine\Types\UlidType; -use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Uid\Ulid; -#[ApiResource] #[ORM\Entity(repositoryClass: OrderItemRepository::class)] class OrderItem { - #[Groups(['food_order:latest'])] - #[ORM\Column(length: 255, options: [ - 'default' => 'nobody', - ])] - private string|null $createdBy = 'nobody'; + #[ORM\Id] + #[ORM\GeneratedValue(strategy: 'CUSTOM')] + #[ORM\Column(type: UlidType::NAME, unique: true)] + #[ORM\CustomIdGenerator(class: UlidGenerator::class)] + private Ulid|null $id = null; - #[Groups(['food_order:latest'])] - #[ORM\Column(length: 255, nullable: true)] - private string|null $extras = null; - - #[ORM\JoinColumn(nullable: true)] - #[ORM\ManyToOne(inversedBy: 'orderItems')] - private FoodOrder|null $foodOrder = null; - - #[Groups('food_order:latest')] - #[ORM\Column(type: 'boolean', options: [ - 'default' => false, - ])] - private bool $isPaid = false; - - #[Groups(['food_order:latest'])] - #[ORM\JoinColumn(nullable: false)] - #[ORM\ManyToOne] - private MenuItem|null $menuItem = null; - - #[Groups(['food_order:latest'])] #[ORM\Column(length: 255)] private string|null $name = null; - #[Groups('food_order:latest')] - #[ORM\Column(type: 'integer', options: [ - 'default' => 0, - ])] - #[Positive] - private int $priceCents = 0; + #[ORM\Column(length: 255, nullable: true)] + private string|null $extras = null; - public function __construct( - #[Groups(['food_order:latest'])] - #[ORM\Column(type: UlidType::NAME, unique: true)] - #[ORM\CustomIdGenerator(class: UlidGenerator::class)] - #[ORM\GeneratedValue(strategy: 'CUSTOM')] - #[ORM\Id] - private Ulid|null $id = new Ulid - ) { - $this->id ??= new Ulid; - } - - public function getCreatedBy(): string|null - { - return $this->createdBy; - } - - public function getExtras(): string|null - { - return $this->extras; - } - - public function getFoodOrder(): FoodOrder|null - { - return $this->foodOrder; - } + #[ORM\ManyToOne(inversedBy: 'orderItems')] + #[ORM\JoinColumn(nullable: false)] + private FoodOrder|null $foodOrder = null; public function getId(): Ulid|null { return $this->id; } - public function getMenuItem(): MenuItem|null - { - return $this->menuItem; - } - public function getName(): string|null { return $this->name; } - public function getPriceCents(): int - { - return $this->priceCents; - } - - public function isPaid(): bool - { - return $this->isPaid; - } - - public function setCreatedBy(string $createdBy): static - { - $this->createdBy = $createdBy; - - return $this; - } - - public function setExtras(string|null $extras): static - { - $this->extras = $extras; - - return $this; - } - - public function setFoodOrder(FoodOrder|null $foodOrder): static - { - $this->foodOrder = $foodOrder; - - return $this; - } - - public function setIsPaid(bool $isPaid): self - { - $this->isPaid = $isPaid; - return $this; - } - - public function setMenuItem(MenuItem|null $menuItem): static - { - $this->menuItem = $menuItem; - $this->name = $menuItem->getName(); - - return $this; - } - public function setName(string $name): static { $this->name = $name; @@ -143,9 +44,27 @@ class OrderItem return $this; } - public function setPriceCents(int $priceCents): self + public function getExtras(): string|null { - $this->priceCents = $priceCents; + return $this->extras; + } + + public function setExtras(string|null $extras): static + { + $this->extras = $extras; + + return $this; + } + + public function getFoodOrder(): FoodOrder|null + { + return $this->foodOrder; + } + + public function setFoodOrder(FoodOrder|null $foodOrder): static + { + $this->foodOrder = $foodOrder; + return $this; } } diff --git a/src/EventListener/OrderItemPreFlush.php b/src/EventListener/OrderItemPreFlush.php deleted file mode 100644 index d872300..0000000 --- a/src/EventListener/OrderItemPreFlush.php +++ /dev/null @@ -1,52 +0,0 @@ -getObjectManager()->getUnitOfWork()->getIdentityMap()[OrderItem::class] ?? []) as $orderItem) { - $this->checkOrderItem($orderItem, $eventArgs->getObjectManager()); - } - } - - private function checkOrderItem(OrderItem $orderItem, ObjectManager $objectManager): void - { - $menuItem = $this->menuItemRepository->findOneBy([ - 'name' => $orderItem->getName(), - 'foodVendor' => $orderItem->getFoodOrder() - ->getFoodVendor(), - ]); - if ($menuItem === null) { - $menuItem = new MenuItem; - $menuItem->setName($orderItem->getName()); - $menuItem->setFoodVendor($orderItem->getFoodOrder()->getFoodVendor()); - $objectManager->persist($menuItem); - } - if ($menuItem->getAliasOf() !== null) { - $menuItem = $menuItem->getAliasOf(); - $orderItem->setName($menuItem->getName()); - } - $orderItem->setMenuItem($menuItem); - if ($orderItem->getPriceCents() === 0) { - $orderItem->setPriceCents($menuItem->getPriceCents()); - } elseif ($orderItem->getPriceCents() !== $menuItem->getPriceCents()) { - $menuItem->setPriceCents($orderItem->getPriceCents()); - $objectManager->persist($menuItem); - } - } -} diff --git a/src/Form/FoodOrderType.php b/src/Form/FoodOrderType.php index 73eee66..bfe9dc4 100644 --- a/src/Form/FoodOrderType.php +++ b/src/Form/FoodOrderType.php @@ -2,11 +2,13 @@ namespace App\Form; +use App\Entity\FoodOrder; use App\Entity\FoodVendor; use Override; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\OptionsResolver\OptionsResolver; final class FoodOrderType extends AbstractType { @@ -19,14 +21,17 @@ final class FoodOrderType extends AbstractType 'class' => FoodVendor::class, 'choice_label' => 'name', ]) - ->add(child: 'closedAt', options: [ - 'label' => 'closes at', - 'view_timezone' => 'Europe/Berlin', - ]) - ->add(child: 'createdBy') ; if ($action !== null) { $builder->setAction($action); } } + + #[Override] + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => FoodOrder::class, + ]); + } } diff --git a/src/Form/FoodVendorType.php b/src/Form/FoodVendorType.php index 466d9e2..fcbdce4 100644 --- a/src/Form/FoodVendorType.php +++ b/src/Form/FoodVendorType.php @@ -15,9 +15,6 @@ final class FoodVendorType extends AbstractType { $builder ->add('name') - ->add('menuLink') - ->add('phone') - ->add('emojis') ; } diff --git a/src/Form/MenuItemType.php b/src/Form/MenuItemType.php deleted file mode 100644 index 53039b6..0000000 --- a/src/Form/MenuItemType.php +++ /dev/null @@ -1,54 +0,0 @@ -add('name', TextType::class, [ - 'constraints' => [ - new NotBlank, - new Length([ - 'min' => 3, - ]), - ], - ]); - $builder->add('priceCents', MoneyType::class, [ - 'label' => 'Price', - 'divisor' => 100, - ]); - $builder->add('aliases', EntityType::class, [ - 'class' => MenuItem::class, - 'choice_label' => 'name', - 'multiple' => true, - 'expanded' => true, - 'query_builder' => static fn(MenuItemRepository $repository): QueryBuilder - => $repository->getSuitableAliasQueryBuilder($item), - ]); - } - - #[Override] - public function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults([ - 'data_class' => MenuItem::class, - ]); - } -} diff --git a/src/Form/OrderFinalize.php b/src/Form/OrderFinalize.php deleted file mode 100644 index 2faafdf..0000000 --- a/src/Form/OrderFinalize.php +++ /dev/null @@ -1,32 +0,0 @@ -add('orderItems', CollectionType::class, [ - 'entry_type' => OrderItemFinalize::class, - 'entry_options' => [ - 'label' => false, - ], - ]) - ->add('save', SubmitType::class) - ; - } - - public function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults([ - 'data_class' => FoodOrder::class, - ]); - } -} diff --git a/src/Form/OrderItemFinalize.php b/src/Form/OrderItemFinalize.php deleted file mode 100644 index f4627a9..0000000 --- a/src/Form/OrderItemFinalize.php +++ /dev/null @@ -1,44 +0,0 @@ -add(child: 'name', options: [ - 'label' => 'order item', - 'disabled' => true, - ]) - ->add(child: 'extras', options: [ - 'disabled' => true, - ]) - ->add(child: 'createdBy', options: [ - 'disabled' => true, - ]) - ->add(child: 'priceCents', type: MoneyType::class, options: [ - 'label' => 'price', - 'divisor' => 100, - ]) - ->add(child: 'isPaid', type: CheckboxType::class, options: [ - 'required' => false, - 'label' => 'paid?', - ]) - ; - } - - public function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults([ - 'data_class' => OrderItem::class, - ]); - } -} diff --git a/src/Form/OrderItemType.php b/src/Form/OrderItemType.php index 49906aa..4716baf 100644 --- a/src/Form/OrderItemType.php +++ b/src/Form/OrderItemType.php @@ -14,13 +14,8 @@ final class OrderItemType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $builder - ->add(child: 'name', options: [ - 'label' => 'order item', - ]) - ->add(child: 'extras') - ->add(child: 'createdBy', options: [ - 'label' => 'your name', - ]) + ->add('name') + ->add('extras') ; } diff --git a/src/Form/UserNameFormType.php b/src/Form/UserNameFormType.php deleted file mode 100644 index 292be12..0000000 --- a/src/Form/UserNameFormType.php +++ /dev/null @@ -1,18 +0,0 @@ -add(child: 'username') - ; - } -} diff --git a/src/Kernel.php b/src/Kernel.php index 68a0d17..3a21183 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -8,15 +8,4 @@ use Symfony\Component\HttpKernel\Kernel as BaseKernel; final class Kernel extends BaseKernel { use MicroKernelTrait; - - public function __construct( - protected string $environment, - protected bool $debug, - ) { - parent::__construct($environment, $debug); - if ($environment === 'test') { - $this->debug = false; - } - - } } diff --git a/src/Repository/FoodOrderRepository.php b/src/Repository/FoodOrderRepository.php index a781506..4438819 100644 --- a/src/Repository/FoodOrderRepository.php +++ b/src/Repository/FoodOrderRepository.php @@ -3,10 +3,7 @@ namespace App\Repository; use App\Entity\FoodOrder; -use DateInterval; -use DateTimeImmutable; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; -use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Persistence\ManagerRegistry; /** @@ -19,56 +16,26 @@ final class FoodOrderRepository extends ServiceEntityRepository parent::__construct($registry, FoodOrder::class); } - /** - * @return FoodOrder[] - */ - public function findLatestEntries(int $page = 1, int $pagesize = 10, int $days = 4): array - { - - $result = $this->createQueryBuilder('alias') - ->orderBy('alias.id', 'DESC') - ->setFirstResult(($page - 1) * $pagesize) - ->setMaxResults($pagesize) - ->getQuery() - ->getResult(); - - if ($days < 1) { - return $result; - } - - $date = (new DateTimeImmutable)->sub(new DateInterval('P' . $days . 'D')); - return (new ArrayCollection($result)) - ->filter(static fn(FoodOrder $order): bool => $order->getCreatedAt() >= $date) - ->getValues(); - } - - public function findLatestOrder(): FoodOrder|null - { - return $this->createQueryBuilder('alias') - ->orderBy('alias.id', 'DESC') - ->setMaxResults(1) - ->getQuery() - ->getOneOrNullResult(); - } - - /** - * @return FoodOrder[] - */ - public function findOpenOrders(): array - { - $now = new DateTimeImmutable; - - return $this->createQueryBuilder('o') - ->where('o.closedAt IS NULL OR o.closedAt > :now') - ->setParameter('now', $now) - ->orderBy('o.id', 'DESC') - ->getQuery() - ->getResult(); - } - - public function save(): void + public function save(FoodOrder $order): void { + $this->getEntityManager() + ->persist($order); $this->getEntityManager() ->flush(); } + + /** + * @return FoodOrder[] + */ + public function findLatestEntries(int $limit = 10): array + { + $qb = $this->createQueryBuilder('alias'); + + $qb->orderBy('alias.id', 'DESC'); + $qb->setMaxResults($limit); + + $query = $qb->getQuery(); + + return $query->getResult(); + } } diff --git a/src/Repository/MenuItemRepository.php b/src/Repository/MenuItemRepository.php deleted file mode 100644 index b207856..0000000 --- a/src/Repository/MenuItemRepository.php +++ /dev/null @@ -1,49 +0,0 @@ - - */ -final class MenuItemRepository extends ServiceEntityRepository -{ - public function __construct(ManagerRegistry $registry) - { - parent::__construct($registry, MenuItem::class); - } - - public function getSuitableAliasQueryBuilder(MenuItem $menuItem): QueryBuilder - { - $ids = $this->createQueryBuilder('m') - ->select('DISTINCT IDENTITY(m.aliasOf)') - ->where('m.deletedAt IS NULL') - ->andWhere('m.aliasOf IS NOT NULL') - ->getquery(); - $ids = $ids->getScalarResult(); - $ids = array_map(static fn(array $id): Ulid => Ulid::fromBinary($id[1]), $ids); - - $qb = $this->createQueryBuilder('m'); - $qb - ->where('m.foodVendor = :vendorId') - ->andWhere('m.deletedAt IS NULL') - ->andWhere('m.id != :id'); - foreach ($ids as $key => $id) { - $qb->andWhere("m.id != :idBy{$key}") - ->setParameter("idBy{$key}", $id, UlidType::NAME); - } - $qb - ->orderBy('m.name', 'ASC') - ->setParameter('vendorId', $menuItem->getFoodVendor()->getId(), UlidType::NAME) - ->setParameter('id', $menuItem->getId(), UlidType::NAME); - return $qb; - } -} diff --git a/src/Service/FakeData.php b/src/Service/FakeData.php new file mode 100644 index 0000000..379f8e7 --- /dev/null +++ b/src/Service/FakeData.php @@ -0,0 +1,100 @@ +orderItemRepository->findAll() as $item) { + $this->entityManager->remove($item); + } + foreach ($this->foodOrderRepository->findAll() as $item) { + $this->entityManager->remove($item); + } + foreach ($this->foodVendorRepository->findAll() as $item) { + $this->entityManager->remove($item); + } + } + + public function generate(int $vendorAmount = 3, int $orderAmount = 4, int $itemAmount = 10): void + { + $vendors = $this->generateVendors($vendorAmount); + foreach ($vendors as $vendor) { + $orders = $this->generateOrdersForVendor($vendor, $orderAmount); + foreach ($orders as $order) { + $this->generateItemsForOrder($order, $itemAmount); + } + } + $this->entityManager->flush(); + } + + /** + * @return FoodVendor[] + */ + public function generateVendors(int $amount = 10): array + { + $vendors = []; + foreach (range(1, $amount) as $i) { + $vendor = new FoodVendor; + $vendor->setName('Food Vendor ' . $i); + $this->entityManager->persist($vendor); + $vendors[] = $vendor; + } + return $vendors; + } + + /** + * @return FoodOrder[] + */ + public function generateOrdersForVendor(FoodVendor $vendor, int $amount = 10): array + { + $orders = []; + foreach (range(1, $amount) as $i) { + $order = new FoodOrder; + $order->setFoodVendor($vendor); + if ($i % 2 === 0) { + $order->close(); + } + $this->entityManager->persist($order); + $orders[] = $order; + } + return $orders; + } + + /** + * @return OrderItem[] + */ + public function generateItemsForOrder(FoodOrder $order, int $amount = 10): array + { + $items = []; + foreach (range(1, $amount) as $i) { + $item = new OrderItem; + $item->setName('Item ' . $i); + $item->setFoodOrder($order); + if ($i % 2 === 0) { + $item->setExtras('Extra ' . $i); + } + $this->entityManager->persist($item); + $items[] = $item; + } + return $items; + } +} diff --git a/src/Service/Favicon.php b/src/Service/Favicon.php deleted file mode 100644 index 3c63661..0000000 --- a/src/Service/Favicon.php +++ /dev/null @@ -1,18 +0,0 @@ -repository->findLatestOrder(); - } -} diff --git a/src/State/OpenOrdersProvider.php b/src/State/OpenOrdersProvider.php deleted file mode 100644 index 6223a74..0000000 --- a/src/State/OpenOrdersProvider.php +++ /dev/null @@ -1,25 +0,0 @@ -repository->findOpenOrders(); - } -} diff --git a/symfony.lock b/symfony.lock index b1afc0d..ff8e7ce 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,34 +1,11 @@ { - "api-platform/symfony": { - "version": "4.1", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "4.0", - "ref": "e9952e9f393c2d048f10a78f272cd35e807d972b" - }, - "files": [ - "config/packages/api_platform.yaml", - "config/routes/api_platform.yaml", - "src/ApiResource/.gitignore" - ] - }, - "doctrine/deprecations": { - "version": "1.1", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "1.0", - "ref": "87424683adc81d7dc305eefec1fced883084aab9" - } - }, "doctrine/doctrine-bundle": { - "version": "2.14", + "version": "2.12", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "2.13", - "ref": "620b57f496f2e599a6015a9fa222c2ee0a32adcb" + "version": "2.12", + "ref": "7266981c201efbbe02ae53c87f8bb378e3f825ae" }, "files": [ "config/packages/doctrine.yaml", @@ -36,20 +13,8 @@ "src/Repository/.gitignore" ] }, - "doctrine/doctrine-fixtures-bundle": { - "version": "4.1", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "3.0", - "ref": "1f5514cfa15b947298df4d771e694e578d4c204d" - }, - "files": [ - "src/DataFixtures/AppFixtures.php" - ] - }, "doctrine/doctrine-migrations-bundle": { - "version": "3.4", + "version": "3.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -61,77 +26,40 @@ "migrations/.gitignore" ] }, - "liip/test-fixtures-bundle": { - "version": "3.4.0" - }, - "nelmio/cors-bundle": { - "version": "2.5", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "1.5", - "ref": "6bea22e6c564fba3a1391615cada1437d0bde39c" - }, - "files": [ - "config/packages/nelmio_cors.yaml" - ] - }, "phpstan/phpstan": { - "version": "1.12", + "version": "1.11", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", "version": "1.0", "ref": "5e490cc197fb6bb1ae22e5abbc531ddc633b6767" - }, - "files": [ - "phpstan.dist.neon" - ] + } }, "phpunit/phpunit": { - "version": "11.5", + "version": "9.6", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "11.1", - "ref": "c6658a60fc9d594805370eacdf542c3d6b5c0869" + "version": "9.6", + "ref": "7364a21d87e658eb363c5020c072ecfdc12e2326" }, "files": [ ".env.test", "phpunit.xml.dist", - "tests/bootstrap.php", - "bin/phpunit" + "tests/bootstrap.php" ] }, "squizlabs/php_codesniffer": { - "version": "3.13", + "version": "3.10", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", "version": "3.6", "ref": "1019e5c08d4821cb9b77f4891f8e9c31ff20ac6f" - }, - "files": [ - "phpcs.xml.dist" - ] - }, - "symfony/asset-mapper": { - "version": "7.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "6.4", - "ref": "5ad1308aa756d58f999ffbe1540d1189f5d7d14a" - }, - "files": [ - "assets/app.js", - "assets/styles/app.css", - "config/packages/asset_mapper.yaml", - "importmap.php" - ] + } }, "symfony/console": { - "version": "7.3", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -143,37 +71,24 @@ ] }, "symfony/flex": { - "version": "2.7", + "version": "2.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "2.4", - "ref": "52e9754527a15e2b79d9a610f98185a1fe46622a" + "version": "1.0", + "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172" }, "files": [ - ".env", - ".env.dev" - ] - }, - "symfony/form": { - "version": "7.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "7.2", - "ref": "7d86a6723f4a623f59e2bf966b6aad2fc461d36b" - }, - "files": [ - "config/packages/csrf.yaml" + ".env" ] }, "symfony/framework-bundle": { - "version": "7.3", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "7.3", - "ref": "5a1497d539f691b96afd45ae397ce5fe30beb4b9" + "version": "7.0", + "ref": "6356c19b9ae08e7763e4ba2d9ae63043efc75db5" }, "files": [ "config/packages/cache.yaml", @@ -183,12 +98,11 @@ "config/services.yaml", "public/index.php", "src/Controller/.gitignore", - "src/Kernel.php", - ".editorconfig" + "src/Kernel.php" ] }, "symfony/maker-bundle": { - "version": "1.63", + "version": "1.60", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -196,32 +110,23 @@ "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" } }, - "symfony/monolog-bundle": { - "version": "3.10", + "symfony/phpunit-bridge": { + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "3.7", - "ref": "aff23899c4440dd995907613c1dd709b6f59503f" + "version": "6.3", + "ref": "a411a0480041243d97382cac7984f7dce7813c08" }, "files": [ - "config/packages/monolog.yaml" - ] - }, - "symfony/property-info": { - "version": "7.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "7.3", - "ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7" - }, - "files": [ - "config/packages/property_info.yaml" + ".env.test", + "bin/phpunit", + "phpunit.xml.dist", + "tests/bootstrap.php" ] }, "symfony/routing": { - "version": "7.3", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -233,21 +138,8 @@ "config/routes.yaml" ] }, - "symfony/security-bundle": { - "version": "7.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "6.4", - "ref": "2ae08430db28c8eb4476605894296c82a642028f" - }, - "files": [ - "config/packages/security.yaml", - "config/routes/security.yaml" - ] - }, "symfony/twig-bundle": { - "version": "7.3", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -260,7 +152,7 @@ ] }, "symfony/uid": { - "version": "7.3", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -269,7 +161,7 @@ } }, "symfony/validator": { - "version": "7.3", + "version": "7.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -279,21 +171,5 @@ "files": [ "config/packages/validator.yaml" ] - }, - "symfony/web-profiler-bundle": { - "version": "7.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "7.3", - "ref": "5b2b543e13942495c0003f67780cb4448af9e606" - }, - "files": [ - "config/packages/web_profiler.yaml", - "config/routes/web_profiler.yaml" - ] - }, - "twig/extra-bundle": { - "version": "v3.21.0" } } diff --git a/templates/_form.html.twig b/templates/_form.html.twig index e0ed7ee..bf20b98 100644 --- a/templates/_form.html.twig +++ b/templates/_form.html.twig @@ -1,4 +1,4 @@ -{{ form_start(form, {'attr': {'class': 'mb-3'}}) }} - {{ form_widget(form, {'attr': {'class': 'form-control'}}) }} - +{{ form_start(form) }} + {{ form_widget(form) }} + {{ form_end(form) }} diff --git a/templates/base.html.twig b/templates/base.html.twig index 6e78f0a..93a64b7 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -2,64 +2,25 @@ - {% block title %}Welcome!{% endblock %} - - {% block javascripts %} - {% block importmap %}{{ importmap('app') }}{% endblock %} - {% endblock %} + + + -
- -
-
- {% block body %}{% endblock %} -
- +
+ + +
+
+ {% block body %}{% endblock %} +
diff --git a/templates/food_order/edit.html.twig b/templates/food_order/edit.html.twig index 4fd87c3..8200420 100644 --- a/templates/food_order/edit.html.twig +++ b/templates/food_order/edit.html.twig @@ -3,12 +3,10 @@ {% block title %}Edit FoodOrder{% endblock %} {% block body %} -

Edit FoodOrder

+

Edit FoodOrder

-
- {{ include('_form.html.twig', {'button_label': 'Update'}) }} -
+ {{ include('_form.html.twig', {'button_label': 'Update'}) }} - back to list + back to list {% endblock %} diff --git a/templates/food_order/index.html.twig b/templates/food_order/index.html.twig index c214af6..1a80bb5 100644 --- a/templates/food_order/index.html.twig +++ b/templates/food_order/index.html.twig @@ -3,20 +3,11 @@ {% block title %}FoodOrder index{% endblock %} {% block body %} -

FoodOrder index

-
- -
-
- - +

FoodOrder index

+ +
+ - @@ -26,23 +17,18 @@ {% for food_order in food_orders %} {{ include('food_order/table_row.html.twig') }} - {% endfor %} - {% if food_orders|length < 10 %} + {% else %} - + - {% endif %} + {% endfor %}
CreatedBy Vendor CreatedAt ClosedAt
- check the archive - for older orders - no records found
-
- {% if prev_page > 0 %} - previous page - {% endif %} - {% if next_page > current_page %} - next page - {% endif %} +
+
{% endblock %} diff --git a/templates/food_order/new.html.twig b/templates/food_order/new.html.twig index d309283..72ed804 100644 --- a/templates/food_order/new.html.twig +++ b/templates/food_order/new.html.twig @@ -1,4 +1,2 @@ -
- {{ include('_form.html.twig') }} -
+{{ include('_form.html.twig') }} diff --git a/templates/food_order/show.html.twig b/templates/food_order/show.html.twig index 368b4b0..556de6a 100644 --- a/templates/food_order/show.html.twig +++ b/templates/food_order/show.html.twig @@ -3,104 +3,57 @@ {% block title %}FoodOrder{% endblock %} {% block body %} -

FoodOrder

+

FoodOrder

- +
- - - - - - - - - + - +
Vendor {{ food_order.foodVendor.name }}
Vendorphone{{ food_order.foodVendor.phone }}
Created By{{ food_order.createdBy }}
CreatedAt{{ food_order.createdAt ? food_order.createdAt|date('Y-m-d H:i:s', 'Europe/Berlin') : '' }}{{ food_order.createdAt ? food_order.createdAt|date('Y-m-d H:i:s') : '' }}
ClosedAt{{ food_order.closedAt ? food_order.closedAt|date('Y-m-d H:i:s', 'Europe/Berlin') : '' }}{{ food_order.closedAt ? food_order.closedAt|date('Y-m-d H:i:s') : '' }}
-
- back to list - {% if(food_order.isClosed) %} - reopen - {% else %} - close - {% endif %} -
- -

Items

- {% if (food_order.isClosed and form) %} - {{ form_start(form) }} -
- - - - - - - - - - - - {% for itemForm in form.orderItems %} - - - - - - - - {% endfor %} - - - - - -
Byitemextraspriceis paid
{{ field_value(itemForm.createdBy) }}{{ field_value(itemForm.name) }}{{ field_value(itemForm.extras) }}{{ form_widget(itemForm.priceCents) }}{{ form_widget(itemForm.isPaid) }}
{{ form_row(form.save) }} {{ form_row(form._token) }}
-
- {{ form_end(form, {render_rest: false}) }} + back to list + {% if(food_order.isClosed) %} + reopen {% else %} - - + close + {% endif %} + +

Items

+
+ - - - {% for item in food_order.orderItemsSortedByName %} + {% for item in food_order.orderItems %} - - {% endfor %}
Indexusername name extras actions
{{ loop.index }}{{ item.createdBy }} {{ item.name }} {{ item.extras }} {% if(food_order.isClosed) %} {% else %} - edit - copy - remove + edit + copy + remove {% endif %}
- {% endif %} - New Item + New Item {% endblock %} diff --git a/templates/food_order/table_row.html.twig b/templates/food_order/table_row.html.twig index 3e0302f..e42bcb9 100644 --- a/templates/food_order/table_row.html.twig +++ b/templates/food_order/table_row.html.twig @@ -1,18 +1,8 @@ -{% set opacity = food_order.isClosed ? 'opacity-25' : 'opacity-100' %} - + + {{ food_order.foodVendor.name }} + {{ food_order.createdAt ? food_order.createdAt|date('Y-m-d H:i:s') : '' }} + {{ food_order.closedAt ? food_order.closedAt|date('Y-m-d H:i:s') : '' }} - {{ food_order.createdBy }} - - - {{ food_order.foodVendor.name }} - - - {{ food_order.createdAt ? food_order.createdAt|date('Y-m-d H:i:s', 'Europe/Berlin') : '' }} - - - {{ food_order.closedAt ? food_order.closedAt|date('Y-m-d H:i:s', 'Europe/Berlin') : '' }} - - - show + show \ No newline at end of file diff --git a/templates/food_vendor/_form.html.twig b/templates/food_vendor/_form.html.twig index e0ed7ee..bf20b98 100644 --- a/templates/food_vendor/_form.html.twig +++ b/templates/food_vendor/_form.html.twig @@ -1,4 +1,4 @@ -{{ form_start(form, {'attr': {'class': 'mb-3'}}) }} - {{ form_widget(form, {'attr': {'class': 'form-control'}}) }} - +{{ form_start(form) }} + {{ form_widget(form) }} + {{ form_end(form) }} diff --git a/templates/food_vendor/edit.html.twig b/templates/food_vendor/edit.html.twig index 51daaf7..3adde61 100644 --- a/templates/food_vendor/edit.html.twig +++ b/templates/food_vendor/edit.html.twig @@ -3,127 +3,9 @@ {% block title %}Edit FoodVendor{% endblock %} {% block body %} -

Edit FoodVendor

+

Edit FoodVendor

-
- {{ include('food_vendor/_form.html.twig', {'button_label': 'Update'}) }} -
+ {{ include('food_vendor/_form.html.twig', {'button_label': 'Update'}) }} -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - back to list + back to list {% endblock %} diff --git a/templates/food_vendor/index.html.twig b/templates/food_vendor/index.html.twig index 8857c40..1cb1701 100644 --- a/templates/food_vendor/index.html.twig +++ b/templates/food_vendor/index.html.twig @@ -3,11 +3,12 @@ {% block title %}FoodVendor index{% endblock %} {% block body %} -

FoodVendor index

+

FoodVendor index

- - +
+ + @@ -15,19 +16,20 @@ {% for food_vendor in food_vendors %} + {% else %} - + {% endfor %}
Id Name actions
{{ food_vendor.id }} {{ food_vendor.name }} - show - edit + show + edit
no records foundno records found
- Create new + Create new {% endblock %} diff --git a/templates/food_vendor/new.html.twig b/templates/food_vendor/new.html.twig index 8f2d532..44e3602 100644 --- a/templates/food_vendor/new.html.twig +++ b/templates/food_vendor/new.html.twig @@ -3,11 +3,9 @@ {% block title %}New FoodVendor{% endblock %} {% block body %} -

Create new FoodVendor

+

Create new FoodVendor

-
- {{ include('food_vendor/_form.html.twig') }} -
+ {{ include('food_vendor/_form.html.twig') }} - back to list + back to list {% endblock %} diff --git a/templates/food_vendor/show.html.twig b/templates/food_vendor/show.html.twig index 51c7e6d..a14b226 100644 --- a/templates/food_vendor/show.html.twig +++ b/templates/food_vendor/show.html.twig @@ -3,37 +3,22 @@ {% block title %}FoodVendor{% endblock %} {% block body %} -

FoodVendor

+

FoodVendor

- +
+ + + + - - - -
Id{{ food_vendor.id }}
Name {{ food_vendor.name }}
Menu{{ food_vendor.menuLink }}
-
-

known menuitems

-
    - {% for item in food_vendor.menuItems %} -
  • - {{ item.name }} - {% if(item.aliasOf) %} - (alias of: {{ item.aliasOf.name }}) - {% endif %} -
  • - {% endfor %} -
-
+ back to list - + edit {% endblock %} diff --git a/templates/menu_item/_delete_form.html.twig b/templates/menu_item/_delete_form.html.twig deleted file mode 100644 index 1a820c8..0000000 --- a/templates/menu_item/_delete_form.html.twig +++ /dev/null @@ -1,4 +0,0 @@ -
- - -
diff --git a/templates/menu_item/_form.html.twig b/templates/menu_item/_form.html.twig deleted file mode 100644 index e0ed7ee..0000000 --- a/templates/menu_item/_form.html.twig +++ /dev/null @@ -1,4 +0,0 @@ -{{ form_start(form, {'attr': {'class': 'mb-3'}}) }} - {{ form_widget(form, {'attr': {'class': 'form-control'}}) }} - -{{ form_end(form) }} diff --git a/templates/menu_item/edit.html.twig b/templates/menu_item/edit.html.twig deleted file mode 100644 index c1c755e..0000000 --- a/templates/menu_item/edit.html.twig +++ /dev/null @@ -1,15 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block title %}Edit MenuItem{% endblock %} - -{% block body %} -

Edit MenuItem

- -
- {{ include('menu_item/_form.html.twig', {'button_label': 'Update'}) }} -
- -
- {{ include('menu_item/_delete_form.html.twig') }} -
-{% endblock %} diff --git a/templates/menu_item/index.html.twig b/templates/menu_item/index.html.twig deleted file mode 100644 index 26cb0a4..0000000 --- a/templates/menu_item/index.html.twig +++ /dev/null @@ -1,35 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block title %}MenuItem index{% endblock %} - -{% block body %} -

MenuItem index

- - - - - - - - - - - {% for menu_item in menu_items %} - - - - - - {% else %} - - - - {% endfor %} - -
IdNameactions
{{ menu_item.id }}{{ menu_item.name }} - show - edit -
no records found
- - Create new -{% endblock %} diff --git a/templates/menu_item/new.html.twig b/templates/menu_item/new.html.twig deleted file mode 100644 index 0c42fd8..0000000 --- a/templates/menu_item/new.html.twig +++ /dev/null @@ -1,13 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block title %}New MenuItem{% endblock %} - -{% block body %} -

Create new MenuItem

- -
- {{ include('menu_item/_form.html.twig') }} -
- - back to list -{% endblock %} diff --git a/templates/menu_item/show.html.twig b/templates/menu_item/show.html.twig deleted file mode 100644 index 973fd91..0000000 --- a/templates/menu_item/show.html.twig +++ /dev/null @@ -1,48 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block title %}MenuItem{% endblock %} - -{% block body %} -

MenuItem

- - - - - - - - - - - - - - - - {% if(menu_item.aliasOf) %} - - - - - {% endif %} - {% if(menu_item.aliases|length > 0) %} - - - - - {% endif %} - -
Id{{ menu_item.id }}
Name{{ menu_item.name }}
Price{{ (menu_item.priceCents / 100)|format_currency('EUR') }}
Alias of{{ menu_item.aliasOf.name }}
Aliases -
    - {% for alias in menu_item.aliases %} -
  • {{ alias.name }}
  • - {% endfor %} -
-
- -
- back to list - edit - {{ include('menu_item/_delete_form.html.twig') }} -
-{% endblock %} diff --git a/templates/order_item/_form.html.twig b/templates/order_item/_form.html.twig index e0ed7ee..bf20b98 100644 --- a/templates/order_item/_form.html.twig +++ b/templates/order_item/_form.html.twig @@ -1,4 +1,4 @@ -{{ form_start(form, {'attr': {'class': 'mb-3'}}) }} - {{ form_widget(form, {'attr': {'class': 'form-control'}}) }} - +{{ form_start(form) }} + {{ form_widget(form) }} + {{ form_end(form) }} diff --git a/templates/order_item/edit.html.twig b/templates/order_item/edit.html.twig index 5eb4309..2f85f44 100644 --- a/templates/order_item/edit.html.twig +++ b/templates/order_item/edit.html.twig @@ -3,11 +3,9 @@ {% block title %}Edit OrderItem{% endblock %} {% block body %} -

Edit OrderItem

+

Edit OrderItem

-
- {{ include('order_item/_form.html.twig', {'button_label': 'Update'}) }} -
+ {{ include('order_item/_form.html.twig', {'button_label': 'Update'}) }} - back to list + back to list {% endblock %} diff --git a/templates/order_item/new.html.twig b/templates/order_item/new.html.twig index 0418010..bd4ac99 100644 --- a/templates/order_item/new.html.twig +++ b/templates/order_item/new.html.twig @@ -3,39 +3,9 @@ {% block title %}New OrderItem{% endblock %} {% block body %} -

Create new OrderItem

+

Create new OrderItem

-
- {{ include('order_item/_form.html.twig') }} -
+ {{ include('order_item/_form.html.twig') }} -
- - {% if food_order.foodVendor.menuLink != '' %} - - External link to Menu - - {% endif %} - -
- click a button to select a given menuitem -
-
- {% for menuItem in menuItems %} - {{ menuItem.name }} - {% endfor %} -
- -
- - back to list - - + back to list {% endblock %} diff --git a/templates/username.html.twig b/templates/username.html.twig deleted file mode 100644 index 2ebc1c9..0000000 --- a/templates/username.html.twig +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block title %}Tell me your name{% endblock %} - -{% block body %} -

Tell me your name

-

By submitting the form, you agree that your username will be stored as a cookie.

-
- {{ include('_form.html.twig') }} -
-{% endblock %} \ No newline at end of file diff --git a/tests/Controller/FoodOrderControllerTest.php b/tests/Controller/FoodOrderControllerTest.php new file mode 100644 index 0000000..9e72792 --- /dev/null +++ b/tests/Controller/FoodOrderControllerTest.php @@ -0,0 +1,67 @@ +vendor = new FoodVendor; + $this->vendor->setName('Food Vendor'); + + $this->manager->persist($this->vendor); + $this->manager->flush(); + } + + #[Override] + public function getEntityClass(): string + { + return FoodOrder::class; + } + + public function testIndex(): void + { + $order = new FoodOrder; + $order->setFoodVendor($this->vendor); + + $this->manager->persist($order); + $this->manager->persist($this->vendor); + $this->manager->flush(); + + $crawler = $this->client->request('GET', $this->path); + self::assertResponseStatusCodeSame(200); + self::assertPageTitleContains('FoodOrder index'); + $this->assertCount( + 1, + $crawler->filter('td') + ->reduce(fn(Crawler $node, $i): bool => $node->text() === $this->vendor->getName()), + ); + } + + public function testNew(): void + { + $this->client->request('GET', sprintf('%snew', $this->path)); + + self::assertResponseStatusCodeSame(200); + + $this->client->submitForm('Save', [ + 'food_order[foodVendor]' => $this->vendor->getId(), + ]); + + self::assertResponseRedirects($this->path); + self::assertSame(1, $this->repository->count([])); + } +} diff --git a/tests/Controller/FoodVendorControllerTest.php b/tests/Controller/FoodVendorControllerTest.php new file mode 100644 index 0000000..42ef9f9 --- /dev/null +++ b/tests/Controller/FoodVendorControllerTest.php @@ -0,0 +1,78 @@ +client->request('GET', $this->path); + + self::assertResponseStatusCodeSame(200); + self::assertPageTitleContains('FoodVendor index'); + } + + public function testNew(): void + { + $this->client->request('GET', sprintf('%snew', $this->path)); + + self::assertResponseStatusCodeSame(200); + + $this->client->submitForm('Save', [ + 'food_vendor[name]' => 'Testing', + ]); + + self::assertSame(1, $this->repository->count([])); + } + + public function testShow(): void + { + $fixture = new FoodVendor; + $fixture->setName('My Title'); + + $this->manager->persist($fixture); + $this->manager->flush(); + + $crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId())); + + $this->assertResponseIsSuccessful(); + $nameNode = $crawler->filter('td') + ->last(); + $this->assertSame('My Title', $nameNode->text()); + } + + public function testEdit(): void + { + $fixture = new FoodVendor; + $fixture->setName('Value'); + + $this->manager->persist($fixture); + $this->manager->flush(); + + $this->client->request('GET', sprintf('%s%s/edit', $this->path, $fixture->getId())); + + $this->client->submitForm('Update', [ + 'food_vendor[name]' => 'Something New', + ]); + + self::assertResponseRedirects('/food/vendor/'); + + $fixture = $this->repository->findAll(); + + self::assertSame('Something New', $fixture[0]->getName()); + } + + #[Override] + public function getEntityClass(): string + { + return FoodVendor::class; + } +} diff --git a/tests/Controller/OrderItemControllerTest.php b/tests/Controller/OrderItemControllerTest.php new file mode 100644 index 0000000..c8762df --- /dev/null +++ b/tests/Controller/OrderItemControllerTest.php @@ -0,0 +1,98 @@ +vendor = new FoodVendor; + $this->vendor->setName('Food Vendor'); + + $this->manager->persist($this->vendor); + $this->order = new FoodOrder; + $this->order->setFoodVendor($this->vendor); + + $this->manager->persist($this->order); + $this->manager->flush(); + } + + public function testNew(): void + { + $this->client->request( + 'GET', + sprintf('%snew/%s', $this->path, $this->order->getId()) + ); + + self::assertResponseStatusCodeSame(200); + + $this->client->submitForm('Save', [ + 'order_item[name]' => 'Testing', + 'order_item[extras]' => 'Testing', + ]); + + self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); + + self::assertSame(1, $this->repository->count([])); + } + + public function testRemove(): void + { + $fixture = new OrderItem; + $fixture->setName('Value'); + $fixture->setExtras('Value'); + $fixture->setFoodOrder($this->order); + + $this->manager->persist($fixture); + $this->manager->flush(); + + $this->client->request('GET', sprintf('%sdelete/%s', $this->path, $fixture->getId())); + + self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); + self::assertSame(0, $this->repository->count([])); + } + + public function testCopy(): void + { + $orderItem = new OrderItem; + $orderItem->setName('My Title'); + $orderItem->setExtras('My Title'); + $orderItem->setFoodOrder($this->order); + + $this->manager->persist($orderItem); + $this->manager->flush(); + + $this->client->request('GET', sprintf('%s%s/copy', $this->path, $orderItem->getId())); + self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); + + $result = $this->repository->findBy([ + 'foodOrder' => $this->order->getId(), + ]); + $this->assertCount(2, $result); + foreach ($result as $item) { + $this->assertSame($orderItem->getName(), $item->getName()); + $this->assertSame($orderItem->getExtras(), $item->getExtras()); + } + + } + + #[Override] + public function getEntityClass(): string + { + return OrderItem::class; + } +} diff --git a/tests/DbWebTest.php b/tests/DbWebTest.php index 6751c3d..cbcf5c9 100644 --- a/tests/DbWebTest.php +++ b/tests/DbWebTest.php @@ -2,25 +2,19 @@ namespace App\Tests; -use DateInterval; -use DateTimeImmutable; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Tools\SchemaTool; use Override; use Symfony\Bundle\FrameworkBundle\KernelBrowser; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; -use Symfony\Component\DomCrawler\Crawler; -use Symfony\Component\Uid\Ulid; - -use function str_contains; abstract class DbWebTest extends WebTestCase { + abstract public function getEntityClass(): string; + protected KernelBrowser $client; - protected string $entityClass = ''; protected EntityManagerInterface $manager; - protected string $path = ''; protected EntityRepository $repository; #[Override] @@ -31,36 +25,13 @@ abstract class DbWebTest extends WebTestCase $schemaTool = new SchemaTool($this->manager); $metadata = $this->manager->getMetadataFactory() ->getAllMetadata(); - $schemaTool->dropDatabase(); $schemaTool->updateSchema($metadata); - } - protected function assertElementContainsCount(Crawler $crawler, string $element, int $count, string $text): void - { - $this->assertCount( - $count, - $crawler->filter($element) - ->reduce( - static fn(Crawler $node, $i): bool => str_contains($node->text(), $text), - ) - ); - } + $this->repository = $this->manager->getRepository($this->getEntityClass()); + foreach ($this->repository->findAll() as $object) { + $this->manager->remove($object); + } - protected function generateOldUlid(int $daysToSubtract = 10): Ulid - { - $date = (new DateTimeImmutable)->sub(new DateInterval('P' . $daysToSubtract . 'D')); - $ulidString = Ulid::generate($date); - return Ulid::fromString($ulidString); - } - - protected function setEntityClass(string $entityClass): void - { - $this->entityClass = $entityClass; - $this->repository = $this->manager->getRepository($this->entityClass); - } - - protected function setPath(string $path): void - { - $this->path = $path; + $this->manager->flush(); } } diff --git a/tests/Feature/Controller/FoodOrderControllerTest.php b/tests/Feature/Controller/FoodOrderControllerTest.php deleted file mode 100644 index 235b7d6..0000000 --- a/tests/Feature/Controller/FoodOrderControllerTest.php +++ /dev/null @@ -1,268 +0,0 @@ -beforeEach(function (): void { - $this->setEntityClass(FoodOrder::class); - $this->setPath('/food/order/'); - $this->repository = $this->manager->getRepository($this->entityClass); - $this->vendor = new FoodVendor; - $this->vendor->setName('Food Vendor'); - - $this->manager->persist($this->vendor); - $this->manager->flush(); - }); - -describe(FoodOrderController::class, function (): void { - test('index', function (): void { - $order = new FoodOrder; - $order->setFoodVendor($this->vendor); - - $this->manager->persist($order); - $this->manager->persist($this->vendor); - $this->manager->flush(); - - $crawler = $this->client->request('GET', "{$this->path}list"); - $this->assertResponseStatusCodeSame(200); - $this->assertPageTitleContains('FoodOrder index'); - $this->assertCount( - 1, - $crawler->filter('td') - ->reduce(fn(Crawler $node, $i): bool => $node->text() === $this->vendor->getName()), - ); - }); - - test('orderedItems', function (): void { - $order = new FoodOrder; - $order->setFoodVendor($this->vendor); - - $this->manager->persist($order); - $this->manager->persist($this->vendor); - - $menuItemA = new MenuItem; - $menuItemA->setName('A'); - $menuItemA->setFoodVendor($this->vendor); - - $this->manager->persist($menuItemA); - $itemA = new OrderItem; - $itemA->setMenuItem($menuItemA); - $itemA->setName($menuItemA->getName()); - - $order->addOrderItem($itemA); - $this->manager->persist($itemA); - - $menuItemC = new MenuItem; - $menuItemC->setName('C'); - $menuItemC->setFoodVendor($this->vendor); - - $this->manager->persist($menuItemC); - $itemC = new OrderItem; - $itemC->setMenuItem($menuItemC); - $itemC->setName($menuItemC->getName()); - - $order->addOrderItem($itemC); - $this->manager->persist($itemC); - - $menuItemB = new MenuItem; - $menuItemB->setName('B'); - $menuItemB->setFoodVendor($this->vendor); - - $this->manager->persist($menuItemB); - $itemB = new OrderItem; - $itemB->setMenuItem($menuItemB); - $itemB->setName($menuItemB->getName()); - - $order->addOrderItem($itemB); - $this->manager->persist($itemB); - - $this->manager->flush(); - - $crawler = $this->client->request('GET', "{$this->path}{$order->getId()}"); - $this->assertResponseIsSuccessful(); - $tdContent = $crawler->filter( - 'table.table-hover tbody tr:nth-child(1) td:nth-child(3)' - )->text(); - $this->assertEquals('A', $tdContent); - $tdContent = $crawler->filter( - 'table.table-hover tbody tr:nth-child(2) td:nth-child(3)' - )->text(); - $this->assertEquals('B', $tdContent); - $tdContent = $crawler->filter( - 'table.table-hover tbody tr:nth-child(3) td:nth-child(3)' - )->text(); - $this->assertEquals('C', $tdContent); - }); - - test('paginatedIndex', function (): void { - foreach (range(1, 35) as $i) { - $order = new FoodOrder($this->generateOldUlid()); - $order->setFoodVendor($this->vendor); - $order->close(); - $this->manager->persist($order); - - } - $this->manager->flush(); - $crawler = $this->client->request('GET', "{$this->path}list"); - $this->assertResponseStatusCodeSame(200); - $this->assertPageTitleContains('FoodOrder index'); - $this->assertElementContainsCount( - $crawler, - 'td', - 1, - 'older orders' - ); - $this->assertElementContainsCount( - $crawler, - 'td', - 0, - 'next page' - ); - }); - - test('paginatedFirstPage', function (int $page, int $prevPage, int $nextPage, int $items = 10): void { - foreach (range(1, 35) as $i) { - $order = new FoodOrder($this->generateOldUlid()); - $order->setFoodVendor($this->vendor); - $order->close(); - $this->manager->persist($order); - - } - $this->manager->flush(); - $crawler = $this->client->request('GET', "{$this->path}list/archive/{$page}"); - $this->assertResponseStatusCodeSame(200); - $this->assertPageTitleContains('FoodOrder index'); - $this->assertElementContainsCount( - $crawler, - 'td', - $items, - 'nobody' - ); - if ($prevPage > 0) { - $prevPage = $prevPage === 1 ? '' : "/{$prevPage}"; - $node = $crawler->filter('a') - ->reduce(static fn(Crawler $node, $i): bool => $node->text() === 'previous page') - ->first(); - $target = $node->attr('href'); - $this->assertTrue(str_ends_with((string) $target, $prevPage)); - } - if ($prevPage > 3) { - $node = $crawler->filter('a') - ->reduce(static fn(Crawler $node, $i): bool => $node->text() === 'next page') - ->first(); - $target = $node->attr('href'); - $this->assertTrue(str_ends_with((string) $target, "/{$nextPage}")); - } - }) - ->with( - [ - [1, 0, 2], - [2, 1, 3], - [3, 2, 4], - [4, 3, 0, 5], - ] - ); - - test('new', function (): void { - $this->client->getCookieJar() - ->set(new Cookie('username', 'Testing-1')); - $this->client->request('GET', sprintf('%snew', $this->path)); - - $this->assertResponseStatusCodeSame(200); - - $this->client->submitForm('Save', [ - 'food_order[foodVendor]' => $this->vendor->getId(), - ]); - - $this->assertResponseRedirects("{$this->path}list"); - $this->assertSame(1, $this->repository->count([])); - $order = $this->repository->findOneBy([ - 'createdBy' => 'Testing-1', - ]); - assert($order instanceof FoodOrder); - }); - - test('open', function (): void { - $order = new FoodOrder; - $order->setFoodVendor($this->vendor); - $order->close(); - - $this->assertTrue($order->isClosed()); - $this->manager->persist($order); - $this->manager->flush(); - - $this->client->request('GET', sprintf('%s%s/open', $this->path, $order->getId())); - $this->assertResponseRedirects("{$this->path}{$order->getId()}"); - $openOrder = $this->repository->find($order->getId()); - $this->assertFalse($openOrder->isClosed()); - }); - - test('close', function (): void { - $order = new FoodOrder; - $order->setClosedAt(); - $order->setFoodVendor($this->vendor); - - $this->assertFalse($order->isClosed()); - $this->manager->persist($order); - $this->manager->flush(); - - $this->client->request('GET', sprintf('%s%s/close', $this->path, $order->getId())); - $this->assertResponseRedirects("{$this->path}{$order->getId()}"); - $openOrder = $this->repository->find($order->getId()); - $this->assertTrue($openOrder->isClosed()); - }); - - test('orderRowOpacity', function (): void { - // Create an open order - $openOrder = new FoodOrder; - $openOrder->setFoodVendor($this->vendor); - - // Create a closed order - $closedOrder = new FoodOrder; - $closedOrder->setFoodVendor($this->vendor); - $closedOrder->close(); - - $this->manager->persist($openOrder); - $this->manager->persist($closedOrder); - $this->manager->flush(); - - $crawler = $this->client->request('GET', "{$this->path}list"); - $this->assertResponseIsSuccessful(); - - // In a real environment, closed orders would be displayed with opacity-25 class - // and open orders with opacity-100 class as defined in the table_row.html.twig template. - // However, in the test environment, we can only verify that the orders are displayed. - - // Verify that we have the expected number of table rows (2 orders + 1 archive link row) - $this->assertCount(1, $crawler->filter('tr.opacity-100')); - }); -}) - ->covers( - FoodOrderController::class, - FoodOrder::class, - FoodVendor::class, - FoodOrderRepository::class, - MenuItem::class, - OrderItem::class, - FoodOrderType::class, - FoodVendorRepository::class - ); diff --git a/tests/Feature/Controller/FoodVendorControllerTest.php b/tests/Feature/Controller/FoodVendorControllerTest.php deleted file mode 100644 index 8761330..0000000 --- a/tests/Feature/Controller/FoodVendorControllerTest.php +++ /dev/null @@ -1,184 +0,0 @@ -beforeEach(function (): void { - $this->setEntityClass(FoodVendor::class); - $this->setPath('/food/vendor/'); - $this->repository = $this->manager->getRepository($this->entityClass); - }); - -describe(FoodVendorController::class, function (): void { - test('index', function (): void { - $this->client->request('GET', $this->path); - - $this->assertResponseStatusCodeSame(200); - $this->assertPageTitleContains('FoodVendor index'); - }); - - test('new', function (): void { - $this->assertSame(0, $this->repository->count([])); - $this->client->request('GET', sprintf('%snew', $this->path)); - - $this->assertResponseStatusCodeSame(200); - - $this->client->submitForm('Save', [ - 'food_vendor[name]' => 'TestingNew', - ]); - - $newVendor = $this->repository->findOneBy([ - 'name' => 'TestingNew', - ]); - $this->assertInstanceof(FoodVendor::class, $newVendor); - $this->assertSame(1, $this->repository->count([])); - - }); - - test('show', function (): void { - $fixture = new FoodVendor; - $fixture->setName('My Title'); - $fixture->setMenuLink('https://example.com/'); - - $this->manager->persist($fixture); - $this->manager->flush(); - - $crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId())); - - $this->assertResponseIsSuccessful(); - - $nameNode = $crawler->filter('td') - ->last(); - $nameNode = $crawler->filter( - '.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)' - )->text(); - $menuLinkNode = $crawler->filter( - '.table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > a:nth-child(1)' - )->text(); - $this->assertSame('My Title', $nameNode); - $this->assertSame('https://example.com/', $menuLinkNode); - }); - - test('show with menu items', function (): void { - $fixture = new FoodVendor; - $fixture->setName('My Title'); - - $this->manager->persist($fixture); - - $this->manager->flush(); - - $itemOne = new MenuItem; - $itemOne->setName('Item One'); - - $fixture->addMenuItem($itemOne); - $this->manager->persist($itemOne); - - $itemTwo = new MenuItem; - $itemTwo->setName('Item Two'); - $itemTwo->setFoodVendor($fixture); - - $fixture->addMenuItem($itemTwo); - $this->manager->persist($itemTwo); - - $itemThree = new MenuItem; - $itemThree->setName('Item Three'); - $itemThree->setFoodVendor($fixture); - - $fixture->addMenuItem($itemThree); - $this->manager->persist($itemThree); - - $itemFour = new MenuItem; - $itemFour->setName('Item Four'); - $itemFour->setFoodVendor($fixture); - - $fixture->addMenuItem($itemFour); - $this->manager->persist($itemFour); - - $this->manager->flush(); - - $crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId())); - - $this->assertResponseIsSuccessful(); - $nameNode = $crawler->filter( - '.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)' - )->text(); - $this->assertSame('My Title', $nameNode); - - $itemNodes = $crawler->filter('ul.list-group li.list-group-item'); - - $this->assertCount(4, $itemNodes); - }); - - test('edit', function (): void { - $fixture = new FoodVendor; - $fixture->setName('Value'); - $fixture->setMenuLink('Value'); - $fixture->setPhone('Value'); - - $this->manager->persist($fixture); - $this->manager->flush(); - - $crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $fixture->getId())); - $this->assertSame( - $crawler->filter('#food_vendor_name') - ->last() - ->attr('value', ''), - 'Value' - ); - $this->assertSame( - $crawler->filter('#food_vendor_menuLink') - ->last() - ->attr('value', ''), - 'Value' - ); - $this->assertSame( - $crawler->filter('#food_vendor_phone') - ->last() - ->attr('value', ''), - 'Value' - ); - - $this->client->submitForm('Update', [ - 'food_vendor[name]' => 'Something New', - 'food_vendor[menuLink]' => 'https://example.com/', - 'food_vendor[phone]' => '1234567890', - ]); - - $this->assertResponseRedirects('/food/vendor/'); - - $fixture = $this->repository->findAll(); - - $this->assertSame('Something New', $fixture[0]->getName()); - $this->assertSame('https://example.com/', $fixture[0]->getMenuLink()); - $this->assertSame('1234567890', $fixture[0]->getPhone()); - }); - -}) - ->covers( - FoodOrder::class, - FoodVendor::class, - FoodOrderRepository::class, - MenuItem::class, - OrderItem::class, - FoodOrderType::class, - FoodVendorRepository::class, - FoodVendorController::class, - FoodVendorType::class - ) - -; diff --git a/tests/Feature/Controller/HomeControllerTest.php b/tests/Feature/Controller/HomeControllerTest.php deleted file mode 100644 index 76152b6..0000000 --- a/tests/Feature/Controller/HomeControllerTest.php +++ /dev/null @@ -1,71 +0,0 @@ -client->request( - 'GET', - '/' - ); - - $this->assertResponseStatusCodeSame(302); - $this->assertResponseHeaderSame('Location', '/food/order/list'); - - }); - - test('username', function (): void { - $this->client->request( - 'GET', - '/username', - ); - - $this->assertResponseStatusCodeSame(200); - - $this->client->submitForm('Save', [ - 'user_name_form[username]' => 'Testing-1', - ]); - $this->assertResponseStatusCodeSame(302); - $this->assertResponseHeaderSame('Location', '/food/order/list'); - $this->assertResponseCookieValueSame('username', 'Testing-1'); - - $crawler = $this->client->request( - 'GET', - '/username', - ); - - $this->assertResponseStatusCodeSame(200); - - $this->assertSame( - $crawler->filter('#user_name_form_username') - ->last() - ->attr('value', ''), - 'Testing-1' - ); - - }); - - test('username empty', function (): void { - $this->client->request( - 'GET', - '/username', - ); - - $this->assertResponseStatusCodeSame(200); - - $this->client->submitForm('Save', [ - 'user_name_form[username]' => '', - ]); - $this->assertResponseStatusCodeSame(302); - $this->assertResponseHeaderSame('Location', '/food/order/list'); - $this->assertResponseCookieValueSame('username', ''); - }); -}) - ->covers(HomeController::class, UserNameFormType::class); diff --git a/tests/Feature/Controller/MenuItemControllerTest.php b/tests/Feature/Controller/MenuItemControllerTest.php deleted file mode 100644 index fc2c537..0000000 --- a/tests/Feature/Controller/MenuItemControllerTest.php +++ /dev/null @@ -1,160 +0,0 @@ -beforeEach(function (): void { - $this->setEntityClass(MenuItem::class); - $this->setPath('/menu/item/'); - - $this->repository = $this->manager->getRepository($this->entityClass); - - $this->vendor = new FoodVendor; - $this->vendor->setName('Food Vendor'); - - $this->manager->persist($this->vendor); - $this->menuItem = new MenuItem; - $this->menuItem->setName('Testing 1 2'); - - $this->vendor->addMenuItem($this->menuItem); - $this->manager->persist($this->vendor); - $this->manager->persist($this->menuItem); - - $this->aliasOne = new MenuItem; - $this->aliasOne->setName('AliasOne'); - $this->aliasOne->setFoodVendor($this->vendor); - - $this->menuItem->addAlias($this->aliasOne); - - $this->aliasTwo = new MenuItem; - $this->aliasTwo->setName('AliasTwo'); - $this->aliasTwo->setFoodVendor($this->vendor); - $this->aliasTwo->setAliasOf($this->menuItem); - - $this->menuItem->addAlias($this->aliasTwo); - - $this->manager->persist($this->aliasOne); - $this->manager->persist($this->aliasTwo); - $this->manager->persist($this->menuItem); - $this->manager->flush(); - - }); -covers( - MenuItemController::class, - OrderItemController::class, - OrderItemType::class, - MenuItemRepository::class, - FoodOrder::class, - FoodVendor::class, - MenuItem::class, - OrderItem::class, - FoodOrderRepository::class, - MenuItemType::class, -); - -it('show', function (): void { - - $crawler = $this->client->request('GET', "{$this->path}{$this->menuItem->getId()}"); - $idValue = $crawler->filter( - '.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)' - )->text(); - $nameValue = $crawler->filter( - '.table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2)' - )->text(); - - $aliasTwoNameValue = $crawler->filter( - '.table > tbody:nth-child(1) > tr:nth-child(4) > td:nth-child(2) > ul:nth-child(1) > li:nth-child(1)' - )->text(); - $aliasOneNameValue = $crawler->filter( - '.table > tbody:nth-child(1) > tr:nth-child(4) > td:nth-child(2) > ul:nth-child(1) > li:nth-child(2)' - )->text(); - $this->assertResponseStatusCodeSame(200); - $this->assertEquals($idValue, $this->menuItem->getId()); - $this->assertEquals($nameValue, $this->menuItem->getName()); - $this->assertEquals($aliasTwoNameValue, $this->aliasOne->getName()); - $this->assertEquals($aliasOneNameValue, $this->aliasTwo->getName()); -}); - -test('edit', function (): void { - $crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $this->menuItem->getId())); - $nameElem = $crawler->filter('#menu_item_name'); - $this->assertEquals( - 'Testing 1 2', - $nameElem->attr('value') - ); - - $form = $crawler->selectButton('Update') - ->form(); - $form['menu_item[name]'] = 'Testing-1'; - $form['menu_item[priceCents]'] = '1.23'; - $form['menu_item[aliases]'][0]->untick(); - - $this->client->submit($form); - - $this->assertResponseRedirects(sprintf('/menu/item/%s', $this->menuItem->getId())); - $menuItem = $this->repository->find($this->menuItem->getId()); - $this->assertEquals('Testing-1', $menuItem->getName()); - $this->assertEquals(123, $menuItem->getPriceCents()); - $this->assertEquals(1, $menuItem->getAliases()->count()); - $aliasOne = $this->repository->find($this->aliasOne->getId()); - $this->assertNull($aliasOne->getAliasOf()); -}); - -test('edit invalid', function (): void { - $crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $this->menuItem->getId())); - $nameElem = $crawler->filter('#menu_item_name'); - $this->assertEquals( - 'Testing 1 2', - $nameElem->attr('value') - ); - - $form = $crawler->selectButton('Update') - ->form(); - $form['menu_item[name]'] = 'a'; - - $this->client->submit($form); - - $this->assertResponseStatusCodeSame(422); -}); - -test('delete', function (): void { - $order = new FoodOrder; - $order->setFoodVendor($this->vendor); - - $this->manager->persist($order); - $this->manager->flush(); - $this->assertFalse($this->menuItem->isDeleted()); - - $this->client->request('GET', "{$this->path}{$this->menuItem->getId()}"); - $this->client->submitForm('Delete', []); - - $menuItem = $this->repository->find($this->menuItem->getId()); - - $this->assertTrue($menuItem->isDeleted()); - - $crawler = $this->client->request('GET', '/order/item/new/' . $order->getId()); - $count = $crawler->filter('body > main:nth-child(2) > div:nth-child(5)') - ->children() - ->count(); - $this->assertSame(2, $count); - - $this->assertResponseIsSuccessful(); - -}); diff --git a/tests/Feature/Controller/OrderItemControllerTest.php b/tests/Feature/Controller/OrderItemControllerTest.php deleted file mode 100644 index afbed56..0000000 --- a/tests/Feature/Controller/OrderItemControllerTest.php +++ /dev/null @@ -1,261 +0,0 @@ -beforeEach(function (): void { - $this->setEntityClass(OrderItem::class); - $this->setPath('/order/item/'); - $this->repository = $this->manager->getRepository($this->entityClass); - - $this->vendor = new FoodVendor; - $this->vendor->setName('Food Vendor'); - - $this->manager->persist($this->vendor); - $this->order = new FoodOrder; - $this->order->setFoodVendor($this->vendor); - - $this->manager->persist($this->order); - - $this->menuItem = new MenuItem; - $this->menuItem->setName('Testing'); - $this->menuItem->setFoodVendor($this->vendor); - - $vendor2 = new FoodVendor; - $vendor2->setName('Vendor 2'); - - $menuItem2 = new MenuItem; - $menuItem2->setName('Testing2'); - $menuItem2->setFoodVendor($vendor2); - - $this->manager->persist($vendor2); - $this->manager->persist($menuItem2); - - $this->manager->persist($this->menuItem); - $this->manager->flush(); - - $this->menuItemRepository = $this::getContainer()->get(MenuItemRepository::class); - }); - -describe(OrderItemController::class, function (): void { - test('new', function (): void { - $crawler = $this->client->request( - 'GET', - sprintf('%snew/%s', $this->path, $this->order->getId()) - ); - - $children = $crawler->filter('body > main:nth-child(2) > div:nth-child(5)') - ->children(); - - $this->assertCount(1, $children); - - $this->assertResponseStatusCodeSame(200); - - $this->client->submitForm('Save', [ - 'order_item[name]' => 'Testing', - 'order_item[extras]' => 'Testing', - ]); - - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - - $this->assertSame(1, $this->repository->count([])); - $this->assertSame(1, $this->menuItemRepository->count([ - 'foodVendor' => $this->vendor->getId(), - ])); - }); - - test('new order closed', function (): void { - - $this->order->setClosedAt(new DateTimeImmutable('-1 Hour')); - $this->manager->persist($this->order); - $this->manager->flush(); - - $this->client->request( - 'GET', - sprintf('%snew/%s', $this->path, $this->order->getId()) - ); - - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - - $this->assertSame(0, $this->repository->count([])); - }); - - test('new create menu item', function (): void { - $this->client->request( - 'GET', - sprintf('%snew/%s', $this->path, $this->order->getId()) - ); - - $this->assertResponseStatusCodeSame(200); - - $this->client->submitForm('Save', [ - 'order_item[name]' => 'Testing-1', - 'order_item[extras]' => 'Testing-1', - ]); - - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - - $this->assertSame(1, $this->repository->count([])); - $this->assertSame(3, $this->menuItemRepository->count([])); - }); - - test('remove', function (): void { - $fixture = new OrderItem; - $fixture->setName('Testing'); - $fixture->setExtras('Value'); - $fixture->setMenuItem($this->menuItem); - - $fixture->setFoodOrder($this->order); - - $this->manager->persist($fixture); - $this->manager->flush(); - - $this->client->request('GET', sprintf('%sdelete/%s', $this->path, $fixture->getId())); - - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - $this->assertSame(0, $this->repository->count([])); - }); - - test('order closed', function (): void { - $fixture = new OrderItem; - $fixture->setName('Testing'); - $fixture->setExtras('Value'); - $fixture->setMenuItem($this->menuItem); - $fixture->setFoodOrder($this->order); - - $this->order->close(); - - $this->manager->persist($this->order); - $this->manager->persist($fixture); - $this->manager->flush(); - - $this->client->request('GET', sprintf('%sdelete/%s', $this->path, $fixture->getId())); - - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - $this->assertSame(1, $this->repository->count([])); - }); - - test('edit', function (): void { - $orderItem = new OrderItem; - $orderItem->setName('Testing'); - $orderItem->setExtras('My Extra'); - $orderItem->setFoodOrder($this->order); - $orderItem->setMenuItem($this->menuItem); - - $this->manager->persist($orderItem); - $this->manager->flush(); - - $crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $orderItem->getId())); - $nameElem = $crawler->filter('#order_item_name'); - $extrasElem = $crawler->filter('#order_item_extras'); - $this->assertEquals( - 'Testing', - $nameElem->attr('value') - ); - - $this->assertEquals( - 'My Extra', - $extrasElem->attr('value') - ); - - $this->client->submitForm('Update', [ - 'order_item[name]' => 'Testing-1', - 'order_item[extras]' => 'Testing-1', - ]); - - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - - $this->assertSame(1, $this->repository->count([])); - $this->assertSame(3, $this->menuItemRepository->count([])); - - }); - - test('edit order closed', function (): void { - $orderItem = new OrderItem; - $orderItem->setName('Testing'); - $orderItem->setExtras('My Extra'); - $orderItem->setFoodOrder($this->order); - $orderItem->setMenuItem($this->menuItem); - - $this->order->close(); - - $this->manager->persist($orderItem); - $this->manager->persist($this->order); - $this->manager->flush(); - - $this->client->request('GET', sprintf('%s%s/edit', $this->path, $orderItem->getId())); - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - }); - - test('copy', function (): void { - $orderItem = new OrderItem; - $orderItem->setName('My Title'); - $orderItem->setExtras('My Title'); - $orderItem->setFoodOrder($this->order); - $orderItem->setMenuItem($this->menuItem); - - $this->manager->persist($orderItem); - $this->manager->flush(); - - $this->client->request('GET', sprintf('%s%s/copy', $this->path, $orderItem->getId())); - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - - $result = $this->repository->findBy([ - 'foodOrder' => $this->order->getId(), - ]); - $this->assertCount(2, $result); - foreach ($result as $item) { - $this->assertSame($orderItem->getName(), $item->getName()); - $this->assertSame($orderItem->getExtras(), $item->getExtras()); - } - }); - - test('copy order closed', function (): void { - $orderItem = new OrderItem; - $orderItem->setName('My Title'); - $orderItem->setExtras('My Title'); - $orderItem->setFoodOrder($this->order); - $orderItem->setMenuItem($this->menuItem); - - $this->order->close(); - $this->manager->persist($this->order); - $this->manager->persist($orderItem); - $this->manager->flush(); - - $this->client->request('GET', sprintf('%s%s/copy', $this->path, $orderItem->getId())); - $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); - - $result = $this->repository->findBy([ - 'foodOrder' => $this->order->getId(), - ]); - $this->assertCount(1, $result); - }); - -}) - ->covers( - OrderItemController::class, - MenuItemRepository::class, - OrderItemRepository::class, - OrderItemType::class, - FoodOrder::class, - FoodVendor::class, - MenuItem::class, - OrderItem::class, - FoodOrderRepository::class, - ); diff --git a/tests/Feature/EventListener/OrderItemPreFlushTest.php b/tests/Feature/EventListener/OrderItemPreFlushTest.php deleted file mode 100644 index 0dac100..0000000 --- a/tests/Feature/EventListener/OrderItemPreFlushTest.php +++ /dev/null @@ -1,45 +0,0 @@ -beforeEach(function (): void { - $this->setEntityClass(FoodOrder::class); - $this->setPath('/food/order/'); - $this->repository = $this->manager->getRepository($this->entityClass); - $this->vendor = new FoodVendor; - $this->vendor->setName('Food Vendor'); - - $this->manager->persist($this->vendor); - - $this->order = new FoodOrder; - $this->order->setFoodVendor($this->vendor); - - $this->manager->persist($this->order); - $this->manager->flush(); - }); - -it('updates the menu item price', function (): void { - $orderItem = new OrderItem; - $orderItem->setFoodOrder($this->order); - $orderItem->setName('Item'); - $orderItem->setPriceCents(100); - - $this->manager->persist($orderItem); - $this->manager->flush(); - - expect($orderItem->getMenuItem()->getPriceCents()) - ->toBe(100); - - $orderItem->setPriceCents(200); - $this->manager->persist($orderItem); - $this->manager->flush(); - - $id = $orderItem->getId(); - - $orderItem = $this->manager->find(OrderItem::class, $id); - expect($orderItem->getMenuItem()->getPriceCents()) - ->toBe(200); -}); diff --git a/tests/Pest.php b/tests/Pest.php deleted file mode 100644 index 53d7387..0000000 --- a/tests/Pest.php +++ /dev/null @@ -1,33 +0,0 @@ -extends(DbWebTest::class)->in('Feature/Controller/*.php', 'Feature/EventListener/*.php'); - -/* -|-------------------------------------------------------------------------- -| Functions -|-------------------------------------------------------------------------- -| -| While Pest is very powerful out-of-the-box, you may have some testing code specific to your -| project that you don't want to repeat in every file. Here you can also expose helpers as -| global functions to help you to reduce the number of lines of code in your test files. -| -*/ - -function something(): void -{ - // .. -} diff --git a/tests/TestCase.php b/tests/TestCase.php deleted file mode 100644 index 6265b96..0000000 --- a/tests/TestCase.php +++ /dev/null @@ -1,10 +0,0 @@ -getOrderItems()) - ->toBeEmpty(); - $order->addOrderItem($orderItem); - $order->addOrderItem($orderItem); - - expect($order->getOrderItems()) - ->toHaveCount(1) - ->and($orderItem->getFoodOrder()) - ->toBe($order); - - $order->removeOrderItem($orderItem); - - expect($order->getOrderItems()) - ->toBeEmpty() - ->and($orderItem->getFoodOrder()) - ->toBeNull(); - -}) - ->covers(FoodOrder::class, OrderItem::class); diff --git a/tests/Unit/Entity/FoodVendorTest.php b/tests/Unit/Entity/FoodVendorTest.php deleted file mode 100644 index ee00ece..0000000 --- a/tests/Unit/Entity/FoodVendorTest.php +++ /dev/null @@ -1,76 +0,0 @@ -setName('Test'); - $this->assertEquals('Test', $vendor->getName()); - $this->assertInstanceOf(Ulid::class, $vendor->getId()); - $this->assertEmpty($vendor->getPhone()); - $vendor->setPhone('1234567890'); - $this->assertEquals('1234567890', $vendor->getPhone()); - - // Test emojis field - $this->assertNull($vendor->getEmojis()); - $emojis = '😀😂🎉👍❤️'; - $vendor->setEmojis($emojis); - $this->assertEquals($emojis, $vendor->getEmojis()); - - // Test emojis validation - $tooManyEmojis = '😀😂🎉👍❤️🚀🎈🎁🎊🎋🎍🎎🎏🎐🎑🎒🎓🎔🎕🎖🎗🎘🎙🎚🎛🎜🎝🎞🎟🎠🎡🎢'; - $this->expectException(InvalidArgumentException::class); - $vendor->setEmojis($tooManyEmojis); - - $this->assertCount(0, $vendor->getFoodOrders()); - $order1 = new FoodOrder; - $vendor->addFoodOrder($order1); - $vendor->addFoodOrder($order1); - $this->assertCount(1, $vendor->getFoodOrders()); - $this->assertSame($vendor, $order1->getFoodVendor()); - $vendor->removeFoodOrder($order1); - $this->assertCount(0, $vendor->getFoodOrders()); - $this->assertNull($order1->getFoodVendor()); - }); - - test('MenutItem entity', function (): void { - $vendor = new FoodVendor; - $menuItem1 = new MenuItem; - $menuItem2 = new MenuItem; - $this->assertCount(0, $vendor->getMenuItems()); - $vendor->addMenuItem($menuItem1); - $vendor->addMenuItem($menuItem1); - $this->assertCount(1, $vendor->getMenuItems()); - $vendor->removeMenuItem($menuItem1); - $this->assertCount(0, $vendor->getMenuItems()); - $this->assertNull($menuItem1->getFoodVendor()); - $vendor->addMenuItem($menuItem1); - $menuItem2->delete(); - $vendor->addMenuItem($menuItem2); - $this->assertCount(1, $vendor->getMenuItems()); - $this->assertCount(2, $vendor->getMenuItems(true)); - }); - - test('remove foreign menu item', function (): void { - $vendor1 = new FoodVendor; - $vendor2 = new FoodVendor; - $item1 = new MenuItem; - - $vendor1->addMenuItem($item1); - $this->assertCount(1, $vendor1->getMenuItems()); - $vendor2->removeMenuItem($item1); - $this->assertCount(1, $vendor1->getMenuItems()); - $this->assertSame($vendor1, $item1->getFoodVendor()); - }); - -})->covers(FoodVendor::class, FoodOrder::class, MenuItem::class); diff --git a/tests/Unit/Entity/MenuItemTest.php b/tests/Unit/Entity/MenuItemTest.php deleted file mode 100644 index 5e01b05..0000000 --- a/tests/Unit/Entity/MenuItemTest.php +++ /dev/null @@ -1,53 +0,0 @@ -setName('Test'); - $this->assertEquals('Test', $item->getName()); - - $vendor = new FoodVendor; - $vendor->setName('Test'); - - $item->setFoodVendor($vendor); - $this->assertEquals($vendor, $item->getFoodVendor()); - - $this->assertFalse($item->isDeleted()); - $this->assertNull($item->getDeletedAt()); - $item->delete(); - $this->assertTrue($item->isDeleted()); - $this->assertInstanceOf(DateTimeImmutable::class, $item->getDeletedAt()); - }); - test('MenuItem alias', function (): void { - $item = new MenuItem; - $item->setName('Test'); - $this->assertEquals('Test', $item->getName()); - - $vendor = new FoodVendor; - $vendor->setName('Test'); - - $item->setFoodVendor($vendor); - - $item2 = new MenuItem; - $item2->setName('Test2'); - $item2->setFoodVendor($vendor); - - $item->addAlias($item2); - - $this->assertCount(1, $item->getAliases()); - $this->assertSame($item, $item2->getAliasOf()); - - $item->removeAlias($item2); - $this->assertCount(0, $item->getAliases()); - $this->assertNull($item2->getAliasOf()); - }); -})->covers(MenuItem::class, FoodVendor::class); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 11702bc..e717c59 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,19 +1,13 @@ bootEnv(dirname(__DIR__) . '/.env'); - $token = $_SERVER['TEST_TOKEN'] ?? ''; - $_ENV['DATABASE_URL'] .= $token; } if ($_SERVER['APP_DEBUG']) { umask(0o000); } - -$fs = new Filesystem; -$fs->remove(dirname(__DIR__) . '/../var/cache/*'); diff --git a/src/ApiResource/.gitignore b/var/.gitkeep similarity index 100% rename from src/ApiResource/.gitignore rename to var/.gitkeep