53 Commits

Author SHA1 Message Date
db287117f5 chore: downgrade console and mongodb
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-06 23:33:09 -04:00
cce65c3e62 Merge pull request 'chore(deps): update dependency typescript to v6' (#73) from renovate/typescript-6.x into main
Reviewed-on: #73
2026-05-07 03:17:33 +00:00
757d69b803 Merge pull request 'chore(deps): update dependency mongodb/mongodb to v2.3.0' (#69) from renovate/mongodb-mongodb-2.x-lockfile into main
Reviewed-on: #69
2026-05-07 03:17:23 +00:00
745c2947c3 Merge pull request 'chore(deps): update eslint monorepo to v10 (major)' (#74) from renovate/major-eslint-monorepo into main
Reviewed-on: #74
2026-05-07 03:17:13 +00:00
2b05cd39ef chore(deps): update eslint monorepo to v10
All checks were successful
Build Test / build (pull_request) Successful in 19s
JS Unit Tests / test (pull_request) Successful in 19s
PHP Unit Tests / test (pull_request) Successful in 36s
2026-05-07 03:15:20 +00:00
bb10f48ded chore(deps): update dependency typescript to v6
All checks were successful
Build Test / build (pull_request) Successful in 30s
JS Unit Tests / test (pull_request) Successful in 14s
PHP Unit Tests / test (pull_request) Successful in 1m16s
2026-05-07 03:15:17 +00:00
aec0abaca6 chore(deps): update dependency mongodb/mongodb to v2.3.0
All checks were successful
JS Unit Tests / test (pull_request) Successful in 31s
Build Test / build (pull_request) Successful in 35s
PHP Unit Tests / test (pull_request) Successful in 1m11s
2026-05-07 03:15:10 +00:00
e0ec4acdd4 Merge pull request 'chore(deps): update dependency jsdom to v29' (#71) from renovate/jsdom-29.x into main
Reviewed-on: #71
2026-05-07 03:11:07 +00:00
b0d8317f51 Merge pull request 'chore(deps): update dependency sass to v1.99.0' (#70) from renovate/sass-1.x into main
Reviewed-on: #70
2026-05-07 03:10:55 +00:00
3e859bac10 Merge pull request 'chore(deps): update dependency phpseclib/phpseclib to v3.0.52' (#58) from renovate/phpseclib-phpseclib-3.x-lockfile into main
Reviewed-on: #58
2026-05-07 03:10:28 +00:00
ccac97b19f chore(deps): update dependency jsdom to v29
All checks were successful
JS Unit Tests / test (pull_request) Successful in 19s
Build Test / build (pull_request) Successful in 22s
PHP Unit Tests / test (pull_request) Successful in 48s
2026-05-07 03:08:47 +00:00
224d2a9eeb chore(deps): update dependency sass to v1.99.0
All checks were successful
Build Test / build (pull_request) Successful in 25s
JS Unit Tests / test (pull_request) Successful in 22s
PHP Unit Tests / test (pull_request) Successful in 55s
2026-05-07 03:08:44 +00:00
f98734938c chore(deps): update dependency phpseclib/phpseclib to v3.0.52
All checks were successful
JS Unit Tests / test (pull_request) Successful in 22s
Build Test / build (pull_request) Successful in 24s
PHP Unit Tests / test (pull_request) Successful in 1m33s
2026-05-07 03:08:35 +00:00
a98ea3b1da Merge pull request 'chore(deps): update dependency eslint-plugin-vue to v10.9.1' (#68) from renovate/eslint-plugin-vue-10.x into main
Reviewed-on: #68
2026-05-07 03:05:07 +00:00
6ce536cdf0 Merge pull request 'chore(deps): update dependency @vue/tsconfig to v0.9.1' (#67) from renovate/vue-tsconfig-0.x into main
Reviewed-on: #67
2026-05-07 03:02:21 +00:00
9ed19ab406 Merge pull request 'chore(deps): update typescript-eslint monorepo to v8.59.2' (#62) from renovate/typescript-eslint-monorepo into main
Reviewed-on: #62
2026-05-07 03:01:53 +00:00
47c6e6317a Merge pull request 'fix(deps): update dependency @fontsource/roboto to v5.2.10' (#63) from renovate/fontsource-monorepo into main
Reviewed-on: #63
2026-05-07 03:01:43 +00:00
749248f13c Merge pull request 'chore(deps): update dependency @types/node to v25.6.0' (#66) from renovate/node-25.x into main
Reviewed-on: #66
2026-05-07 03:01:34 +00:00
6d6e523812 Merge pull request 'fix(deps): update dependency vue-router to v5.0.6' (#64) from renovate/vue-router-5.x into main
Reviewed-on: #64
2026-05-07 03:01:23 +00:00
a11feffd7f Merge pull request 'chore(deps): update dependency vue-tsc to v3.2.8' (#61) from renovate/vue-tsc-3.x-lockfile into main
Reviewed-on: #61
2026-05-07 03:01:01 +00:00
7d4a68db53 Merge pull request 'chore(deps): update dependency symfony/console to v8.0.9' (#60) from renovate/symfony into main
Reviewed-on: #60
2026-05-07 03:00:52 +00:00
d56155d83f Merge pull request 'chore(deps): update dependency prettier to v3.8.3' (#59) from renovate/prettier-3.x into main
Reviewed-on: #59
2026-05-07 03:00:43 +00:00
f9bebaf5c5 Merge pull request 'chore(deps): update dependency dompurify to v3.4.2' (#57) from renovate/dompurify-3.x-lockfile into main
Reviewed-on: #57
2026-05-07 03:00:30 +00:00
8666ff60ec chore(deps): update dependency eslint-plugin-vue to v10.9.1
All checks were successful
JS Unit Tests / test (pull_request) Successful in 25s
Build Test / build (pull_request) Successful in 29s
PHP Unit Tests / test (pull_request) Successful in 1m40s
2026-05-07 02:58:25 +00:00
41d823b9c3 chore(deps): update dependency @vue/tsconfig to v0.9.1
All checks were successful
Build Test / build (pull_request) Successful in 24s
JS Unit Tests / test (pull_request) Successful in 11s
PHP Unit Tests / test (pull_request) Successful in 1m23s
2026-05-07 02:58:22 +00:00
32f3d0e4c6 chore(deps): update dependency @types/node to v25.6.0
All checks were successful
JS Unit Tests / test (pull_request) Successful in 19s
Build Test / build (pull_request) Successful in 41s
PHP Unit Tests / test (pull_request) Successful in 1m10s
2026-05-07 02:58:20 +00:00
967c88ea45 fix(deps): update dependency vue-router to v5.0.6
All checks were successful
JS Unit Tests / test (pull_request) Successful in 20s
Build Test / build (pull_request) Successful in 27s
PHP Unit Tests / test (pull_request) Successful in 1m34s
2026-05-07 02:58:14 +00:00
8dc879c015 fix(deps): update dependency @fontsource/roboto to v5.2.10
All checks were successful
Build Test / build (pull_request) Successful in 23s
JS Unit Tests / test (pull_request) Successful in 21s
PHP Unit Tests / test (pull_request) Successful in 1m18s
2026-05-07 02:58:10 +00:00
1001e8b641 chore(deps): update typescript-eslint monorepo to v8.59.2
All checks were successful
Build Test / build (pull_request) Successful in 28s
JS Unit Tests / test (pull_request) Successful in 17s
PHP Unit Tests / test (pull_request) Successful in 2m17s
2026-05-07 02:58:07 +00:00
6577a1647e chore(deps): update dependency vue-tsc to v3.2.8
All checks were successful
JS Unit Tests / test (pull_request) Successful in 27s
Build Test / build (pull_request) Successful in 32s
PHP Unit Tests / test (pull_request) Successful in 1m20s
2026-05-07 02:57:52 +00:00
26aa11e965 chore(deps): update dependency symfony/console to v8.0.9
All checks were successful
Build Test / build (pull_request) Successful in 14s
JS Unit Tests / test (pull_request) Successful in 14s
PHP Unit Tests / test (pull_request) Successful in 1m27s
2026-05-07 02:57:49 +00:00
cb8966fbdf chore(deps): update dependency prettier to v3.8.3
All checks were successful
Build Test / build (pull_request) Successful in 36s
JS Unit Tests / test (pull_request) Successful in 38s
PHP Unit Tests / test (pull_request) Successful in 1m37s
2026-05-07 02:57:38 +00:00
302b80e8aa chore(deps): update dependency dompurify to v3.4.2
All checks were successful
Build Test / build (pull_request) Successful in 21s
JS Unit Tests / test (pull_request) Successful in 21s
PHP Unit Tests / test (pull_request) Successful in 1m46s
2026-05-07 02:57:31 +00:00
d6bd36c25e Merge pull request 'chore(deps): update dependency @vitejs/plugin-vue to v6.0.6' (#55) from renovate/vitejs-plugin-vue-6.x into main
Some checks are pending
Renovate / renovate (push) Has started running
Reviewed-on: #55
2026-05-07 02:40:02 +00:00
4e23c4654c Merge pull request 'chore(deps): update dependency @vue/test-utils to v2.4.10' (#56) from renovate/vue-test-utils-2.x-lockfile into main
Reviewed-on: #56
2026-05-07 02:39:47 +00:00
39403699c9 chore(deps): update dependency @vue/test-utils to v2.4.10
All checks were successful
Build Test / build (pull_request) Successful in 37s
JS Unit Tests / test (pull_request) Successful in 36s
PHP Unit Tests / test (pull_request) Successful in 1m14s
2026-05-07 02:38:10 +00:00
13f9967b7c chore(deps): update dependency @vitejs/plugin-vue to v6.0.6
All checks were successful
Build Test / build (pull_request) Successful in 24s
JS Unit Tests / test (pull_request) Successful in 31s
PHP Unit Tests / test (pull_request) Successful in 1m5s
2026-05-07 02:38:08 +00:00
e8ac1685a3 Merge pull request 'fix: vite static copy' (#54) from fix/vite-static-copy into main
Reviewed-on: #54
2026-05-06 20:40:07 +00:00
525018e5eb fix: vite static copy
All checks were successful
Build Test / build (pull_request) Successful in 13s
JS Unit Tests / test (pull_request) Successful in 12s
PHP Unit Tests / test (pull_request) Successful in 41s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-06 16:39:40 -04:00
55f936c684 Merge pull request 'chore: renovate update' (#53) from chore/renovate-update into main
Reviewed-on: #53
2026-05-06 17:02:26 +00:00
b105cc18b5 chore: renovate update
All checks were successful
Build Test / build (pull_request) Successful in 12s
JS Unit Tests / test (pull_request) Successful in 11s
PHP Unit Tests / test (pull_request) Successful in 38s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-06 13:02:01 -04:00
747f0e63f7 Merge pull request 'chore(deps): update dependency vite to v8' (#47) from renovate/vite-8.x into main
Reviewed-on: #47
2026-05-06 16:34:42 +00:00
8a48c3f17f chore(deps): update dependency vite to v8
All checks were successful
Build Test / build (pull_request) Successful in 20s
JS Unit Tests / test (pull_request) Successful in 21s
PHP Unit Tests / test (pull_request) Successful in 47s
2026-05-06 16:34:03 +00:00
0d5ed4de1e Merge pull request 'chore(deps): update dependency vite-plugin-static-copy to v4' (#48) from renovate/vite-plugin-static-copy-4.x into main
Reviewed-on: #48
2026-05-06 16:30:16 +00:00
5af979cefe Merge pull request 'fix(deps): update dependency symfony/console to v8' (#49) from renovate/major-symfony into main
Reviewed-on: #49
2026-05-06 16:30:05 +00:00
fe2a8fbfa3 Merge pull request 'fix(deps): update dependency vuetify to v4' (#50) from renovate/vuetify-4.x into main
Reviewed-on: #50
2026-05-06 16:29:49 +00:00
ea09a821ab Merge pull request 'refactor: mail collections delete' (#52) from refactor/mail-collections into main
Reviewed-on: #52
2026-05-06 16:28:44 +00:00
44584fc306 refactor: mail collections delete
All checks were successful
JS Unit Tests / test (pull_request) Successful in 14s
Build Test / build (pull_request) Successful in 17s
PHP Unit Tests / test (pull_request) Successful in 42s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-06 12:28:18 -04:00
452048de64 Merge pull request 'fix: plain logging' (#51) from fix/plain-logging into main
Reviewed-on: #51
2026-05-06 16:25:43 +00:00
a7a94f93d8 fix: plain logging
All checks were successful
Build Test / build (pull_request) Successful in 16s
JS Unit Tests / test (pull_request) Successful in 15s
PHP Unit Tests / test (pull_request) Successful in 44s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-06 12:24:53 -04:00
2b89e50b77 fix(deps): update dependency vuetify to v4
All checks were successful
Build Test / build (pull_request) Successful in 19s
JS Unit Tests / test (pull_request) Successful in 19s
PHP Unit Tests / test (pull_request) Successful in 52s
2026-04-25 20:06:42 +00:00
4d758df68e fix(deps): update dependency symfony/console to v8
All checks were successful
JS Unit Tests / test (pull_request) Successful in 18s
Build Test / build (pull_request) Successful in 24s
PHP Unit Tests / test (pull_request) Successful in 51s
2026-04-25 20:06:37 +00:00
2cd85c3ffd chore(deps): update dependency vite-plugin-static-copy to v4
All checks were successful
JS Unit Tests / test (pull_request) Successful in 23s
Build Test / build (pull_request) Successful in 27s
PHP Unit Tests / test (pull_request) Successful in 1m33s
2026-04-25 20:06:21 +00:00
11 changed files with 809 additions and 1313 deletions

24
composer.lock generated
View File

@@ -393,16 +393,16 @@
},
{
"name": "phpseclib/phpseclib",
"version": "3.0.51",
"version": "3.0.52",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
"reference": "d59c94077f9c9915abb51ddb52ce85188ece1748"
"reference": "2adaefc83df2ec548558307690f376dd7d4f4fce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/d59c94077f9c9915abb51ddb52ce85188ece1748",
"reference": "d59c94077f9c9915abb51ddb52ce85188ece1748",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2adaefc83df2ec548558307690f376dd7d4f4fce",
"reference": "2adaefc83df2ec548558307690f376dd7d4f4fce",
"shasum": ""
},
"require": {
@@ -483,7 +483,7 @@
],
"support": {
"issues": "https://github.com/phpseclib/phpseclib/issues",
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.51"
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.52"
},
"funding": [
{
@@ -499,7 +499,7 @@
"type": "tidelift"
}
],
"time": "2026-04-10T01:33:53+00:00"
"time": "2026-04-27T07:02:15+00:00"
},
{
"name": "psr/container",
@@ -606,16 +606,16 @@
},
{
"name": "symfony/console",
"version": "v7.4.8",
"version": "v7.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707"
"reference": "d7d2b64a45a89d607865927b176fa51c33ddbb58"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707",
"reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707",
"url": "https://api.github.com/repos/symfony/console/zipball/d7d2b64a45a89d607865927b176fa51c33ddbb58",
"reference": "d7d2b64a45a89d607865927b176fa51c33ddbb58",
"shasum": ""
},
"require": {
@@ -680,7 +680,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v7.4.8"
"source": "https://github.com/symfony/console/tree/v7.4.9"
},
"funding": [
{
@@ -700,7 +700,7 @@
"type": "tidelift"
}
],
"time": "2026-03-30T13:54:39+00:00"
"time": "2026-04-22T15:21:55+00:00"
},
{
"name": "symfony/deprecation-contracts",

View File

@@ -57,15 +57,15 @@ return [
'per_tenant' => false,
// ── file driver options ────────────────────────────────────────────────
// Absolute path to the log directory. null = <project_root>/var/log
// Absolute path to the log directory. null = <project_root>/var/logs
'path' => null,
// Log channel — used as the filename without extension.
// 'app' → var/log/app.jsonl (or var/log/tenant/{id}/app.jsonl when per_tenant = true)
// 'app' → var/logs/app.jsonl (or var/logs/tenant/{id}/app.jsonl when per_tenant = true)
'channel' => 'app',
// ── syslog driver options ──────────────────────────────────────────────
// Identity tag passed to openlog(); visible in /var/log/syslog and journalctl -t ktrix
// Identity tag passed to openlog(); visible in /var/logs/syslog and journalctl -t ktrix
'ident' => 'ktrix',
// openlog() facility constant. Common values: LOG_USER, LOG_LOCAL0 … LOG_LOCAL7

View File

@@ -79,7 +79,7 @@ class LoggerFactory
$path = $logConfig['path'] ?? null;
if ($path === null || $path === '') {
$path = $projectDir . '/var/log';
$path = $projectDir . '/var/logs';
}
return new FileLogger($path, $channel);

View File

@@ -20,10 +20,8 @@ class PlainFileLogger implements LoggerInterface
*/
public function __construct(string $logDir, string $channel = 'app')
{
if (!is_dir($logDir)) {
@mkdir($logDir, 0775, true);
}
$this->logFile = rtrim($logDir, '/') . '/' . $channel . '.log';
$this->ensureWritablePath();
}
public function emergency($message, array $context = []): void { $this->log('emergency', $message, $context); }
@@ -37,12 +35,38 @@ class PlainFileLogger implements LoggerInterface
public function log($level, $message, array $context = []): void
{
$this->ensureWritablePath();
$dt = \DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', microtime(true)));
$timestamp = $dt?->format('Y-m-d H:i:s.u') ?? date('Y-m-d H:i:s');
$line = $timestamp . ' ' . $this->interpolate((string) $message, $context) . PHP_EOL;
@file_put_contents($this->logFile, $line, FILE_APPEND | LOCK_EX);
if (@file_put_contents($this->logFile, $line, FILE_APPEND | LOCK_EX) === false) {
error_log(sprintf('Failed to write to log file: %s', $this->logFile));
}
}
private function ensureWritablePath(): void
{
$logDir = dirname($this->logFile);
if (!is_dir($logDir)) {
@mkdir($logDir, 0777, true);
}
if (is_dir($logDir)) {
@chmod($logDir, 0777);
}
if (!file_exists($this->logFile)) {
@touch($this->logFile);
}
clearstatcache(true, $this->logFile);
if (file_exists($this->logFile)) {
@chmod($this->logFile, 0666);
}
}
private function interpolate(string $message, array $context): string

2003
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,7 @@
"@fontsource/inter": "5.2.8",
"@fontsource/poppins": "5.2.7",
"@fontsource/public-sans": "5.2.7",
"@fontsource/roboto": "5.2.9",
"@fontsource/roboto": "5.2.10",
"@mdi/font": "7.4.47",
"@tsconfig/node24": "24.0.4",
"@typescript-eslint/parser": "^8.55.0",
@@ -34,30 +34,30 @@
"vee-validate": "^4.15.1",
"vite-plugin-vuetify": "2.1.3",
"vue": "3.5.28",
"vue-router": "5.0.2",
"vue-router": "5.0.6",
"vue3-perfect-scrollbar": "2.0.0",
"vuetify": "3.11.8"
"vuetify": "4.0.6"
},
"devDependencies": {
"@eslint/js": "^9.18.0",
"@eslint/js": "^10.0.0",
"@types/dompurify": "^3.2.0",
"@types/node": "25.2.3",
"@vitejs/plugin-vue": "6.0.4",
"@types/node": "25.6.0",
"@vitejs/plugin-vue": "6.0.6",
"@vitest/coverage-v8": "^4.0.18",
"@vitest/ui": "^4.0.18",
"@vue/eslint-config-prettier": "10.2.0",
"@vue/test-utils": "^2.4.8",
"@vue/tsconfig": "0.8.1",
"eslint": "^9.39.4",
"eslint-plugin-vue": "10.7.0",
"jsdom": "^28.1.0",
"prettier": "3.8.1",
"sass": "1.97.3",
"@vue/tsconfig": "0.9.1",
"eslint": "^10.0.0",
"eslint-plugin-vue": "10.9.1",
"jsdom": "^29.0.0",
"prettier": "3.8.3",
"sass": "1.99.0",
"sass-loader": "16.0.7",
"typescript": "5.9.3",
"typescript": "6.0.3",
"typescript-eslint": "^8.59.0",
"vite": "7.3.1",
"vite-plugin-static-copy": "^3.4.0",
"vite": "8.0.10",
"vite-plugin-static-copy": "^4.0.0",
"vitest": "^4.0.18",
"vue-cli-plugin-vuetify": "2.5.8",
"vue-tsc": "^3.2.7"

View File

@@ -1,15 +1,9 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
],
"enabledManagers": [
"npm",
"composer"
],
"schedule": [
"before 3am"
],
"extends": ["config:recommended"],
"enabledManagers": ["npm", "composer", "github-actions"],
"timezone": "UTC",
"schedule": ["* 0-3 * * *"],
"dependencyDashboard": true,
"prConcurrentLimit": 5,
"prHourlyLimit": 2

View File

@@ -20,6 +20,7 @@ use JsonSerializable;
*/
enum CollectionRoles: string implements JsonSerializable {
case None = '';
case Inbox = 'inbox';
case Drafts = 'drafts';
case Sent = 'sent';
@@ -28,7 +29,6 @@ enum CollectionRoles: string implements JsonSerializable {
case Archive = 'archive';
case Outbox = 'outbox';
case Queue = 'queue';
case Custom = 'custom';
public function jsonSerialize(): string {
return $this->value;

View File

@@ -38,6 +38,7 @@ interface ServiceBaseInterface extends ResourceServiceBaseInterface {
// Collection Filter
public const CAPABILITY_COLLECTION_FILTER_LABEL = 'label';
public const CAPABILITY_COLLECTION_FILTER_ROLE = 'role';
public const CAPABILITY_COLLECTION_FILTER_SUBSCRIBED = 'subscribed';
// Collection Sort
public const CAPABILITY_COLLECTION_SORT_LABEL = 'label';
public const CAPABILITY_COLLECTION_SORT_RANK = 'rank';

View File

@@ -68,11 +68,10 @@ interface ServiceCollectionMutableInterface extends ServiceBaseInterface {
*
* @param string|int $identifier Collection ID
* @param bool $force Force deletion even if not empty
* @param bool $recursive Recursively delete contents
*
* @return bool True if deleted
* @return CollectionBaseInterface|true Collection object on soft delete, true on hard delete
*/
public function collectionDelete(string|int $identifier, bool $force = false, bool $recursive = false): bool;
public function collectionDelete(string|int $identifier, bool $force = false): CollectionBaseInterface | true;
/**
* Moves a collection to a new parent

View File

@@ -47,7 +47,8 @@ export default defineConfig(({ mode }) => ({
targets: [
{
src: path.resolve(__dirname, 'core/lib/index.php'),
dest: path.resolve(__dirname, 'public'),
dest: '.',
rename: { stripBase: true },
},
],
}),