Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
a1b0bcf
feat(core): support php 8.5 (#1733)
brendt Dec 3, 2025
cfccb39
feat(log)!: support multiple loggers (#1788)
innocenzi Dec 7, 2025
2537d2a
feat(validation)!: add ability to specify translation keys for specif…
innocenzi Dec 7, 2025
b4b49ec
refactor(mapper)!: move map function in `Tempest\Mapper` (#1789)
innocenzi Dec 8, 2025
a996722
chore(console): remove unused dependencies (#1797)
innocenzi Dec 10, 2025
378e0c0
feat(reflection): add union and intersection utils (#1798)
innocenzi Dec 10, 2025
8bb394d
refactor(view)!: use `internal_storage_path` to build view cache
innocenzi Dec 11, 2025
3c0d1f3
feat(mapper): support contextual serializers and casters (#1791)
innocenzi Dec 11, 2025
e1124fb
ci: build all packages during isolated testing (#1813)
innocenzi Dec 14, 2025
4456541
feat(database): support uuids as primary columns (#1807)
innocenzi Dec 14, 2025
666d68c
test(redis): skip if there is no redis connection (#1812)
xHeaven Dec 14, 2025
0f08031
fix(cache): ensure unique lock acquisition (#1757)
xHeaven Dec 14, 2025
027471c
docs(database): improve structure and phrasing (#1814)
innocenzi Dec 14, 2025
006997c
docs(mapper): improve phrasing (#1815)
innocenzi Dec 14, 2025
8d82c8c
feat(router): infer constraints from route parameters (#1816)
innocenzi Dec 14, 2025
fefc36c
docs(routing): improve phrasing (#1818)
innocenzi Dec 14, 2025
1af376a
fix(support): prevent `Path\normalize` from removing `0` from paths (…
MohammadAlhallaq Dec 14, 2025
d75d54c
feat(database): add pdo options to database configs (#1840)
innocenzi Dec 29, 2025
ea48a8a
feat(event-bus): allow assertions without preventing event execution …
innocenzi Dec 29, 2025
92908e3
fix(database): update generics on query builder (#1833)
guvra Dec 30, 2025
c89a15c
fix(discovery): handle the discovery test case corectlly (#1839)
MohammadAlhallaq Dec 30, 2025
cea59e7
docs: add discovery to the essentials section (#1846)
innocenzi Dec 30, 2025
25d69dd
fix(support): support deleting symlinks using `Filesystem\delete` (#1…
innocenzi Dec 30, 2025
ad32ffe
feat(core)!: make `Environment` its own source of truth (#1838)
innocenzi Dec 30, 2025
f36b43b
feat(core): support validating environment variables (#1836)
innocenzi Dec 30, 2025
ce478bf
feat(testing)!: remove deprecated testing utilities (#1849)
innocenzi Jan 5, 2026
7f40a4e
feat(core): enable partial discovery by default during development (#…
innocenzi Jan 5, 2026
37e908d
fix(view): handle egde case with falsy nodes (#1825)
alamagus Jan 5, 2026
dbf25dc
refactor(view): improve escaping, null handling, and error cases (#1781)
xHeaven Jan 5, 2026
5d8bbad
feat(view): support expression attribute fallthrough (#1811)
xHeaven Jan 5, 2026
314fb05
feat(core)!: overhaul exception handling (#1819)
innocenzi Jan 6, 2026
38128aa
fix(router): add missing ui composable imports (#1853)
xHeaven Jan 6, 2026
0e8edb4
fix(router): support rendering development exceptions with html entit…
innocenzi Jan 6, 2026
1dd4946
feat(console): add native command completion for zsh and bash (#1851)
xHeaven Jan 7, 2026
49fc4e2
perf(mapper): pre-resolve mapper classes (#1852)
brendt Jan 7, 2026
5ec931a
perf(orm): memoize mapper data to improve ORM performance (#1855)
brendt Jan 7, 2026
c8500b6
chore(core): fix typo (#1857)
brendt Jan 7, 2026
4332740
fix(view): fallthrough attributes with empty values (#1858)
brendt Jan 7, 2026
c728ca7
chore(router): support both light and dark color schemes in exception…
brendt Jan 7, 2026
7e8ec28
fix(router): prevent memory exhaustion when serializing exception arg…
innocenzi Jan 7, 2026
36113b7
fix(database): improve raw sql serialization consistency (#1861)
innocenzi Jan 7, 2026
4b26856
docs: fix a lot of typos (#1863)
xHeaven Jan 8, 2026
798568b
refactor(core): minor cleanup (#1865)
xHeaven Jan 8, 2026
0350d98
fix(intl): throw explicit exception when encountering unsupported tra…
xHeaven Jan 8, 2026
b6d4668
feat(validation): add closure-based validation (#1828)
MohammadAlhallaq Jan 8, 2026
6f27ade
fix(console): add zsh cache cleanup instructions after uninstall (#1862)
xHeaven Jan 8, 2026
360af87
refactor(view)!: move `Tempest\view` to the `Tempest\View` namespace …
innocenzi Jan 8, 2026
516a0ac
fix(intl): add missing dependency to ext-intl (#1866)
TimWolla Jan 8, 2026
bd4be5e
refactor(http)!: improve session management and CSRF protection (#1829)
innocenzi Jan 8, 2026
db834ab
fix(http): gracefully recover from invalid file sessions (#1872)
brendt Jan 8, 2026
f3d67f0
fix(database): wrap enums in quotes during raw sql serialization (#1871)
brendt Jan 8, 2026
c823d63
fix(core): correctly load symlinked config files (#1875)
brendt Jan 8, 2026
ebd085c
refactor: make `*Application::run()` return `never` (#1869)
TimWolla Jan 8, 2026
2767c53
ci: add code owners (#1873)
innocenzi Jan 8, 2026
a75fce7
feat(testing): support passing raw body to route test utils (#1876)
innocenzi Jan 8, 2026
22f6cac
feat(event-bus): support enum events in `EventBus::listen()` (#1878)
TimWolla Jan 9, 2026
7f9a2ec
fix(database): use singleton serializer factory instead of creating a…
brendt Jan 9, 2026
e26572b
refactor(testing)!: migrate view and route helpers to dedicated teste…
xHeaven Jan 9, 2026
07c5aaf
fix(view): keep whitespaces during render (#1881)
brendt Jan 9, 2026
9621695
refactor!: use consistent namespaces for functions (#1880)
innocenzi Jan 9, 2026
09c6a56
ci: adapt release script to version branches (#1879)
innocenzi Jan 9, 2026
f97b0cf
refactor(support)!: rename `Arr\map_iterable` to `Arr\map` (#1884)
innocenzi Jan 12, 2026
bd65ba8
fix(http-client): support unknown status codes (#1885)
innocenzi Jan 13, 2026
56ba5ea
fix(http): prevent rendering development exception on validation erro…
brendt Jan 13, 2026
cfef0cc
fix(view): do not cache views in local environments by default (#1891)
innocenzi Jan 14, 2026
d644091
feat(mapper): read `CastWith`/`SerializeWith` from interface definiti…
xHeaven Jan 15, 2026
afe65d3
fix(http): broken import in header session id resolver (#1893)
brendt Jan 15, 2026
bd2b6f3
refactor(generation): move php generation into its own namespace (#1896)
innocenzi Jan 17, 2026
ad7825b
perf(database): only use serializer factory when needed (#1898)
brendt Jan 19, 2026
dddeb30
chore(upgrade): update rector version (#1905)
innocenzi Jan 20, 2026
1d09649
feat(support): add `Filesystem\create_temporary_directory()` (#1901)
innocenzi Jan 20, 2026
df69277
fix(http-client): remove unused dependency on `tempest/router` (#1902)
innocenzi Jan 20, 2026
64fc6c4
feat(console): allow overriding internal storage in `boot` (#1904)
innocenzi Jan 20, 2026
25fae25
refactor(router): minor improvements to exception page (#1907)
innocenzi Jan 20, 2026
4ef5a77
feat(console): add ability to prevent built-in console commands from …
innocenzi Jan 21, 2026
9595a83
feat(support): add `Filesystem\copy_directory` and `Filesystem\copy` …
innocenzi Jan 21, 2026
244566a
ci: add branch sub-splits (#1910)
aidan-casey Jan 24, 2026
0e88e94
ci: update subsplit branch pattern (#1913)
innocenzi Jan 25, 2026
79dd8a1
ci: add workflow codeowners (#1911)
aidan-casey Jan 25, 2026
90388df
ci: create repository during subsplit if it does not exist (#1914)
innocenzi Jan 25, 2026
c20539b
ci: update the PAT for GitHub requests (#1915)
aidan-casey Jan 25, 2026
743e8d8
feat(console): throw clear exception when sending unexpected input du…
innocenzi Jan 25, 2026
4863e30
refactor(cache): use xxh64 instead of crc32 (#1917)
xHeaven Jan 26, 2026
40b73e4
fix(command-bus): prevent crash when accessing deleted pending comman…
xHeaven Jan 27, 2026
7751926
chore: add milestone section on the contribution page (#1923)
brendt Jan 27, 2026
965f2ee
fix(cryptography): add `key:generate` hint to invalid key exceptions …
xHeaven Jan 27, 2026
5bb84c1
fix(auth): properly run migrations when installing auth (#1927)
brendt Jan 27, 2026
6c1a725
fix(kv-store): allow Predis connection errors to be caught (#1930)
xHeaven Jan 27, 2026
8947072
fix(reflection): correctly detect nullable types in TypeReflector (#1…
xHeaven Jan 27, 2026
0ad6cc7
feat(auth): implement Twitch OAuth provider wrapper (#1919)
iamdadmin Jan 28, 2026
e2d07b7
chore: phpunit/phpunit CVE-2026-24765 (#1932)
xHeaven Jan 28, 2026
e957640
feat(database): add configurable migration naming strategy (#1928)
xHeaven Jan 29, 2026
8247f6f
feat(router): add rate limiting middleware
Tresor-Kasenda Feb 6, 2026
c257621
Merge branch 'main' into feature/rate-limiting-middleware
Tresor-Kasenda Feb 6, 2026
df75161
Update docs/5-extra-topics/04-contributing.md
Tresor-Kasenda Feb 6, 2026
3b002d2
Update docs/2-features/15-datetime.md
Tresor-Kasenda Feb 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
49 changes: 49 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/.github/ @brendt @innocenzi @aidan-casey
/.github/workflows/coding-conventions.yml @aidan-casey
/.github/workflows/create-gh-release.yml @innocenzi
/.github/workflows/deploy-docs.yml @innocenzi
/.github/workflows/integration-tests.yml @aidan-casey
/.github/workflows/integration-tests-windows.yml @aidan-casey @brendt
/.github/workflows/isolated-tests.yml @aidan-casey
/.github/workflows/lint-pr-title.yml @innocenzi
/.github/workflows/publish-javascript-packages.yml @innocenzi
/.github/workflows/subsplit-packages.yml @aidan-casey
/.github/workflows/trigger-tempest-app-qa.yml @brendt
/.github/workflows/trigger-tempest-clean-qa.yml @brendt
/.github/workflows/validate-packages.yml @aidan-casey
/src/ @brendt
/docs/ @brendt @innocenzi
/packages/auth/ @innocenzi
/packages/cache/ @innocenzi
/packages/clock/ @aidan-casey
/packages/command-bus/ @brendt @aidan-casey
/packages/console/ @brendt
/packages/container/ @brendt
/packages/core/ @brendt
/packages/cryptography/ @innocenzi
/packages/database/ @brendt @innocenzi
/packages/datetime/ @innocenzi
/packages/debug/ @innocenzi
/packages/discovery/ @brendt @aidan-casey
/packages/event-bus/ @brendt @aidan-casey
/packages/generation/ @brendt
/packages/http/ @brendt @aidan-casey
/packages/http-client/ @aidan-casey
/packages/icon/ @innocenzi
/packages/kv-store/ @innocenzi
/packages/log/ @brendt
/packages/mail/ @innocenzi
/packages/mapper/ @brendt
/packages/process/ @innocenzi
/packages/reflection/ @brendt @aidan-casey
/packages/router/ @brendt @aidan-casey
/packages/router/src/Exceptions/local @innocenzi
/packages/storage/ @innocenzi
/packages/support/ @innocenzi @brendt
/packages/upgrade/ @brendt
/packages/validation/ @brendt @innocenzi
/packages/view/ @brendt
/packages/vite/ @innocenzi
/packages/vite-plugin-tempest/ @innocenzi
*.ts @innocenzi
*.vue @innocenzi
9 changes: 4 additions & 5 deletions .github/workflows/coding-conventions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
pull_request:
workflow_dispatch:

# CSFixer and Rector are temporarily disabled until they have proper PHP 8.4 support
jobs:
check-style:
name: Run style check
Expand All @@ -15,12 +14,12 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
php-version: 8.5
coverage: none

- name: Install dependencies
run: |
composer update --prefer-dist --no-interaction
composer update --prefer-dist --no-interaction --ignore-platform-reqs
composer mago:install-binary

- name: Run Mago
Expand All @@ -46,7 +45,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
php-version: 8.5
coverage: none

- name: Install composer dependencies
Expand All @@ -65,7 +64,7 @@ jobs:
# - name: Setup PHP
# uses: shivammathur/setup-php@v2
# with:
# php-version: 8.4
# php-version: 8.5
# coverage: none
#
# - name: Install composer dependencies
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/integration-tests-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
fail-fast: false
matrix:
php:
- 8.4
- 8.5
os:
- windows-latest
env:
Expand Down Expand Up @@ -55,7 +55,7 @@ jobs:
os:
- windows-latest
php:
- 8.4
- 8.5
database:
- sqlite
- mysql
Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

- name: Install dependencies
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --ignore-platform-reqs

- name: "Setup Redis"
if: ${{ matrix.os != 'windows-latest' }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
fail-fast: false
matrix:
php:
- 8.4
- 8.5
os:
- ubuntu-latest
# - windows-latest
Expand Down Expand Up @@ -59,7 +59,7 @@ jobs:
- ubuntu-latest
# - windows-latest
php:
- 8.4
- 8.5
database:
- sqlite
- mysql
Expand Down Expand Up @@ -90,7 +90,7 @@ jobs:
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

- name: Install dependencies
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --ignore-platform-reqs

- name: "Setup Redis"
if: ${{ matrix.os != 'windows-latest' }}
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/isolated-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
php-version: 8.5
coverage: none

- uses: actions/checkout@v4
Expand All @@ -43,7 +43,7 @@ jobs:
- ubuntu-latest
package: ${{ fromJson(needs.get_packages.outputs.matrix) }}
php:
- 8.4
- 8.5
stability:
- prefer-stable
- prefer-lowest
Expand All @@ -66,7 +66,7 @@ jobs:
uses: supercharge/redis-github-action@1.7.0

- name: Install PHPUnit
run: composer global require phpunit/phpunit:12.4.0
run: composer global require phpunit/phpunit:12.5.8

- name: Setup problem matchers
run: |
Expand All @@ -75,9 +75,9 @@ jobs:

- name: Install dependencies
run: |
./bin/build-changed-packages
./bin/build-packages
cd "packages/${{ matrix.package.basename }}"
composer update --${{ matrix.stability }} --prefer-dist --no-interaction
composer update --${{ matrix.stability }} --prefer-dist --no-interaction --ignore-platform-reqs

- name: Execute tests
run: phpunit -c "packages/${{ matrix.package.basename }}/phpunit.xml"
48 changes: 13 additions & 35 deletions .github/workflows/subsplit-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ name: "Sub-split packages"

on:
push:
branches: [main]
branches:
- "[0-9]+.x"
- "v[0-9]+.[0-9]+-alpha.[0-9]+"
- "v[0-9]+.[0-9]+-beta.[0-9]+"
tags: ["v*"]
workflow_dispatch:

env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}

jobs:
get_packages:
name: Get packages
Expand All @@ -17,17 +17,18 @@ jobs:
- name: Set Up PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
php-version: 8.5
coverage: none

- uses: actions/checkout@v4

- name: Get packages
id: get_json
run: echo "::set-output name=json::$(bin/get-packages)"
run: echo "json=$(bin/get-packages)" >> $GITHUB_OUTPUT

- name: Output packages
run: echo "${{ steps.get_json.outputs.json }}"

outputs:
matrix: ${{ steps.get_json.outputs.json }}

Expand All @@ -41,34 +42,11 @@ jobs:
package: ${{ fromJson(needs.get_packages.outputs.matrix) }}
steps:
- uses: actions/checkout@v4
# no tag
- if: "!startsWith(github.ref, 'refs/tags/')"
uses: "symplify/monorepo-split-github-action@v2.3.0"
with:
# ↓ split "packages/console" directory
package_directory: "${{ matrix.package.directory }}"

# ↓ into https://github.com/tempestphp/tempest-console repository
repository_organization: "${{ matrix.package.organization }}"
repository_name: "${{ matrix.package.repository }}"

# ↓ the user signed under the split commit
user_name: "aidan-casey"
user_email: "aidan@caseyhouse.net"

# with tag
- if: "startsWith(github.ref, 'refs/tags/')"
uses: "symplify/monorepo-split-github-action@v2.3.0"
with:
tag: ${GITHUB_REF#refs/tags/}

# ↓ split "packages/console" directory
package_directory: "${{ matrix.package.directory }}"

# ↓ into https://github.com/tempestphp/tempest-console repository
repository_organization: "${{ matrix.package.organization }}"
repository_name: "${{ matrix.package.repository }}"
- name: Set up git-filter-repo
run: pip install git-filter-repo

# ↓ the user signed under the split commit
user_name: "aidan-casey"
user_email: "aidan@caseyhouse.net"
- name: Split Package
env:
GH_TOKEN: ${{ secrets.ACCESS_TOKEN }}
run: ./bin/split "${{ matrix.package.name }}"
2 changes: 1 addition & 1 deletion .github/workflows/validate-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.4
php-version: 8.5
extensions: dom, curl, libxml, mbstring, pcntl, fileinfo, intl
coverage: none

Expand Down
56 changes: 0 additions & 56 deletions bin/build-changed-packages

This file was deleted.

62 changes: 62 additions & 0 deletions bin/build-packages
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/usr/bin/env php
<?php

/**
* Though this script attempts to simplify, it borrows heavily from Symfony's approach.
*
* @see https://github.com/symfony/symfony/blob/7.2/.github/build-packages.php
*/

$output = shell_exec(__DIR__ . '/get-packages');
$tempestPackages = json_decode($output, associative: true);

// Determine the dev version from inter-package dependencies.
// This ensures we bundle packages with the same version that deps expect.
$devVersion = 'dev-main';

foreach ($tempestPackages as $package) {
$composerPath = sprintf('%s/composer.json', $package['directory']);
$composerFile = json_decode(file_get_contents($composerPath), true);

foreach ($composerFile['require'] ?? [] as $dep => $version) {
if (str_starts_with($dep, 'tempest/') && str_starts_with($version, 'dev-')) {
$devVersion = $version;
break 2;
}
}
}

$composerPackages = [
'packages' => [],
];

foreach ($tempestPackages as $package) {
$composerPath = sprintf('%s/composer.json', $package['directory']);
$composerFile = json_decode(file_get_contents($composerPath), true);

// Bundle ALL packages as tar files to ensure consistent versions.
// This ensures all inter-package dependencies (e.g., dev-3.x) can be
// resolved from the local repository.
passthru(sprintf("cd %s && tar -cf package.tar --exclude='package.tar' *", $package['directory']));

$composerFile['version'] = $devVersion;
$composerFile['dist']['type'] = 'tar';
$composerFile['dist']['url'] = 'file://'. $package['directory'] . '/package.tar';

// Add the package details to the root "packages.json."
$composerPackages['packages'][$composerFile['name']][$composerFile['version']] = $composerFile;

// Load the packages from the root "packages.json" file we will write in a second.
$composerFile['repositories'] = [
[
'type' => 'composer',
'url' => realpath(__DIR__ . '/../'),
]
];

file_put_contents($composerPath, json_encode($composerFile, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
}

file_put_contents(__DIR__ . '/../packages.json', json_encode($composerPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));

var_dump(file_get_contents(__DIR__ . '/../packages.json'));
Loading