27 Commits

Author SHA1 Message Date
33fa932f13 fix(deps): update vue monorepo to v3.5.34
Some checks failed
renovate/artifacts Artifact file update failure
Build Test / build (pull_request) Failing after 9s
JS Unit Tests / test (pull_request) Failing after 8s
PHP Unit Tests / test (pull_request) Successful in 44s
2026-05-15 12:52:26 +00:00
a2e59ba731 Merge pull request 'chore(deps): update dependency vue-tsc to v3.2.9' (#84) from renovate/vue-tsc-3.x-lockfile into main
Reviewed-on: #84
2026-05-15 03:26:42 +00:00
8175146eda Merge pull request 'chore(deps): update vitest monorepo to v4.1.6' (#86) from renovate/vitest-monorepo into main
Reviewed-on: #86
2026-05-15 03:26:33 +00:00
70ab6d537b Merge pull request 'chore(deps): update dependency @types/node to v25.8.0' (#89) from renovate/node-25.x into main
Reviewed-on: #89
2026-05-15 03:26:24 +00:00
a8e073e793 Merge pull request 'fix(deps): update dependency vuetify to v4.0.7' (#88) from renovate/vuetify-4.x into main
Reviewed-on: #88
2026-05-15 03:26:16 +00:00
16ec429347 Merge pull request 'chore(deps): update typescript-eslint monorepo to v8.59.3' (#85) from renovate/typescript-eslint-monorepo into main
Reviewed-on: #85
2026-05-15 03:26:09 +00:00
206d22ab1e Merge pull request 'chore(deps): update dependency vite to v8.0.13' (#83) from renovate/vite-8.x into main
Reviewed-on: #83
2026-05-15 03:25:59 +00:00
778cd47221 Merge pull request 'chore(deps): update dependency symfony/console to v7.4.11' (#82) from renovate/symfony into main
Reviewed-on: #82
2026-05-15 03:23:16 +00:00
08028b280b chore(deps): update dependency @types/node to v25.8.0
All checks were successful
Build Test / build (pull_request) Successful in 20s
JS Unit Tests / test (pull_request) Successful in 20s
PHP Unit Tests / test (pull_request) Successful in 40s
2026-05-15 03:22:43 +00:00
d6bbfb78ed fix(deps): update dependency vuetify to v4.0.7
All checks were successful
Build Test / build (pull_request) Successful in 19s
JS Unit Tests / test (pull_request) Successful in 12s
PHP Unit Tests / test (pull_request) Successful in 51s
2026-05-15 03:22:32 +00:00
d800ccb249 chore(deps): update vitest monorepo to v4.1.6
All checks were successful
Build Test / build (pull_request) Successful in 22s
JS Unit Tests / test (pull_request) Successful in 18s
PHP Unit Tests / test (pull_request) Successful in 57s
2026-05-15 03:22:24 +00:00
9fb3a481c2 chore(deps): update typescript-eslint monorepo to v8.59.3
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 1m0s
2026-05-15 03:22:18 +00:00
67f261e9ab chore(deps): update dependency vue-tsc to v3.2.9
All checks were successful
Build Test / build (pull_request) Successful in 20s
JS Unit Tests / test (pull_request) Successful in 20s
PHP Unit Tests / test (pull_request) Successful in 56s
2026-05-15 03:22:05 +00:00
24c9ddd010 chore(deps): update dependency vite to v8.0.13
All checks were successful
JS Unit Tests / test (pull_request) Successful in 21s
Build Test / build (pull_request) Successful in 25s
PHP Unit Tests / test (pull_request) Successful in 54s
2026-05-15 03:22:02 +00:00
f29694c9d6 chore(deps): update dependency symfony/console to v7.4.11
All checks were successful
Build Test / build (pull_request) Successful in 26s
JS Unit Tests / test (pull_request) Successful in 25s
PHP Unit Tests / test (pull_request) Successful in 1m12s
2026-05-15 03:21:57 +00:00
06825f9d25 Merge pull request 'chore(deps): update dependency dompurify to v3.4.3' (#80) from renovate/dompurify-3.x-lockfile into main
Reviewed-on: #80
2026-05-15 03:12:18 +00:00
7fd98a1465 Merge pull request 'chore(deps): update dependency sass-loader to v16.0.8' (#81) from renovate/sass-loader-16.x into main
Reviewed-on: #81
2026-05-15 03:10:37 +00:00
1cfa18c8cf chore(deps): update dependency sass-loader to v16.0.8
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 38s
2026-05-15 03:09:48 +00:00
3da9fe6211 chore(deps): update dependency dompurify to v3.4.3
All checks were successful
Build Test / build (pull_request) Successful in 21s
JS Unit Tests / test (pull_request) Successful in 22s
PHP Unit Tests / test (pull_request) Successful in 49s
2026-05-15 03:09:45 +00:00
858e9fddf0 Merge pull request 'refactor: mail interfaces' (#79) from refactor/mail-interfaces into main
Some checks are pending
Renovate / renovate (push) Has started running
Reviewed-on: #79
2026-05-15 02:56:07 +00:00
f3c882454d refactor: mail interfaces
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 39s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-14 22:54:51 -04:00
d6005246dc Merge pull request 'refactor: service interfaces' (#78) from refactor/service-interfaces into main
Some checks are pending
Renovate / renovate (push) Waiting to run
Reviewed-on: #78
2026-05-09 21:00:33 +00:00
b8cda71c17 refactor: service interfaces
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 48s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-09 17:00:00 -04:00
4e7260ad86 Merge pull request 'refactor: entity move and delete' (#77) from refactor/entity-move-and-delete into main
Some checks failed
Renovate / renovate (push) Failing after 1m56s
Reviewed-on: #77
2026-05-08 03:58:54 +00:00
69d6c7fd1a refactor: entity move and delete
All checks were successful
Build Test / build (pull_request) Successful in 18s
JS Unit Tests / test (pull_request) Successful in 16s
PHP Unit Tests / test (pull_request) Successful in 41s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-07 23:58:36 -04:00
6d71bb49d5 Merge pull request 'chore: downgrade console and mongodb' (#76) from chore/downgrade-mongodb into main
Some checks failed
Renovate / renovate (push) Failing after 1m46s
Reviewed-on: #76
2026-05-07 03:35:06 +00:00
19e49379f4 chore: downgrade console and mongodb
All checks were successful
Build Test / build (pull_request) Successful in 24s
JS Unit Tests / test (pull_request) Successful in 23s
PHP Unit Tests / test (pull_request) Successful in 46s
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-05-06 23:34:51 -04:00
35 changed files with 902 additions and 1234 deletions

20
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "b14b010c422e222aeb1e33104e2a09ec", "content-hash": "85ac161c93851c4863257009fc596644",
"packages": [ "packages": [
{ {
"name": "laravel/serializable-closure", "name": "laravel/serializable-closure",
@@ -606,16 +606,16 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v7.4.9", "version": "v7.4.11",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "d7d2b64a45a89d607865927b176fa51c33ddbb58" "reference": "ed0107e43ab452aa77ae99e005b95e56b556e075"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/d7d2b64a45a89d607865927b176fa51c33ddbb58", "url": "https://api.github.com/repos/symfony/console/zipball/ed0107e43ab452aa77ae99e005b95e56b556e075",
"reference": "d7d2b64a45a89d607865927b176fa51c33ddbb58", "reference": "ed0107e43ab452aa77ae99e005b95e56b556e075",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -680,7 +680,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v7.4.9" "source": "https://github.com/symfony/console/tree/v7.4.11"
}, },
"funding": [ "funding": [
{ {
@@ -700,7 +700,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-04-22T15:21:55+00:00" "time": "2026-05-13T12:04:42+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@@ -3148,7 +3148,7 @@
], ],
"aliases": [], "aliases": [],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": [], "stability-flags": {},
"prefer-stable": true, "prefer-stable": true,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
@@ -3156,6 +3156,6 @@
"ext-ctype": "*", "ext-ctype": "*",
"ext-iconv": "*" "ext-iconv": "*"
}, },
"platform-dev": [], "platform-dev": {},
"plugin-api-version": "2.3.0" "plugin-api-version": "2.9.0"
} }

454
package-lock.json generated
View File

@@ -24,12 +24,12 @@
"vue": "3.5.28", "vue": "3.5.28",
"vue-router": "5.0.6", "vue-router": "5.0.6",
"vue3-perfect-scrollbar": "2.0.0", "vue3-perfect-scrollbar": "2.0.0",
"vuetify": "4.0.6" "vuetify": "4.0.7"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^10.0.0", "@eslint/js": "^10.0.0",
"@types/dompurify": "^3.2.0", "@types/dompurify": "^3.2.0",
"@types/node": "25.6.0", "@types/node": "25.8.0",
"@vitejs/plugin-vue": "6.0.6", "@vitejs/plugin-vue": "6.0.6",
"@vitest/coverage-v8": "^4.0.18", "@vitest/coverage-v8": "^4.0.18",
"@vitest/ui": "^4.0.18", "@vitest/ui": "^4.0.18",
@@ -41,10 +41,10 @@
"jsdom": "^29.0.0", "jsdom": "^29.0.0",
"prettier": "3.8.3", "prettier": "3.8.3",
"sass": "1.99.0", "sass": "1.99.0",
"sass-loader": "16.0.7", "sass-loader": "16.0.8",
"typescript": "6.0.3", "typescript": "6.0.3",
"typescript-eslint": "^8.59.0", "typescript-eslint": "^8.59.0",
"vite": "8.0.10", "vite": "8.0.13",
"vite-plugin-static-copy": "^4.0.0", "vite-plugin-static-copy": "^4.0.0",
"vitest": "^4.0.18", "vitest": "^4.0.18",
"vue-cli-plugin-vuetify": "2.5.8", "vue-cli-plugin-vuetify": "2.5.8",
@@ -700,9 +700,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@oxc-project/types": { "node_modules/@oxc-project/types": {
"version": "0.127.0", "version": "0.130.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.130.0.tgz",
"integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", "integrity": "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/Boshen" "url": "https://github.com/sponsors/Boshen"
@@ -1036,9 +1036,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@rolldown/binding-android-arm64": { "node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.1.tgz",
"integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", "integrity": "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1052,9 +1052,9 @@
} }
}, },
"node_modules/@rolldown/binding-darwin-arm64": { "node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.1.tgz",
"integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", "integrity": "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1068,9 +1068,9 @@
} }
}, },
"node_modules/@rolldown/binding-darwin-x64": { "node_modules/@rolldown/binding-darwin-x64": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.1.tgz",
"integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", "integrity": "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1084,9 +1084,9 @@
} }
}, },
"node_modules/@rolldown/binding-freebsd-x64": { "node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.1.tgz",
"integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", "integrity": "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1100,9 +1100,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm-gnueabihf": { "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.1.tgz",
"integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", "integrity": "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -1116,9 +1116,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm64-gnu": { "node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.1.tgz",
"integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", "integrity": "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1132,9 +1132,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm64-musl": { "node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.1.tgz",
"integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", "integrity": "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1148,9 +1148,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-ppc64-gnu": { "node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.1.tgz",
"integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", "integrity": "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@@ -1164,9 +1164,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-s390x-gnu": { "node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.1.tgz",
"integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", "integrity": "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
@@ -1180,9 +1180,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-x64-gnu": { "node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.1.tgz",
"integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", "integrity": "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1196,9 +1196,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-x64-musl": { "node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.1.tgz",
"integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", "integrity": "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1212,9 +1212,9 @@
} }
}, },
"node_modules/@rolldown/binding-openharmony-arm64": { "node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.1.tgz",
"integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", "integrity": "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1228,9 +1228,9 @@
} }
}, },
"node_modules/@rolldown/binding-wasm32-wasi": { "node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.1.tgz",
"integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", "integrity": "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==",
"cpu": [ "cpu": [
"wasm32" "wasm32"
], ],
@@ -1246,9 +1246,9 @@
} }
}, },
"node_modules/@rolldown/binding-win32-arm64-msvc": { "node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.1.tgz",
"integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", "integrity": "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1262,9 +1262,9 @@
} }
}, },
"node_modules/@rolldown/binding-win32-x64-msvc": { "node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.1.tgz",
"integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==", "integrity": "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1379,13 +1379,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "25.6.0", "version": "25.8.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz",
"integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==",
"devOptional": true, "devOptional": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~7.19.0" "undici-types": ">=7.24.0 <7.24.7"
} }
}, },
"node_modules/@types/trusted-types": { "node_modules/@types/trusted-types": {
@@ -1396,17 +1396,17 @@
"optional": true "optional": true
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz",
"integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==", "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.12.2", "@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.59.2", "@typescript-eslint/scope-manager": "8.59.3",
"@typescript-eslint/type-utils": "8.59.2", "@typescript-eslint/type-utils": "8.59.3",
"@typescript-eslint/utils": "8.59.2", "@typescript-eslint/utils": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.2", "@typescript-eslint/visitor-keys": "8.59.3",
"ignore": "^7.0.5", "ignore": "^7.0.5",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0" "ts-api-utils": "^2.5.0"
@@ -1419,7 +1419,7 @@
"url": "https://opencollective.com/typescript-eslint" "url": "https://opencollective.com/typescript-eslint"
}, },
"peerDependencies": { "peerDependencies": {
"@typescript-eslint/parser": "^8.59.2", "@typescript-eslint/parser": "^8.59.3",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0" "typescript": ">=4.8.4 <6.1.0"
} }
@@ -1435,15 +1435,15 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz",
"integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.59.2", "@typescript-eslint/scope-manager": "8.59.3",
"@typescript-eslint/types": "8.59.2", "@typescript-eslint/types": "8.59.3",
"@typescript-eslint/typescript-estree": "8.59.2", "@typescript-eslint/typescript-estree": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.2", "@typescript-eslint/visitor-keys": "8.59.3",
"debug": "^4.4.3" "debug": "^4.4.3"
}, },
"engines": { "engines": {
@@ -1459,13 +1459,13 @@
} }
}, },
"node_modules/@typescript-eslint/project-service": { "node_modules/@typescript-eslint/project-service": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz",
"integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==", "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.59.2", "@typescript-eslint/tsconfig-utils": "^8.59.3",
"@typescript-eslint/types": "^8.59.2", "@typescript-eslint/types": "^8.59.3",
"debug": "^4.4.3" "debug": "^4.4.3"
}, },
"engines": { "engines": {
@@ -1480,13 +1480,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz",
"integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.59.2", "@typescript-eslint/types": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.2" "@typescript-eslint/visitor-keys": "8.59.3"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1497,9 +1497,9 @@
} }
}, },
"node_modules/@typescript-eslint/tsconfig-utils": { "node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz",
"integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==", "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1513,15 +1513,15 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz",
"integrity": "sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==", "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.59.2", "@typescript-eslint/types": "8.59.3",
"@typescript-eslint/typescript-estree": "8.59.2", "@typescript-eslint/typescript-estree": "8.59.3",
"@typescript-eslint/utils": "8.59.2", "@typescript-eslint/utils": "8.59.3",
"debug": "^4.4.3", "debug": "^4.4.3",
"ts-api-utils": "^2.5.0" "ts-api-utils": "^2.5.0"
}, },
@@ -1538,9 +1538,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz",
"integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1551,15 +1551,15 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz",
"integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==", "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/project-service": "8.59.2", "@typescript-eslint/project-service": "8.59.3",
"@typescript-eslint/tsconfig-utils": "8.59.2", "@typescript-eslint/tsconfig-utils": "8.59.3",
"@typescript-eslint/types": "8.59.2", "@typescript-eslint/types": "8.59.3",
"@typescript-eslint/visitor-keys": "8.59.2", "@typescript-eslint/visitor-keys": "8.59.3",
"debug": "^4.4.3", "debug": "^4.4.3",
"minimatch": "^10.2.2", "minimatch": "^10.2.2",
"semver": "^7.7.3", "semver": "^7.7.3",
@@ -1578,16 +1578,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz",
"integrity": "sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==", "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.9.1", "@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.59.2", "@typescript-eslint/scope-manager": "8.59.3",
"@typescript-eslint/types": "8.59.2", "@typescript-eslint/types": "8.59.3",
"@typescript-eslint/typescript-estree": "8.59.2" "@typescript-eslint/typescript-estree": "8.59.3"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1602,12 +1602,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz",
"integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.59.2", "@typescript-eslint/types": "8.59.3",
"eslint-visitor-keys": "^5.0.0" "eslint-visitor-keys": "^5.0.0"
}, },
"engines": { "engines": {
@@ -1636,14 +1636,14 @@
} }
}, },
"node_modules/@vitest/coverage-v8": { "node_modules/@vitest/coverage-v8": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.6.tgz",
"integrity": "sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==", "integrity": "sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@bcoe/v8-coverage": "^1.0.2", "@bcoe/v8-coverage": "^1.0.2",
"@vitest/utils": "4.1.5", "@vitest/utils": "4.1.6",
"ast-v8-to-istanbul": "^1.0.0", "ast-v8-to-istanbul": "^1.0.0",
"istanbul-lib-coverage": "^3.2.2", "istanbul-lib-coverage": "^3.2.2",
"istanbul-lib-report": "^3.0.1", "istanbul-lib-report": "^3.0.1",
@@ -1657,8 +1657,8 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
}, },
"peerDependencies": { "peerDependencies": {
"@vitest/browser": "4.1.5", "@vitest/browser": "4.1.6",
"vitest": "4.1.5" "vitest": "4.1.6"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@vitest/browser": { "@vitest/browser": {
@@ -1667,16 +1667,16 @@
} }
}, },
"node_modules/@vitest/expect": { "node_modules/@vitest/expect": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz",
"integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", "integrity": "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@standard-schema/spec": "^1.1.0", "@standard-schema/spec": "^1.1.0",
"@types/chai": "^5.2.2", "@types/chai": "^5.2.2",
"@vitest/spy": "4.1.5", "@vitest/spy": "4.1.6",
"@vitest/utils": "4.1.5", "@vitest/utils": "4.1.6",
"chai": "^6.2.2", "chai": "^6.2.2",
"tinyrainbow": "^3.1.0" "tinyrainbow": "^3.1.0"
}, },
@@ -1685,13 +1685,13 @@
} }
}, },
"node_modules/@vitest/mocker": { "node_modules/@vitest/mocker": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz",
"integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vitest/spy": "4.1.5", "@vitest/spy": "4.1.6",
"estree-walker": "^3.0.3", "estree-walker": "^3.0.3",
"magic-string": "^0.30.21" "magic-string": "^0.30.21"
}, },
@@ -1722,9 +1722,9 @@
} }
}, },
"node_modules/@vitest/pretty-format": { "node_modules/@vitest/pretty-format": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz",
"integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", "integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -1735,13 +1735,13 @@
} }
}, },
"node_modules/@vitest/runner": { "node_modules/@vitest/runner": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz",
"integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", "integrity": "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vitest/utils": "4.1.5", "@vitest/utils": "4.1.6",
"pathe": "^2.0.3" "pathe": "^2.0.3"
}, },
"funding": { "funding": {
@@ -1749,14 +1749,14 @@
} }
}, },
"node_modules/@vitest/snapshot": { "node_modules/@vitest/snapshot": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz",
"integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", "integrity": "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vitest/pretty-format": "4.1.5", "@vitest/pretty-format": "4.1.6",
"@vitest/utils": "4.1.5", "@vitest/utils": "4.1.6",
"magic-string": "^0.30.21", "magic-string": "^0.30.21",
"pathe": "^2.0.3" "pathe": "^2.0.3"
}, },
@@ -1765,9 +1765,9 @@
} }
}, },
"node_modules/@vitest/spy": { "node_modules/@vitest/spy": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz",
"integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", "integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"funding": { "funding": {
@@ -1775,13 +1775,13 @@
} }
}, },
"node_modules/@vitest/ui": { "node_modules/@vitest/ui": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.6.tgz",
"integrity": "sha512-3Z9HNFiV0IF1fk0JPiK+7kE1GcaIPefQQIBYur6PM5yFIq6agys3uqP/0t966e1wXfmjbRCHDe7qW236Xjwnag==", "integrity": "sha512-wiu5em68DfGv/2HFvI1Njr7JI2CHcBlQvereSzVG8my53PRxjTNOCsD9VOkRKrsJBDHmyuXvosxWZw7T91a2mw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vitest/utils": "4.1.5", "@vitest/utils": "4.1.6",
"fflate": "^0.8.2", "fflate": "^0.8.2",
"flatted": "^3.4.2", "flatted": "^3.4.2",
"pathe": "^2.0.3", "pathe": "^2.0.3",
@@ -1793,17 +1793,17 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
}, },
"peerDependencies": { "peerDependencies": {
"vitest": "4.1.5" "vitest": "4.1.6"
} }
}, },
"node_modules/@vitest/utils": { "node_modules/@vitest/utils": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz",
"integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", "integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vitest/pretty-format": "4.1.5", "@vitest/pretty-format": "4.1.6",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"tinyrainbow": "^3.1.0" "tinyrainbow": "^3.1.0"
}, },
@@ -1966,16 +1966,16 @@
} }
}, },
"node_modules/@vue/language-core": { "node_modules/@vue/language-core": {
"version": "3.2.8", "version": "3.2.9",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.8.tgz", "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.9.tgz",
"integrity": "sha512-9OiSPQFiAAWNVnXb0d2dcTmcKnFQamhuNES6ayyISrb/mwPWVgoGdAqSfCWqKhQpa3D5gDTcYD+w7ObiheZ81g==", "integrity": "sha512-ie0ojt/0fU/GfIogh+zgHbaYRPlt9S+cLOxcWwF7nTSFh897BVgnFKL2byT4kpp1mlqYWZ2psGwSniyE2xsxYw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@volar/language-core": "2.4.28", "@volar/language-core": "2.4.28",
"@vue/compiler-dom": "^3.5.0", "@vue/compiler-dom": "^3.5.0",
"@vue/shared": "^3.5.0", "@vue/shared": "^3.5.0",
"alien-signals": "^3.1.2", "alien-signals": "^3.2.0",
"muggle-string": "^0.4.1", "muggle-string": "^0.4.1",
"path-browserify": "^1.0.1", "path-browserify": "^1.0.1",
"picomatch": "^4.0.4" "picomatch": "^4.0.4"
@@ -2450,9 +2450,9 @@
} }
}, },
"node_modules/alien-signals": { "node_modules/alien-signals": {
"version": "3.1.2", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz", "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz",
"integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@@ -2952,9 +2952,9 @@
} }
}, },
"node_modules/dompurify": { "node_modules/dompurify": {
"version": "3.4.2", "version": "3.4.3",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.3.tgz",
"integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==", "integrity": "sha512-VVwJidIJcp1hpg2OMXML3ZVRPYSZiq4aX7qBh83BSIpOaRDqI+qxhXjjIWnpzkOXhmp0L81lnoME1mnCc9H48A==",
"license": "(MPL-2.0 OR Apache-2.0)", "license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": { "optionalDependencies": {
"@types/trusted-types": "^2.0.7" "@types/trusted-types": "^2.0.7"
@@ -4941,9 +4941,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.10", "version": "8.5.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
"integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -5117,13 +5117,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/rolldown": { "node_modules/rolldown": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.1.tgz",
"integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==", "integrity": "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@oxc-project/types": "=0.127.0", "@oxc-project/types": "=0.130.0",
"@rolldown/pluginutils": "1.0.0-rc.17" "@rolldown/pluginutils": "^1.0.0"
}, },
"bin": { "bin": {
"rolldown": "bin/cli.mjs" "rolldown": "bin/cli.mjs"
@@ -5132,27 +5132,27 @@
"node": "^20.19.0 || >=22.12.0" "node": "^20.19.0 || >=22.12.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rolldown/binding-android-arm64": "1.0.0-rc.17", "@rolldown/binding-android-arm64": "1.0.1",
"@rolldown/binding-darwin-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-arm64": "1.0.1",
"@rolldown/binding-darwin-x64": "1.0.0-rc.17", "@rolldown/binding-darwin-x64": "1.0.1",
"@rolldown/binding-freebsd-x64": "1.0.0-rc.17", "@rolldown/binding-freebsd-x64": "1.0.1",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", "@rolldown/binding-linux-arm-gnueabihf": "1.0.1",
"@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-gnu": "1.0.1",
"@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-musl": "1.0.1",
"@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-ppc64-gnu": "1.0.1",
"@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-s390x-gnu": "1.0.1",
"@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-gnu": "1.0.1",
"@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", "@rolldown/binding-linux-x64-musl": "1.0.1",
"@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", "@rolldown/binding-openharmony-arm64": "1.0.1",
"@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", "@rolldown/binding-wasm32-wasi": "1.0.1",
"@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", "@rolldown/binding-win32-arm64-msvc": "1.0.1",
"@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" "@rolldown/binding-win32-x64-msvc": "1.0.1"
} }
}, },
"node_modules/rolldown/node_modules/@rolldown/pluginutils": { "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
"version": "1.0.0-rc.17", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
"integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/sass": { "node_modules/sass": {
@@ -5177,9 +5177,9 @@
} }
}, },
"node_modules/sass-loader": { "node_modules/sass-loader": {
"version": "16.0.7", "version": "16.0.8",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.7.tgz", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.8.tgz",
"integrity": "sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==", "integrity": "sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -5922,16 +5922,16 @@
} }
}, },
"node_modules/typescript-eslint": { "node_modules/typescript-eslint": {
"version": "8.59.2", "version": "8.59.3",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.2.tgz", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz",
"integrity": "sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==", "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/eslint-plugin": "8.59.2", "@typescript-eslint/eslint-plugin": "8.59.3",
"@typescript-eslint/parser": "8.59.2", "@typescript-eslint/parser": "8.59.3",
"@typescript-eslint/typescript-estree": "8.59.2", "@typescript-eslint/typescript-estree": "8.59.3",
"@typescript-eslint/utils": "8.59.2" "@typescript-eslint/utils": "8.59.3"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5962,9 +5962,9 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "7.19.2", "version": "7.24.6",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
"integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
"devOptional": true, "devOptional": true,
"license": "MIT" "license": "MIT"
}, },
@@ -6070,15 +6070,15 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "8.0.10", "version": "8.0.13",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.13.tgz",
"integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==", "integrity": "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"lightningcss": "^1.32.0", "lightningcss": "^1.32.0",
"picomatch": "^4.0.4", "picomatch": "^4.0.4",
"postcss": "^8.5.10", "postcss": "^8.5.14",
"rolldown": "1.0.0-rc.17", "rolldown": "1.0.1",
"tinyglobby": "^0.2.16" "tinyglobby": "^0.2.16"
}, },
"bin": { "bin": {
@@ -6095,7 +6095,7 @@
}, },
"peerDependencies": { "peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0", "@types/node": "^20.19.0 || >=22.12.0",
"@vitejs/devtools": "^0.1.0", "@vitejs/devtools": "^0.1.18",
"esbuild": "^0.27.0 || ^0.28.0", "esbuild": "^0.27.0 || ^0.28.0",
"jiti": ">=1.21.0", "jiti": ">=1.21.0",
"less": "^4.0.0", "less": "^4.0.0",
@@ -6253,19 +6253,19 @@
} }
}, },
"node_modules/vitest": { "node_modules/vitest": {
"version": "4.1.5", "version": "4.1.6",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.6.tgz",
"integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", "integrity": "sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vitest/expect": "4.1.5", "@vitest/expect": "4.1.6",
"@vitest/mocker": "4.1.5", "@vitest/mocker": "4.1.6",
"@vitest/pretty-format": "4.1.5", "@vitest/pretty-format": "4.1.6",
"@vitest/runner": "4.1.5", "@vitest/runner": "4.1.6",
"@vitest/snapshot": "4.1.5", "@vitest/snapshot": "4.1.6",
"@vitest/spy": "4.1.5", "@vitest/spy": "4.1.6",
"@vitest/utils": "4.1.5", "@vitest/utils": "4.1.6",
"es-module-lexer": "^2.0.0", "es-module-lexer": "^2.0.0",
"expect-type": "^1.3.0", "expect-type": "^1.3.0",
"magic-string": "^0.30.21", "magic-string": "^0.30.21",
@@ -6293,12 +6293,12 @@
"@edge-runtime/vm": "*", "@edge-runtime/vm": "*",
"@opentelemetry/api": "^1.9.0", "@opentelemetry/api": "^1.9.0",
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
"@vitest/browser-playwright": "4.1.5", "@vitest/browser-playwright": "4.1.6",
"@vitest/browser-preview": "4.1.5", "@vitest/browser-preview": "4.1.6",
"@vitest/browser-webdriverio": "4.1.5", "@vitest/browser-webdriverio": "4.1.6",
"@vitest/coverage-istanbul": "4.1.5", "@vitest/coverage-istanbul": "4.1.6",
"@vitest/coverage-v8": "4.1.5", "@vitest/coverage-v8": "4.1.6",
"@vitest/ui": "4.1.5", "@vitest/ui": "4.1.6",
"happy-dom": "*", "happy-dom": "*",
"jsdom": "*", "jsdom": "*",
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0" "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
@@ -6532,14 +6532,14 @@
} }
}, },
"node_modules/vue-tsc": { "node_modules/vue-tsc": {
"version": "3.2.8", "version": "3.2.9",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.8.tgz", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.9.tgz",
"integrity": "sha512-27vTLJ6Q2370obOd0PFYoYoKnmXJ521uUIedrs3Zhhhg/8YG10VOCMmwt+JQslatpAMTDbnWiitLnoD5VlIvog==", "integrity": "sha512-qm8/nbo+9eZc1SCndm9wT+gq23pM+wRIdHY0wjm83B3lIginHTwcdrLUyTrKjDWXbMVNjKegNrnymhpdqnCL3A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@volar/typescript": "2.4.28", "@volar/typescript": "2.4.28",
"@vue/language-core": "3.2.8" "@vue/language-core": "3.2.9"
}, },
"bin": { "bin": {
"vue-tsc": "bin/vue-tsc.js" "vue-tsc": "bin/vue-tsc.js"
@@ -6616,9 +6616,9 @@
} }
}, },
"node_modules/vuetify": { "node_modules/vuetify": {
"version": "4.0.6", "version": "4.0.7",
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-4.0.6.tgz", "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-4.0.7.tgz",
"integrity": "sha512-a4kasYa3SuFI5IOG/0Fx04M4TWeef5mCdTTKFlaxt86oz16RMQ/DJ3BynlOnIdUODt7NxYIkdLYud070/vVEUQ==", "integrity": "sha512-SV+YJkBmudY3s9qfZO2ZGUsrD0TDQU8pMBH1ERga9AEyjGvioZuXXh93V9wHxXJphvqRC2NW10Nt2lW9IZQcPw==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"type": "github", "type": "github",

View File

@@ -33,15 +33,15 @@
"pinia": "3.0.4", "pinia": "3.0.4",
"vee-validate": "^4.15.1", "vee-validate": "^4.15.1",
"vite-plugin-vuetify": "2.1.3", "vite-plugin-vuetify": "2.1.3",
"vue": "3.5.28", "vue": "3.5.34",
"vue-router": "5.0.6", "vue-router": "5.0.6",
"vue3-perfect-scrollbar": "2.0.0", "vue3-perfect-scrollbar": "2.0.0",
"vuetify": "4.0.6" "vuetify": "4.0.7"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^10.0.0", "@eslint/js": "^10.0.0",
"@types/dompurify": "^3.2.0", "@types/dompurify": "^3.2.0",
"@types/node": "25.6.0", "@types/node": "25.8.0",
"@vitejs/plugin-vue": "6.0.6", "@vitejs/plugin-vue": "6.0.6",
"@vitest/coverage-v8": "^4.0.18", "@vitest/coverage-v8": "^4.0.18",
"@vitest/ui": "^4.0.18", "@vitest/ui": "^4.0.18",
@@ -53,10 +53,10 @@
"jsdom": "^29.0.0", "jsdom": "^29.0.0",
"prettier": "3.8.3", "prettier": "3.8.3",
"sass": "1.99.0", "sass": "1.99.0",
"sass-loader": "16.0.7", "sass-loader": "16.0.8",
"typescript": "6.0.3", "typescript": "6.0.3",
"typescript-eslint": "^8.59.0", "typescript-eslint": "^8.59.0",
"vite": "8.0.10", "vite": "8.0.13",
"vite-plugin-static-copy": "^4.0.0", "vite-plugin-static-copy": "^4.0.0",
"vitest": "^4.0.18", "vitest": "^4.0.18",
"vue-cli-plugin-vuetify": "2.5.8", "vue-cli-plugin-vuetify": "2.5.8",

View File

@@ -9,6 +9,7 @@ declare(strict_types=1);
namespace KTXF\Mail\Collection; namespace KTXF\Mail\Collection;
use KTXF\Resource\Identifier\CollectionIdentifier;
use KTXF\Resource\Provider\Node\NodeBaseAbstract; use KTXF\Resource\Provider\Node\NodeBaseAbstract;
/** /**
@@ -20,8 +21,13 @@ use KTXF\Resource\Provider\Node\NodeBaseAbstract;
*/ */
abstract class CollectionBase extends NodeBaseAbstract implements CollectionBaseInterface { abstract class CollectionBase extends NodeBaseAbstract implements CollectionBaseInterface {
protected string $type = 'mail.collection';
protected CollectionPropertiesBaseAbstract $properties; protected CollectionPropertiesBaseAbstract $properties;
protected function nodeIdentifier(): CollectionIdentifier {
return new CollectionIdentifier($this->data[static::PROPERTY_PROVIDER], $this->data[static::PROPERTY_SERVICE], (string) $this->data[static::PROPERTY_IDENTIFIER]);
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@@ -9,6 +9,7 @@ declare(strict_types=1);
namespace KTXF\Mail\Collection; namespace KTXF\Mail\Collection;
use KTXF\Resource\Identifier\CollectionIdentifier;
use KTXF\Resource\Provider\Node\NodeMutableAbstract; use KTXF\Resource\Provider\Node\NodeMutableAbstract;
use KTXF\Resource\Provider\Node\NodePropertiesMutableInterface; use KTXF\Resource\Provider\Node\NodePropertiesMutableInterface;
@@ -23,6 +24,10 @@ abstract class CollectionMutableAbstract extends NodeMutableAbstract implements
protected CollectionPropertiesMutableAbstract $properties; protected CollectionPropertiesMutableAbstract $properties;
protected function nodeIdentifier(): CollectionIdentifier {
return new CollectionIdentifier($this->data[static::PROPERTY_PROVIDER], $this->data[static::PROPERTY_SERVICE], $this->data[static::PROPERTY_IDENTIFIER]);
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@@ -20,49 +20,47 @@ use KTXF\Resource\Provider\Node\NodePropertiesBaseAbstract;
*/ */
abstract class CollectionPropertiesBaseAbstract extends NodePropertiesBaseAbstract implements CollectionPropertiesBaseInterface { abstract class CollectionPropertiesBaseAbstract extends NodePropertiesBaseAbstract implements CollectionPropertiesBaseInterface {
public const JSON_TYPE = CollectionPropertiesBaseInterface::JSON_TYPE;
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function total(): int { public function total(): int {
return $this->data['total'] ?? 0; return $this->data[static::PROPERTY_TOTAL] ?? 0;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function unread(): int { public function unread(): int {
return $this->data['unread'] ?? 0; return $this->data[static::PROPERTY_UNREAD] ?? 0;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getLabel(): string { public function getLabel(): string {
return $this->data['label'] ?? ''; return $this->data[static::PROPERTY_LABEL] ?? '';
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getRole(): CollectionRoles { public function getRole(): CollectionRoles {
return isset($this->data['role']) return isset($this->data[static::PROPERTY_ROLE])
? ($this->data['role'] instanceof CollectionRoles ? $this->data['role'] : CollectionRoles::from($this->data['role'])) ? ($this->data[static::PROPERTY_ROLE] instanceof CollectionRoles ? $this->data[static::PROPERTY_ROLE] : CollectionRoles::from($this->data[static::PROPERTY_ROLE]))
: CollectionRoles::Custom; : CollectionRoles::None;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getRank(): int { public function getRank(): int {
return $this->data['rank'] ?? 0; return $this->data[static::PROPERTY_RANK] ?? 0;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getSubscription(): bool { public function getSubscription(): bool {
return $this->data['subscribed'] ?? false; return $this->data[static::PROPERTY_SUBSCRIPTION] ?? false;
} }
} }

View File

@@ -13,13 +13,12 @@ use KTXF\Resource\Provider\Node\NodePropertiesBaseInterface;
interface CollectionPropertiesBaseInterface extends NodePropertiesBaseInterface { interface CollectionPropertiesBaseInterface extends NodePropertiesBaseInterface {
public const JSON_TYPE = 'mail.collection'; public const PROPERTY_TOTAL = 'total';
public const JSON_PROPERTY_TOTAL = 'total'; public const PROPERTY_UNREAD = 'unread';
public const JSON_PROPERTY_UNREAD = 'unread'; public const PROPERTY_LABEL = 'label';
public const JSON_PROPERTY_LABEL = 'label'; public const PROPERTY_ROLE = 'role';
public const JSON_PROPERTY_ROLE = 'role'; public const PROPERTY_RANK = 'rank';
public const JSON_PROPERTY_RANK = 'rank'; public const PROPERTY_SUBSCRIPTION = 'subscription';
public const JSON_PROPERTY_SUBSCRIPTION = 'subscription';
public function total(): int; public function total(): int;

View File

@@ -16,8 +16,6 @@ use KTXF\Resource\Provider\Node\NodePropertiesMutableAbstract;
*/ */
abstract class CollectionPropertiesMutableAbstract extends CollectionPropertiesBaseAbstract implements CollectionPropertiesMutableInterface { abstract class CollectionPropertiesMutableAbstract extends CollectionPropertiesBaseAbstract implements CollectionPropertiesMutableInterface {
public const JSON_TYPE = CollectionPropertiesBaseInterface::JSON_TYPE;
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -35,7 +33,7 @@ abstract class CollectionPropertiesMutableAbstract extends CollectionPropertiesB
* @inheritDoc * @inheritDoc
*/ */
public function setLabel(string $value): static { public function setLabel(string $value): static {
$this->data['label'] = $value; $this->data[self::PROPERTY_LABEL] = $value;
return $this; return $this;
} }
@@ -43,7 +41,7 @@ abstract class CollectionPropertiesMutableAbstract extends CollectionPropertiesB
* @inheritDoc * @inheritDoc
*/ */
public function setRole(CollectionRoles $value): static { public function setRole(CollectionRoles $value): static {
$this->data['role'] = $value; $this->data[self::PROPERTY_ROLE] = $value;
return $this; return $this;
} }
@@ -51,7 +49,7 @@ abstract class CollectionPropertiesMutableAbstract extends CollectionPropertiesB
* @inheritDoc * @inheritDoc
*/ */
public function setRank(int $value): static { public function setRank(int $value): static {
$this->data['rank'] = $value; $this->data[self::PROPERTY_RANK] = $value;
return $this; return $this;
} }
@@ -59,7 +57,7 @@ abstract class CollectionPropertiesMutableAbstract extends CollectionPropertiesB
* @inheritDoc * @inheritDoc
*/ */
public function setSubscription(bool $value): static { public function setSubscription(bool $value): static {
$this->data['subscription'] = $value; $this->data[self::PROPERTY_SUBSCRIPTION] = $value;
return $this; return $this;
} }
} }

View File

@@ -13,8 +13,6 @@ use KTXF\Resource\Provider\Node\NodePropertiesMutableInterface;
interface CollectionPropertiesMutableInterface extends CollectionPropertiesBaseInterface, NodePropertiesMutableInterface { interface CollectionPropertiesMutableInterface extends CollectionPropertiesBaseInterface, NodePropertiesMutableInterface {
public const JSON_TYPE = CollectionPropertiesBaseInterface::JSON_TYPE;
public function setLabel(string $value); public function setLabel(string $value);
public function setRole(CollectionRoles $value): static; public function setRole(CollectionRoles $value): static;

View File

@@ -10,6 +10,7 @@ declare(strict_types=1);
namespace KTXF\Mail\Entity; namespace KTXF\Mail\Entity;
use KTXF\Mail\Object\MessagePropertiesBaseInterface; use KTXF\Mail\Object\MessagePropertiesBaseInterface;
use KTXF\Resource\Identifier\EntityIdentifier;
use KTXF\Resource\Provider\Node\NodeBaseAbstract; use KTXF\Resource\Provider\Node\NodeBaseAbstract;
/** /**
@@ -21,8 +22,13 @@ use KTXF\Resource\Provider\Node\NodeBaseAbstract;
*/ */
abstract class EntityBaseAbstract extends NodeBaseAbstract implements EntityBaseInterface { abstract class EntityBaseAbstract extends NodeBaseAbstract implements EntityBaseInterface {
protected string $type = 'mail.entity';
protected MessagePropertiesBaseInterface $properties; protected MessagePropertiesBaseInterface $properties;
protected function nodeIdentifier(): EntityIdentifier {
return new EntityIdentifier($this->data[static::PROPERTY_PROVIDER], $this->data[static::PROPERTY_SERVICE], $this->data[static::PROPERTY_COLLECTION], $this->data[static::PROPERTY_IDENTIFIER]);
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@@ -15,8 +15,6 @@ use KTXF\Resource\Provider\Node\NodeBaseInterface;
interface EntityBaseInterface extends NodeBaseInterface { interface EntityBaseInterface extends NodeBaseInterface {
public const JSON_TYPE = 'mail.entity';
/** /**
* Gets the entity properties * Gets the entity properties
* *

View File

@@ -10,6 +10,7 @@ declare(strict_types=1);
namespace KTXF\Mail\Entity; namespace KTXF\Mail\Entity;
use KTXF\Mail\Object\MessagePropertiesMutableInterface; use KTXF\Mail\Object\MessagePropertiesMutableInterface;
use KTXF\Resource\Identifier\EntityIdentifier;
use KTXF\Resource\Provider\Node\NodeMutableAbstract; use KTXF\Resource\Provider\Node\NodeMutableAbstract;
use KTXF\Resource\Provider\Node\NodePropertiesMutableInterface; use KTXF\Resource\Provider\Node\NodePropertiesMutableInterface;
@@ -22,10 +23,13 @@ use KTXF\Resource\Provider\Node\NodePropertiesMutableInterface;
*/ */
abstract class EntityMutableAbstract extends NodeMutableAbstract implements EntityMutableInterface { abstract class EntityMutableAbstract extends NodeMutableAbstract implements EntityMutableInterface {
public const JSON_TYPE = EntityMutableInterface::JSON_TYPE; protected string $type = 'mail.entity';
protected MessagePropertiesMutableInterface $properties; protected MessagePropertiesMutableInterface $properties;
protected function nodeIdentifier(): EntityIdentifier {
return new EntityIdentifier($this->data[static::PROPERTY_PROVIDER], $this->data[static::PROPERTY_SERVICE], (string) $this->data[static::PROPERTY_COLLECTION], (string) $this->data[static::PROPERTY_IDENTIFIER]);
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@@ -17,8 +17,6 @@ use KTXF\Resource\Provider\Node\NodeMutableInterface;
*/ */
interface EntityMutableInterface extends EntityBaseInterface, NodeMutableInterface { interface EntityMutableInterface extends EntityBaseInterface, NodeMutableInterface {
public const JSON_TYPE = EntityBaseInterface::JSON_TYPE;
/** /**
* Gets the entity properties (mutable) * Gets the entity properties (mutable)
* *

View File

@@ -21,188 +21,161 @@ use KTXF\Resource\Provider\Node\NodePropertiesBaseAbstract;
*/ */
abstract class MessagePropertiesBaseAbstract extends NodePropertiesBaseAbstract implements MessagePropertiesBaseInterface { abstract class MessagePropertiesBaseAbstract extends NodePropertiesBaseAbstract implements MessagePropertiesBaseInterface {
public const JSON_TYPE = MessagePropertiesBaseInterface::JSON_TYPE; protected string $type = 'mail.message';
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getHeaders(): array { public function jsonSerialize(): array {
return $this->data['headers'] ?? []; return $this->data;
}
/**
* @inheritDoc
*/
public function getHeader(string $name): string|array|null {
return $this->data['headers'][$name] ?? null;
}
/**
* @inheritDoc
*/
public function getUrid(): ?string {
return $this->data['urid'] ?? null;
}
/**
* @inheritDoc
*/
public function getCreated(): ?DateTimeImmutable {
return $this->data['created'] ?? null;
}
/**
* @inheritDoc
*/
public function getModified(): ?DateTimeImmutable {
return $this->data['modified'] ?? null;
}
/**
* @inheritDoc
*/
public function getDate(): ?DateTimeImmutable {
return $this->data['date'] ?? null;
}
/**
* @inheritDoc
*/
public function getReceived(): ?DateTimeImmutable {
return $this->data['received'] ?? null;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getSize(): ?int { public function getSize(): ?int {
return $this->data['size'] ?? null; return $this->data[static::PROPERTY_SIZE] ?? null;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getSender(): ?AddressInterface { public function getHeaders(): array {
return $this->data['sender'] ?? null; return $this->data[static::PROPERTY_HEADERS] ?? [];
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getFrom(): ?AddressInterface { public function getHeader(string $name): string|array|null {
return $this->data['from'] ?? null; return $this->data[static::PROPERTY_HEADERS][$name] ?? null;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getReplyTo(): array { public function getUrid(): ?string {
return $this->data['replyTo'] ?? []; return $this->data[static::PROPERTY_URID] ?? null;
}
/**
* @inheritDoc
*/
public function getTo(): array {
return $this->data['to'] ?? [];
}
/**
* @inheritDoc
*/
public function getCc(): array {
return $this->data['cc'] ?? [];
}
/**
* @inheritDoc
*/
public function getBcc(): array {
return $this->data['bcc'] ?? [];
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getInReplyTo(): ?string { public function getInReplyTo(): ?string {
return $this->data['inReplyTo'] ?? null; return $this->data[static::PROPERTY_IN_REPLY_TO] ?? null;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getReferences(): array { public function getReferences(): array {
return $this->data['references'] ?? []; return $this->data[static::PROPERTY_REFERENCES] ?? [];
}
/**
* @inheritDoc
*/
public function getReceived(): ?DateTimeImmutable {
return $this->data[static::PROPERTY_RECEIVED] ?? null;
}
/**
* @inheritDoc
*/
public function getSent(): ?DateTimeImmutable {
return $this->data[static::PROPERTY_SENT] ?? null;
}
/**
* @inheritDoc
*/
public function getSender(): ?AddressInterface {
return $this->data[static::PROPERTY_SENDER] ?? null;
}
/**
* @inheritDoc
*/
public function getFrom(): ?AddressInterface {
return $this->data[static::PROPERTY_FROM] ?? null;
}
/**
* @inheritDoc
*/
public function getReplyTo(): array {
return $this->data[static::PROPERTY_REPLY_TO] ?? [];
}
/**
* @inheritDoc
*/
public function getTo(): array {
return $this->data[static::PROPERTY_TO] ?? [];
}
/**
* @inheritDoc
*/
public function getCc(): array {
return $this->data[static::PROPERTY_CC] ?? [];
}
/**
* @inheritDoc
*/
public function getBcc(): array {
return $this->data[static::PROPERTY_BCC] ?? [];
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getSubject(): string { public function getSubject(): string {
return $this->data['subject'] ?? ''; return $this->data[static::PROPERTY_SUBJECT] ?? '';
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getSnippet(): ?string { public function getBody(): ?MessagePartInterface {
return $this->data['snippet'] ?? null; return $this->data[static::PROPERTY_BODY] ?? null;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getBodyText(): ?string { public function hasBody(): bool {
return $this->data['bodyText'] ?? null; return ($this->data[static::PROPERTY_BODY_TEXT_PLAIN] !== null && $this->data[static::PROPERTY_BODY_TEXT_PLAIN] !== '')
|| ($this->data[static::PROPERTY_BODY_TEXT_HTML] !== null && $this->data[static::PROPERTY_BODY_TEXT_HTML] !== '');
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getBodyTextCharset(): ?string { public function getBodyTextPlain(): ?string {
return $this->data['bodyTextCharset'] ?? null; return $this->data[static::PROPERTY_BODY_TEXT_PLAIN] ?? null;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getBodyTextSize(): ?int { public function getBodyTextHtml(): ?string {
return $this->data['bodyTextSize'] ?? null; return $this->data[static::PROPERTY_BODY_TEXT_HTML] ?? null;
}
/**
* @inheritDoc
*/
public function getBodyHtml(): ?string {
return $this->data['bodyHtml'] ?? null;
}
/**
* @inheritDoc
*/
public function getBodyHtmlCharset(): ?string {
return $this->data['bodyHtmlCharset'] ?? null;
}
/**
* @inheritDoc
*/
public function getBodyHtmlSize(): ?int {
return $this->data['bodyHtmlSize'] ?? null;
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getAttachments(): array { public function getAttachments(): array {
return $this->data['attachments'] ?? []; return $this->data[static::PROPERTY_ATTACHMENTS] ?? [];
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function getFlags(): array { public function getFlags(): array {
return $this->data['flags'] ?? [ return $this->data[static::PROPERTY_FLAGS] ?? [
'read' => false, 'read' => false,
'starred' => false, 'starred' => false,
'important' => false, 'important' => false,
@@ -218,179 +191,7 @@ abstract class MessagePropertiesBaseAbstract extends NodePropertiesBaseAbstract
* @inheritDoc * @inheritDoc
*/ */
public function getFlag(string $name): bool { public function getFlag(string $name): bool {
return $this->data['flags'][$name] ?? false; return $this->data[static::PROPERTY_FLAGS][$name] ?? false;
} }
/**
* Gets message labels
*
* @since 2025.05.01
*
* @return array<int, string>
*/
public function getLabels(): array {
return $this->data['labels'] ?? [];
}
/**
* Gets message tags
*
* @since 2025.05.01
*
* @return array<int, string>
*/
public function getTags(): array {
return $this->data['tags'] ?? [];
}
/**
* Gets message priority
*
* @since 2025.05.01
*
* @return string
*/
public function getPriority(): string {
return $this->data['priority'] ?? 'normal';
}
/**
* Gets message sensitivity
*
* @since 2025.05.01
*
* @return string
*/
public function getSensitivity(): string {
return $this->data['sensitivity'] ?? 'normal';
}
/**
* Gets encryption information
*
* @since 2025.05.01
*
* @return array{method: string|null, signed: bool, encrypted: bool}
*/
public function getEncryption(): array {
return $this->data['encryption'] ?? [
'method' => null,
'signed' => false,
'encrypted' => false,
];
}
/**
* Checks if delivery receipt is requested
*
* @since 2025.05.01
*
* @return bool
*/
public function isDeliveryReceipt(): bool {
return $this->data['deliveryReceipt'] ?? false;
}
/**
* Checks if read receipt is requested
*
* @since 2025.05.01
*
* @return bool
*/
public function isReadReceipt(): bool {
return $this->data['readReceipt'] ?? false;
}
/**
* @inheritDoc
*/
public function hasRecipients(): bool {
return !empty($this->data['to']) || !empty($this->data['cc']) || !empty($this->data['bcc']);
}
/**
* @inheritDoc
*/
public function hasBody(): bool {
return ($this->data['bodyText'] !== null && $this->data['bodyText'] !== '')
|| ($this->data['bodyHtml'] !== null && $this->data['bodyHtml'] !== '');
}
/**
* @inheritDoc
*/
public function getBody(): ?MessagePartInterface {
return $this->data['body'] ?? null;
}
/**
* @inheritDoc
*/
public function jsonSerialize(): array {
$data = [
self::JSON_PROPERTY_TYPE => self::JSON_TYPE,
self::JSON_PROPERTY_SCHEMA => $this->data['schema'] ?? 1,
];
if (!empty($this->data['headers'])) {
$data[self::JSON_PROPERTY_HEADERS] = $this->data['headers'];
}
if (isset($this->data['urid']) && $this->data['urid'] !== null) {
$data[self::JSON_PROPERTY_URID] = $this->data['urid'];
}
if (isset($this->data['date']) && $this->data['date'] !== null) {
$data[self::JSON_PROPERTY_DATE] = $this->data['date'] instanceof DateTimeImmutable
? $this->data['date']->format('c')
: $this->data['date'];
}
if (isset($this->data['received']) && $this->data['received'] !== null) {
$data[self::JSON_PROPERTY_RECEIVED] = $this->data['received'] instanceof DateTimeImmutable
? $this->data['received']->format('c')
: $this->data['received'];
}
if (isset($this->data['size']) && $this->data['size'] !== null) {
$data[self::JSON_PROPERTY_SIZE] = $this->data['size'];
}
if (isset($this->data['sender']) && $this->data['sender'] !== null) {
$data[self::JSON_PROPERTY_SENDER] = $this->data['sender'];
}
if (isset($this->data['from']) && $this->data['from'] !== null) {
$data[self::JSON_PROPERTY_FROM] = $this->data['from'];
}
if (!empty($this->data['replyTo'])) {
$data[self::JSON_PROPERTY_REPLY_TO] = $this->data['replyTo'];
}
if (!empty($this->data['to'])) {
$data[self::JSON_PROPERTY_TO] = $this->data['to'];
}
if (!empty($this->data['cc'])) {
$data[self::JSON_PROPERTY_CC] = $this->data['cc'];
}
if (!empty($this->data['bcc'])) {
$data[self::JSON_PROPERTY_BCC] = $this->data['bcc'];
}
if (isset($this->data['inReplyTo']) && $this->data['inReplyTo'] !== null) {
$data[self::JSON_PROPERTY_IN_REPLY_TO] = $this->data['inReplyTo'];
}
if (!empty($this->data['references'])) {
$data[self::JSON_PROPERTY_REFERENCES] = $this->data['references'];
}
if (isset($this->data['snippet']) && $this->data['snippet'] !== null) {
$data[self::JSON_PROPERTY_SNIPPET] = $this->data['snippet'];
}
if (!empty($this->data['attachments'])) {
$data[self::JSON_PROPERTY_ATTACHMENTS] = $this->data['attachments'];
}
if (!empty($this->data['flags'])) {
$data[self::JSON_PROPERTY_FLAGS] = $this->data['flags'];
}
$data[self::JSON_PROPERTY_SUBJECT] = $this->data['subject'] ?? null;
$data[self::JSON_PROPERTY_BODY] = $this->data['body'] ?? null;
return $data;
}
} }

View File

@@ -19,26 +19,35 @@ use KTXF\Resource\Provider\Node\NodePropertiesBaseInterface;
*/ */
interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface { interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
public const JSON_TYPE = 'mail.message'; public const PROPERTY_SIZE = 'size';
public const JSON_PROPERTY_HEADERS = 'headers'; public const PROPERTY_HEADERS = 'headers';
public const JSON_PROPERTY_URID = 'urid'; public const PROPERTY_URID = 'urid'; // mime message ID or similar unique identifier
public const JSON_PROPERTY_DATE = 'date'; public const PROPERTY_IN_REPLY_TO = 'inReplyTo';
public const JSON_PROPERTY_RECEIVED = 'received'; public const PROPERTY_REFERENCES = 'references';
public const JSON_PROPERTY_SIZE = 'size'; public const PROPERTY_RECEIVED = 'received';
public const JSON_PROPERTY_SENDER = 'sender'; public const PROPERTY_SENT = 'sent';
public const JSON_PROPERTY_FROM = 'from'; public const PROPERTY_SENDER = 'sender';
public const JSON_PROPERTY_REPLY_TO = 'replyTo'; public const PROPERTY_REPLY_TO = 'replyTo';
public const JSON_PROPERTY_TO = 'to'; public const PROPERTY_FROM = 'from';
public const JSON_PROPERTY_CC = 'cc'; public const PROPERTY_TO = 'to';
public const JSON_PROPERTY_BCC = 'bcc'; public const PROPERTY_CC = 'cc';
public const JSON_PROPERTY_IN_REPLY_TO = 'inReplyTo'; public const PROPERTY_BCC = 'bcc';
public const JSON_PROPERTY_REFERENCES = 'references'; public const PROPERTY_SUBJECT = 'subject';
public const JSON_PROPERTY_SUBJECT = 'subject'; public const PROPERTY_BODY = 'body';
public const JSON_PROPERTY_SNIPPET = 'snippet'; public const PROPERTY_BODY_TEXT_PLAIN = 'bodyTextPlain';
public const JSON_PROPERTY_BODY = 'body'; public const PROPERTY_BODY_TEXT_HTML = 'bodyTextHtml';
public const JSON_PROPERTY_ATTACHMENTS = 'attachments'; public const PROPERTY_ATTACHMENTS = 'attachments';
public const JSON_PROPERTY_FLAGS = 'flags'; public const PROPERTY_FLAGS = 'flags';
public const JSON_PROPERTY_TAGS = 'tags'; public const PROPERTY_TAGS = 'tags';
/**
* Gets the message size in bytes
*
* @since 2025.05.01
*
* @return int|null
*/
public function getSize(): ?int;
/** /**
* Gets custom headers * Gets custom headers
@@ -70,13 +79,22 @@ interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
public function getUrid(): ?string; public function getUrid(): ?string;
/** /**
* Gets the message date * Gets the message ID this is replying to
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @return DateTimeImmutable|null * @return string|null
*/ */
public function getDate(): ?DateTimeImmutable; public function getInReplyTo(): ?string;
/**
* Gets the references (message IDs in thread)
*
* @since 2025.05.01
*
* @return array<int,string>
*/
public function getReferences(): array;
/** /**
* Gets the received date * Gets the received date
@@ -88,13 +106,13 @@ interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
public function getReceived(): ?DateTimeImmutable; public function getReceived(): ?DateTimeImmutable;
/** /**
* Gets the message size in bytes * Gets the sent date
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @return int|null * @return DateTimeImmutable|null
*/ */
public function getSize(): ?int; public function getSent(): ?DateTimeImmutable;
/** /**
* Gets the sender address (actual sender, may differ from From) * Gets the sender address (actual sender, may differ from From)
@@ -149,24 +167,6 @@ interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
*/ */
public function getBcc(): array; public function getBcc(): array;
/**
* Gets the message ID this is replying to
*
* @since 2025.05.01
*
* @return string|null
*/
public function getInReplyTo(): ?string;
/**
* Gets the references (message IDs in thread)
*
* @since 2025.05.01
*
* @return array<int,string>
*/
public function getReferences(): array;
/** /**
* Gets the message subject * Gets the message subject
* *
@@ -176,24 +176,6 @@ interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
*/ */
public function getSubject(): string; public function getSubject(): string;
/**
* Gets the message snippet/preview
*
* @since 2025.05.01
*
* @return string|null
*/
public function getSnippet(): ?string;
/**
* Checks if the message has any body content
*
* @since 2025.05.01
*
* @return bool True if text or HTML body is set
*/
public function hasBody(): bool;
/** /**
* Gets the message body structure * Gets the message body structure
* *
@@ -203,6 +185,15 @@ interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
*/ */
public function getBody(): ?MessagePartInterface; public function getBody(): ?MessagePartInterface;
/**
* Checks if the message has any body content
*
* @since 2025.05.01
*
* @return bool True if text or HTML body is set
*/
public function hasBody(): bool;
/** /**
* Gets the plain text body content * Gets the plain text body content
* *
@@ -210,7 +201,7 @@ interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
* *
* @return string|null * @return string|null
*/ */
public function getBodyText(): ?string; public function getBodyTextPlain(): ?string;
/** /**
* Gets the HTML body content * Gets the HTML body content
@@ -219,7 +210,7 @@ interface MessagePropertiesBaseInterface extends NodePropertiesBaseInterface {
* *
* @return string|null * @return string|null
*/ */
public function getBodyHtml(): ?string; public function getBodyTextHtml(): ?string;
/** /**
* Gets the attachments * Gets the attachments

View File

@@ -19,422 +19,9 @@ use DateTimeImmutable;
* @since 2025.05.01 * @since 2025.05.01
*/ */
abstract class MessagePropertiesMutableAbstract extends MessagePropertiesBaseAbstract implements MessagePropertiesMutableInterface { abstract class MessagePropertiesMutableAbstract extends MessagePropertiesBaseAbstract implements MessagePropertiesMutableInterface {
public const JSON_TYPE = MessagePropertiesBaseInterface::JSON_TYPE;
/** protected string $type = 'mail.message';
* @inheritDoc
*/
public function setHeaders(array $value): static {
$this->data['headers'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setHeader(string $name, string|array $value): static {
$this->data['headers'][$name] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setUrid(?string $value): static {
$this->data['urid'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setCreated(DateTimeImmutable $value): static {
$this->data['created'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setModified(DateTimeImmutable $value): static {
$this->data['modified'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setDate(DateTimeImmutable $value): static {
$this->data['date'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setReceived(?DateTimeImmutable $value): static {
$this->data['received'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setSize(?int $value): static {
$this->data['size'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setSender(?AddressInterface $value): static {
$this->data['sender'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setFrom(AddressInterface $value): static {
$this->data['from'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setReplyTo(AddressInterface ...$value): static {
$this->data['replyTo'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setTo(AddressInterface ...$value): static {
$this->data['to'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setCc(AddressInterface ...$value): static {
$this->data['cc'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setBcc(AddressInterface ...$value): static {
$this->data['bcc'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setInReplyTo(?string $value): static {
$this->data['inReplyTo'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setReferences(string ...$value): static {
$this->data['references'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setSubject(string $value): static {
$this->data['subject'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setSnippet(?string $value): static {
$this->data['snippet'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setBodyText(?string $value): static {
$this->data['bodyText'] = $value;
return $this;
}
/**
* Sets the plain text body charset
*
* @since 2025.05.01
*
* @param string $value
*
* @return static
*/
public function setBodyTextCharset(string $value): static {
$this->data['bodyTextCharset'] = $value;
return $this;
}
/**
* Sets the plain text body size
*
* @since 2025.05.01
*
* @param int $value
*
* @return static
*/
public function setBodyTextSize(int $value): static {
$this->data['bodyTextSize'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setBodyHtml(?string $value): static {
$this->data['bodyHtml'] = $value;
return $this;
}
/**
* Sets the HTML body charset
*
* @since 2025.05.01
*
* @param string $value
*
* @return static
*/
public function setBodyHtmlCharset(string $value): static {
$this->data['bodyHtmlCharset'] = $value;
return $this;
}
/**
* Sets the HTML body size
*
* @since 2025.05.01
*
* @param int $value
*
* @return static
*/
public function setBodyHtmlSize(int $value): static {
$this->data['bodyHtmlSize'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setAttachments(AttachmentInterface ...$value): static {
$this->data['attachments'] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function addAttachment(AttachmentInterface $value): static {
$this->data['attachments'][] = $value;
return $this;
}
/**
* Sets message flags
*
* @since 2025.05.01
*
* @param array $value
*
* @return static
*/
public function setFlags(array $value): static {
if (!isset($this->data['flags'])) {
$this->data['flags'] = [
'read' => false,
'starred' => false,
'important' => false,
'answered' => false,
'forwarded' => false,
'draft' => false,
'deleted' => false,
'flagged' => false,
];
}
$this->data['flags'] = array_merge($this->data['flags'], $value);
return $this;
}
/**
* @inheritDoc
*/
public function setFlag(string $name, bool $value): static {
if (!isset($this->data['flags'])) {
$this->data['flags'] = [
'read' => false,
'starred' => false,
'important' => false,
'answered' => false,
'forwarded' => false,
'draft' => false,
'deleted' => false,
'flagged' => false,
];
}
if (array_key_exists($name, $this->data['flags'])) {
$this->data['flags'][$name] = $value;
}
return $this;
}
/**
* Sets message labels
*
* @since 2025.05.01
*
* @param string ...$value
*
* @return static
*/
public function setLabels(string ...$value): static {
$this->data['labels'] = $value;
return $this;
}
/**
* Adds a message label
*
* @since 2025.05.01
*
* @param string $value
*
* @return static
*/
public function addLabel(string $value): static {
$this->data['labels'][] = $value;
return $this;
}
/**
* Sets message tags
*
* @since 2025.05.01
*
* @param string ...$value
*
* @return static
*/
public function setTags(string ...$value): static {
$this->data['tags'] = $value;
return $this;
}
/**
* Adds a message tag
*
* @since 2025.05.01
*
* @param string $value
*
* @return static
*/
public function addTag(string $value): static {
$this->data['tags'][] = $value;
return $this;
}
/**
* Sets message priority
*
* @since 2025.05.01
*
* @param string $value
*
* @return static
*/
public function setPriority(string $value): static {
$this->data['priority'] = $value;
return $this;
}
/**
* Sets message sensitivity
*
* @since 2025.05.01
*
* @param string $value
*
* @return static
*/
public function setSensitivity(string $value): static {
$this->data['sensitivity'] = $value;
return $this;
}
/**
* Sets encryption information
*
* @since 2025.05.01
*
* @param array $value
*
* @return static
*/
public function setEncryption(array $value): static {
if (!isset($this->data['encryption'])) {
$this->data['encryption'] = [
'method' => null,
'signed' => false,
'encrypted' => false,
];
}
$this->data['encryption'] = array_merge($this->data['encryption'], $value);
return $this;
}
/**
* Sets delivery receipt flag
*
* @since 2025.05.01
*
* @param bool $value
*
* @return static
*/
public function setDeliveryReceipt(bool $value): static {
$this->data['deliveryReceipt'] = $value;
return $this;
}
/**
* Sets read receipt flag
*
* @since 2025.05.01
*
* @param bool $value
*
* @return static
*/
public function setReadReceipt(bool $value): static {
$this->data['readReceipt'] = $value;
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -452,4 +39,213 @@ abstract class MessagePropertiesMutableAbstract extends MessagePropertiesBaseAbs
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function setSize(?int $value): static {
$this->data[static::PROPERTY_SIZE] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setHeaders(array $value): static {
$this->data[static::PROPERTY_HEADERS] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setHeader(string $name, string|array $value): static {
$this->data[static::PROPERTY_HEADERS][$name] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setUrid(?string $value): static {
$this->data[static::PROPERTY_URID] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setInReplyTo(?string $value): static {
$this->data[static::PROPERTY_IN_REPLY_TO] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setReferences(string ...$value): static {
$this->data[static::PROPERTY_REFERENCES] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setReceived(?DateTimeImmutable $value): static {
$this->data[static::PROPERTY_RECEIVED] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setSent(DateTimeImmutable $value): static {
$this->data[static::PROPERTY_SENT] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setSender(?AddressInterface $value): static {
$this->data[static::PROPERTY_SENDER] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setFrom(AddressInterface $value): static {
$this->data[static::PROPERTY_FROM] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setReplyTo(AddressInterface ...$value): static {
$this->data[static::PROPERTY_REPLY_TO] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setTo(AddressInterface ...$value): static {
$this->data[static::PROPERTY_TO] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setCc(AddressInterface ...$value): static {
$this->data[static::PROPERTY_CC] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setBcc(AddressInterface ...$value): static {
$this->data[static::PROPERTY_BCC] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setSubject(string $value): static {
$this->data[static::PROPERTY_SUBJECT] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setBody(?MessagePartInterface $value): static {
$this->data[static::PROPERTY_BODY] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setBodyTextPlain(?string $value): static {
$this->data[static::PROPERTY_BODY_TEXT_PLAIN] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setBodyTextHtml(?string $value): static {
$this->data[static::PROPERTY_BODY_TEXT_HTML] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function setAttachments(AttachmentInterface ...$value): static {
$this->data[static::PROPERTY_ATTACHMENTS] = $value;
return $this;
}
/**
* @inheritDoc
*/
public function addAttachment(AttachmentInterface $value): static {
$this->data[static::PROPERTY_ATTACHMENTS][] = $value;
return $this;
}
/**
* Sets message flags
*
* @since 2025.05.01
*
* @param array $value
*
* @return static
*/
public function setFlags(array $value): static {
if (!isset($this->data[static::PROPERTY_FLAGS])) {
$this->data[static::PROPERTY_FLAGS] = [
'read' => false,
'starred' => false,
'important' => false,
'answered' => false,
'forwarded' => false,
'draft' => false,
'deleted' => false,
'flagged' => false,
];
}
$this->data[static::PROPERTY_FLAGS] = array_merge($this->data[static::PROPERTY_FLAGS], $value);
return $this;
}
/**
* @inheritDoc
*/
public function setFlag(string $name, bool $value): static {
if (!isset($this->data[static::PROPERTY_FLAGS])) {
$this->data[static::PROPERTY_FLAGS] = [
'read' => false,
'starred' => false,
'important' => false,
'answered' => false,
'forwarded' => false,
'draft' => false,
'deleted' => false,
'flagged' => false,
];
}
if (array_key_exists($name, $this->data[static::PROPERTY_FLAGS])) {
$this->data[static::PROPERTY_FLAGS][$name] = $value;
}
return $this;
}
} }

View File

@@ -18,9 +18,18 @@ use KTXF\Resource\Provider\Node\NodePropertiesMutableInterface;
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterface, NodePropertiesMutableInterface { interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterface, NodePropertiesMutableInterface {
public const JSON_TYPE = MessagePropertiesBaseInterface::JSON_TYPE;
/**
* Sets the message size in bytes
*
* @since 2025.05.01
*
* @param int|null $value
*
* @return self
*/
public function setSize(?int $value): static;
/** /**
* Sets custom headers * Sets custom headers
* *
@@ -56,15 +65,26 @@ interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterfa
public function setUrid(?string $value): static; public function setUrid(?string $value): static;
/** /**
* Sets the message date * Sets the message ID this is replying to
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param DateTimeImmutable $value * @param string|null $value
* *
* @return self * @return self
*/ */
public function setDate(DateTimeImmutable $value): static; public function setInReplyTo(?string $value): static;
/**
* Sets the references (message IDs in thread)
*
* @since 2025.05.01
*
* @param string ...$value
*
* @return self
*/
public function setReferences(string ...$value): static;
/** /**
* Sets the received date * Sets the received date
@@ -77,16 +97,16 @@ interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterfa
*/ */
public function setReceived(?DateTimeImmutable $value): static; public function setReceived(?DateTimeImmutable $value): static;
/** /**
* Sets the message size in bytes * Sets the message date
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param int|null $value * @param DateTimeImmutable $value
* *
* @return self * @return self
*/ */
public function setSize(?int $value): static; public function setSent(DateTimeImmutable $value): static;
/** /**
* Sets the sender address (actual sender, may differ from From) * Sets the sender address (actual sender, may differ from From)
@@ -154,28 +174,6 @@ interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterfa
*/ */
public function setBcc(AddressInterface ...$value): static; public function setBcc(AddressInterface ...$value): static;
/**
* Sets the message ID this is replying to
*
* @since 2025.05.01
*
* @param string|null $value
*
* @return self
*/
public function setInReplyTo(?string $value): static;
/**
* Sets the references (message IDs in thread)
*
* @since 2025.05.01
*
* @param string ...$value
*
* @return self
*/
public function setReferences(string ...$value): static;
/** /**
* Sets the message subject * Sets the message subject
* *
@@ -188,15 +186,15 @@ interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterfa
public function setSubject(string $value): static; public function setSubject(string $value): static;
/** /**
* Sets the message snippet/preview * Sets the message body
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param string|null $value * @param MessagePartInterface|null $value
* *
* @return self * @return self
*/ */
public function setSnippet(?string $value): static; public function setBody(?MessagePartInterface $value): static;
/** /**
* Sets the plain text body content * Sets the plain text body content
@@ -207,7 +205,7 @@ interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterfa
* *
* @return self * @return self
*/ */
public function setBodyText(?string $value): static; public function setBodyTextPlain(?string $value): static;
/** /**
* Sets the HTML body content * Sets the HTML body content
@@ -218,7 +216,7 @@ interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterfa
* *
* @return self * @return self
*/ */
public function setBodyHtml(?string $value): static; public function setBodyTextHtml(?string $value): static;
/** /**
* Sets the attachments * Sets the attachments
@@ -241,15 +239,28 @@ interface MessagePropertiesMutableInterface extends MessagePropertiesBaseInterfa
* @return self * @return self
*/ */
public function addAttachment(AttachmentInterface $value): static; public function addAttachment(AttachmentInterface $value): static;
/** /**
* Sets message tags * Sets message flags
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param array{read: bool, starred: bool, important: bool, answered: bool, forwarded: bool, draft: bool, deleted: bool, flagged: bool} $value * @param array $value
* *
* @return self * @return self
*/ */
public function setFlags(array $value): static;
/**
* Sets message flags
*
* @since 2025.05.01
*
* @param string $label
* @param bool $value
*
* @return self
*/
public function setFlag(string $label, bool $value): static; public function setFlag(string $label, bool $value): static;
} }

View File

@@ -26,7 +26,7 @@ use KTXF\Resource\Provider\ResourceServiceLocationInterface;
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface ProviderServiceDiscoverInterface extends ProviderBaseInterface { interface ProviderServiceDiscoverInterface {
/** /**
* Attempts to discover service configuration using provider-specific methods. * Attempts to discover service configuration using provider-specific methods.

View File

@@ -25,9 +25,7 @@ use KTXF\Resource\Provider\ResourceProviderServiceMutateInterface;
* @method string serviceModify(string $tenantId, ?string $userId, ServiceMutableInterface $service) Modify a mail service configuration * @method string serviceModify(string $tenantId, ?string $userId, ServiceMutableInterface $service) Modify a mail service configuration
* @method bool serviceDestroy(string $tenantId, ?string $userId, ServiceMutableInterface $service) Delete a mail service configuration * @method bool serviceDestroy(string $tenantId, ?string $userId, ServiceMutableInterface $service) Delete a mail service configuration
*/ */
interface ProviderServiceMutateInterface extends ProviderBaseInterface, ResourceProviderServiceMutateInterface { interface ProviderServiceMutateInterface extends ResourceProviderServiceMutateInterface {
public const JSON_TYPE = ProviderBaseInterface::JSON_TYPE;
// Methods inherited from ResourceProviderServiceMutateInterface // Methods inherited from ResourceProviderServiceMutateInterface
// Implementations should return/accept ServiceMutableInterface instances // Implementations should return/accept ServiceMutableInterface instances

View File

@@ -10,6 +10,7 @@ declare(strict_types=1);
namespace KTXF\Mail\Provider; namespace KTXF\Mail\Provider;
use KTXF\Mail\Service\ServiceBaseInterface; use KTXF\Mail\Service\ServiceBaseInterface;
use KTXF\Mail\Service\ServiceMutableInterface;
/** /**
* Mail Provider Service Test Interface * Mail Provider Service Test Interface
@@ -25,7 +26,7 @@ use KTXF\Mail\Service\ServiceBaseInterface;
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface ProviderServiceTestInterface extends ProviderBaseInterface { interface ProviderServiceTestInterface {
/** /**
* Test a service connection * Test a service connection
@@ -39,7 +40,7 @@ interface ProviderServiceTestInterface extends ProviderBaseInterface {
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param ServiceBaseInterface $service Service to test (can be fresh/unsaved or existing) * @param ServiceBaseInterface|ServiceMutableInterface $service Service to test (can be fresh/unsaved or existing)
* @param array $options Provider-specific test options: * @param array $options Provider-specific test options:
* - 'timeout' => int (seconds, default: 10) * - 'timeout' => int (seconds, default: 10)
* - 'verify_ssl' => bool (default: true) * - 'verify_ssl' => bool (default: true)
@@ -72,6 +73,6 @@ interface ProviderServiceTestInterface extends ProviderBaseInterface {
* ] * ]
* ] * ]
*/ */
public function serviceTest(ServiceBaseInterface $service, array $options = []): array; public function serviceTest(ServiceBaseInterface|ServiceMutableInterface $service, array $options = []): array;
} }

View File

@@ -11,6 +11,8 @@ namespace KTXF\Mail\Service;
use KTXF\Mail\Collection\CollectionBaseInterface; use KTXF\Mail\Collection\CollectionBaseInterface;
use KTXF\Mail\Collection\CollectionMutableInterface; use KTXF\Mail\Collection\CollectionMutableInterface;
use KTXF\Mail\Collection\CollectionPropertiesBaseInterface;
use KTXF\Resource\Identifier\CollectionIdentifier;
/** /**
* Mail Service Collection Mutable Interface * Mail Service Collection Mutable Interface
@@ -20,7 +22,7 @@ use KTXF\Mail\Collection\CollectionMutableInterface;
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface ServiceCollectionMutableInterface extends ServiceBaseInterface { interface ServiceCollectionMutableInterface {
public const CAPABILITY_COLLECTION_CREATE = 'CollectionCreate'; public const CAPABILITY_COLLECTION_CREATE = 'CollectionCreate';
public const CAPABILITY_COLLECTION_UPDATE = 'CollectionUpdate'; public const CAPABILITY_COLLECTION_UPDATE = 'CollectionUpdate';
@@ -41,48 +43,48 @@ interface ServiceCollectionMutableInterface extends ServiceBaseInterface {
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param string|int|null $location Parent collection ID (null for root) * @param CollectionIdentifier $target Target collection identifier (parent)
* @param CollectionMutableInterface $collection Collection to create * @param CollectionPropertiesBaseInterface $properties Collection properties
* @param array $options Protocol-specific options * @param array $options Protocol-specific options
* *
* @return CollectionBaseInterface Created collection with assigned ID * @return CollectionBaseInterface Created collection with assigned ID
*/ */
public function collectionCreate(string|int|null $location, CollectionMutableInterface $collection, array $options = []): CollectionBaseInterface; public function collectionCreate(CollectionIdentifier|null $target, CollectionPropertiesBaseInterface $properties, array $options = []): CollectionBaseInterface;
/** /**
* Updates an existing collection * Updates an existing collection
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param string|int $identifier Collection ID * @param CollectionIdentifier $target Target collection identifier
* @param CollectionMutableInterface $collection Updated collection data * @param CollectionPropertiesBaseInterface $properties Updated collection data
* *
* @return CollectionBaseInterface Updated collection * @return CollectionBaseInterface Updated collection
*/ */
public function collectionUpdate(string|int $identifier, CollectionMutableInterface $collection): CollectionBaseInterface; public function collectionUpdate(CollectionIdentifier $target, CollectionPropertiesBaseInterface $properties): CollectionBaseInterface;
/** /**
* Deletes a collection * Deletes a collection
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param string|int $identifier Collection ID * @param CollectionIdentifier $target Target collection identifier
* @param bool $force Force deletion even if not empty * @param bool $force Force deletion even if not empty
* *
* @return CollectionBaseInterface|true Collection object on soft delete, true on hard delete * @return CollectionBaseInterface|true Collection object on soft delete, true on hard delete
*/ */
public function collectionDelete(string|int $identifier, bool $force = false): CollectionBaseInterface | true; public function collectionDelete(CollectionIdentifier $target, bool $force = false): CollectionBaseInterface | true;
/** /**
* Moves a collection to a new parent * Moves a collection to a new parent
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param string|int $identifier Collection ID * @param CollectionIdentifier $source Source collection identifier
* @param string|int|null $targetLocation New parent ID (null for root) * @param CollectionIdentifier $target Target collection identifier
* *
* @return CollectionBaseInterface Moved collection * @return CollectionBaseInterface Moved collection
*/ */
public function collectionMove(string|int $identifier, string|int|null $targetLocation): CollectionBaseInterface; public function collectionMove(CollectionIdentifier $target, CollectionIdentifier $source): CollectionBaseInterface;
} }

View File

@@ -12,15 +12,12 @@ namespace KTXF\Mail\Service;
use KTXF\Resource\Provider\ResourceServiceConfigureInterface; use KTXF\Resource\Provider\ResourceServiceConfigureInterface;
/** /**
* Mail Service Mutable Interface * Mail Service Configurable Interface
* *
* Extends base service interface with setter methods for mutable properties. * Extends base service interface with setter methods for mutable properties.
* Used for service configuration and updates. * Used for service configuration and updates.
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface ServiceConfigurableInterface extends ServiceMutableInterface, ResourceServiceConfigureInterface { interface ServiceConfigurableInterface extends ResourceServiceConfigureInterface {
public const JSON_TYPE = ServiceBaseInterface::JSON_TYPE;
} }

View File

@@ -11,6 +11,9 @@ namespace KTXF\Mail\Service;
use KTXF\Mail\Entity\EntityBaseInterface; use KTXF\Mail\Entity\EntityBaseInterface;
use KTXF\Mail\Entity\EntityMutableInterface; use KTXF\Mail\Entity\EntityMutableInterface;
use KTXF\Mail\Object\MessagePropertiesMutableInterface;
use KTXF\Resource\Identifier\CollectionIdentifier;
use KTXF\Resource\Identifier\EntityIdentifier;
/** /**
* Mail Service Entity Mutable Interface * Mail Service Entity Mutable Interface
@@ -20,11 +23,12 @@ use KTXF\Mail\Entity\EntityMutableInterface;
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface ServiceEntityMutableInterface extends ServiceBaseInterface { interface ServiceEntityMutableInterface {
public const CAPABILITY_ENTITY_CREATE = 'EntityCreate'; public const CAPABILITY_ENTITY_CREATE = 'EntityCreate';
public const CAPABILITY_ENTITY_MODIFY = 'EntityModify'; public const CAPABILITY_ENTITY_MODIFY = 'EntityModify';
public const CAPABILITY_ENTITY_DELETE = 'EntityDelete'; public const CAPABILITY_ENTITY_DELETE = 'EntityDelete';
public const CAPABILITY_ENTITY_PATCH = 'EntityPatch';
public const CAPABILITY_ENTITY_COPY = 'EntityCopy'; public const CAPABILITY_ENTITY_COPY = 'EntityCopy';
public const CAPABILITY_ENTITY_MOVE = 'EntityMove'; public const CAPABILITY_ENTITY_MOVE = 'EntityMove';
@@ -42,49 +46,54 @@ interface ServiceEntityMutableInterface extends ServiceBaseInterface {
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param string|int $collection collection identifier * @param CollectionIdentifier $target Target collection identifier
* @param EntityMutableInterface $entity Entity data * @param MessagePropertiesMutableInterface $properties Entity properties
* @param array $options additional options * @param array $options Additional options
* *
* @return EntityBaseInterface Created entity * @return EntityBaseInterface Created entity
*/ */
public function entityCreate(string|int $collection, EntityMutableInterface $entity, array $options = []): EntityBaseInterface; public function entityCreate(CollectionIdentifier $target, MessagePropertiesMutableInterface $properties, array $options = []): EntityBaseInterface;
/** /**
* Modifies an existing entity * Modifies an existing entity
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param string|int $collection Collection identifier * @param EntityIdentifier $target Target entity identifier
* @param string|int $identifier Entity identifier * @param MessagePropertiesMutableInterface $properties Entity properties to update
* @param EntityMutableInterface $entity Entity data
* *
* @return EntityBaseInterface Modified entity * @return EntityBaseInterface Modified entity
*/ */
public function entityModify(string|int $collection, string|int $identifier, EntityMutableInterface $entity): EntityBaseInterface; public function entityModify(EntityIdentifier $target, MessagePropertiesMutableInterface $properties): EntityBaseInterface;
/** /**
* Deletes entities * Deletes entities
* *
* @since 2026.04.01 * @since 2026.04.01
* *
* @param EntityIdentifier ...$identifiers Source entities to delete * @param EntityIdentifier ...$targets Source entities to delete
* *
* @return array<string|int,bool|string> Results keyed by entity identifier (true on success, error string on failure) * @return array<string, array{
* disposition: 'moved'|'deleted'|'error',
* destination: ?CollectionIdentifier,
* mutation: EntityIdentifier
* }> Results keyed by source entity identifier
*/ */
public function entityDelete(EntityIdentifier ...$identifiers): array; public function entityDelete(EntityIdentifier ...$targets): array;
/** /**
* Copies entities to another collection * Patches an existing entity(ies) with partial data
* *
* @since 2025.05.01 * @since 2025.05.01
* *
* @param CollectionIdentifier $target Target collection identifier * @param MessagePropertiesMutableInterface $properties Partial entity properties
* @param EntityIdentifier ...$identifiers Source entities to copy * @param EntityIdentifier ...$targets Source entities to patch
* *
* @return array<string|int,bool> List of copied entity identifiers * @return array<string, array{
* disposition: 'patched'|'error'
* }> Results keyed by source entity identifier
*/ */
public function entityCopy(CollectionIdentifier $target, EntityIdentifier ...$identifiers): array; public function entityPatch(MessagePropertiesMutableInterface $properties, EntityIdentifier ...$targets): array;
/** /**
* Moves entities to another collection * Moves entities to another collection
@@ -92,10 +101,30 @@ interface ServiceEntityMutableInterface extends ServiceBaseInterface {
* @since 2025.05.01 * @since 2025.05.01
* *
* @param CollectionIdentifier $target Target collection identifier * @param CollectionIdentifier $target Target collection identifier
* @param EntityIdentifier ...$identifiers Source entities to move * @param EntityIdentifier ...$sources Source entities to move
* *
* @return array<string|int,bool> List of moved entity identifiers * @return array<string, array{
* disposition: 'moved'|'error',
* destination: ?CollectionIdentifier,
* mutation: EntityIdentifier
* }> Results keyed by source entity identifier
*/ */
public function entityMove(CollectionIdentifier $target, EntityIdentifier ...$identifiers): array; public function entityMove(CollectionIdentifier $target, EntityIdentifier ...$sources): array;
/**
* Copies entities to another collection
*
* @since 2025.05.01
*
* @param CollectionIdentifier $target Target collection identifier
* @param EntityIdentifier ...$sources Source entities to copy
*
* @return array<string, array{
* disposition: 'copied'|'error',
* destination: ?CollectionIdentifier,
* mutation: EntityIdentifier
* }> Results keyed by source entity identifier
*/
public function entityCopy(CollectionIdentifier $target, EntityIdentifier ...$sources): array;
} }

View File

@@ -19,7 +19,7 @@ use KTXF\Mail\Exception\SendException;
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface ServiceEntityTransmitInterface extends ServiceBaseInterface { interface ServiceEntityTransmitInterface {
public const CAPABILITY_ENTITY_TRANSMIT = 'EntityTransmit'; public const CAPABILITY_ENTITY_TRANSMIT = 'EntityTransmit';

View File

@@ -20,7 +20,7 @@ use KTXF\Resource\Provider\ResourceServiceMutateInterface;
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface ServiceMutableInterface extends ServiceBaseInterface, ResourceServiceMutateInterface { interface ServiceMutableInterface extends ResourceServiceMutateInterface {
/** /**
* Sets the primary mailing address for this service * Sets the primary mailing address for this service

View File

@@ -35,6 +35,10 @@ class ResourceIdentifier implements ResourceIdentifierInterface {
return $this->provider; return $this->provider;
} }
public function jsonSerialize(): string {
return (string) $this;
}
/** /**
* Parse a colon-separated identifier string and return the appropriate level class * Parse a colon-separated identifier string and return the appropriate level class
* *

View File

@@ -9,10 +9,12 @@ declare(strict_types=1);
namespace KTXF\Resource\Identifier; namespace KTXF\Resource\Identifier;
use KTXF\Json\JsonSerializable;
/** /**
* Top-level identifier for resources (provider level) * Top-level identifier for resources (provider level)
*/ */
interface ResourceIdentifierInterface extends \Stringable { interface ResourceIdentifierInterface extends JsonSerializable, \Stringable {
/** The provider segment (e.g. "imap") */ /** The provider segment (e.g. "imap") */
public function provider(): string; public function provider(): string;
@@ -23,4 +25,7 @@ interface ResourceIdentifierInterface extends \Stringable {
/** Canonical string form: provider[:service[:collection[:entity]]] */ /** Canonical string form: provider[:service[:collection[:entity]]] */
public function __toString(): string; public function __toString(): string;
/** Canonical JSON form: provider[:service[:collection[:entity]]] */
public function jsonSerialize(): string;
} }

View File

@@ -151,4 +151,11 @@ class ResourceIdentifiers implements ResourceIdentifiersInterface {
return count($this->identifiers) === 0; return count($this->identifiers) === 0;
} }
public function jsonSerialize(): array {
return array_map(
static fn (ResourceIdentifierInterface $identifier): string => $identifier->jsonSerialize(),
$this->identifiers,
);
}
} }

View File

@@ -9,10 +9,12 @@ declare(strict_types=1);
namespace KTXF\Resource\Identifier; namespace KTXF\Resource\Identifier;
use KTXF\Json\JsonSerializable;
/** /**
* A typed collection of resource identifiers with search and filter capabilities * A typed collection of resource identifiers with search and filter capabilities
*/ */
interface ResourceIdentifiersInterface extends \Countable, \IteratorAggregate { interface ResourceIdentifiersInterface extends JsonSerializable, \Countable, \IteratorAggregate {
/** Add an identifier to the collection */ /** Add an identifier to the collection */
public function add(ResourceIdentifierInterface $identifier): void; public function add(ResourceIdentifierInterface $identifier): void;
@@ -47,4 +49,7 @@ interface ResourceIdentifiersInterface extends \Countable, \IteratorAggregate {
/** Get unique entity names */ /** Get unique entity names */
public function entities(): array; public function entities(): array;
/** Serialize as an array of canonical identifier strings */
public function jsonSerialize(): array;
} }

View File

@@ -10,6 +10,11 @@ declare(strict_types=1);
namespace KTXF\Resource\Provider\Node; namespace KTXF\Resource\Provider\Node;
use DateTimeImmutable; use DateTimeImmutable;
use KTXF\Resource\Identifier\CollectionIdentifier;
use KTXF\Resource\Identifier\CollectionIdentifierInterface;
use KTXF\Resource\Identifier\EntityIdentifierInterface;
use KTXF\Resource\Identifier\ResourceIdentifier;
use KTXF\Resource\Identifier\ServiceIdentifier;
/** /**
* Abstract Node Base Class * Abstract Node Base Class
@@ -23,6 +28,7 @@ abstract class NodeBaseAbstract implements NodeBaseInterface {
/** /**
* Internal data storage * Internal data storage
*/ */
protected string $type = 'resource.node';
protected array $data = []; protected array $data = [];
public function __construct( public function __construct(
@@ -30,87 +36,96 @@ abstract class NodeBaseAbstract implements NodeBaseInterface {
protected readonly string|int $service, protected readonly string|int $service,
) { ) {
$this->data = [ $this->data = [
static::JSON_PROPERTY_PROVIDER => $this->provider, static::PROPERTY_TYPE => $this->type,
static::JSON_PROPERTY_SERVICE => $this->service, static::PROPERTY_PROVIDER => $this->provider,
static::JSON_PROPERTY_COLLECTION => null, static::PROPERTY_SERVICE => $this->service,
static::JSON_PROPERTY_IDENTIFIER => null, static::PROPERTY_COLLECTION => null,
static::JSON_PROPERTY_SIGNATURE => null, static::PROPERTY_IDENTIFIER => null,
static::JSON_PROPERTY_CREATED => null, static::PROPERTY_SIGNATURE => null,
static::JSON_PROPERTY_MODIFIED => null, static::PROPERTY_CREATED => null,
static::PROPERTY_MODIFIED => null,
]; ];
} }
/**
* @inheritDoc
*/
public function type(): string {
return static::RESOURCE_TYPE;
}
/**
* @inheritDoc
*/
public function provider(): string {
return $this->data[static::JSON_PROPERTY_PROVIDER];
}
/**
* @inheritDoc
*/
public function service(): string|int {
return $this->data[static::JSON_PROPERTY_SERVICE];
}
/**
* @inheritDoc
*/
public function collection(): string|int|null {
return $this->data[static::JSON_PROPERTY_COLLECTION] ?? null;
}
/**
* @inheritDoc
*/
public function identifier(): string|int|null {
return $this->data[static::JSON_PROPERTY_IDENTIFIER] ?? null;
}
/**
* @inheritDoc
*/
public function signature(): string|null {
return isset($this->data[static::JSON_PROPERTY_SIGNATURE])
? (string)$this->data[static::JSON_PROPERTY_SIGNATURE]
: null;
}
/**
* @inheritDoc
*/
public function created(): DateTimeImmutable|null {
return isset($this->data[static::JSON_PROPERTY_CREATED])
? new DateTimeImmutable($this->data[static::JSON_PROPERTY_CREATED])
: null;
}
/**
* @inheritDoc
*/
public function modified(): DateTimeImmutable|null {
return isset($this->data[static::JSON_PROPERTY_MODIFIED])
? new DateTimeImmutable($this->data[static::JSON_PROPERTY_MODIFIED])
: null;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function jsonSerialize(): array { public function jsonSerialize(): array {
$data = $this->data; $data = $this->data;
$data[static::JSON_PROPERTY_PROPERTIES] = $this->getProperties()->jsonSerialize(); $data['provider'] = new ResourceIdentifier($this->data[static::PROPERTY_PROVIDER]);
$data['service'] = new ServiceIdentifier($this->data[static::PROPERTY_PROVIDER], $this->data[static::PROPERTY_SERVICE]);
$data['collection'] = isset($this->data[static::PROPERTY_COLLECTION])
? new CollectionIdentifier($this->data[static::PROPERTY_PROVIDER], $this->data[static::PROPERTY_SERVICE], $this->data[static::PROPERTY_COLLECTION])
: null;
$data['identifier'] = $this->nodeIdentifier();
$data[static::PROPERTY_PROPERTIES] = $this->getProperties()->jsonSerialize();
return $data; return $data;
} }
abstract protected function nodeIdentifier(): CollectionIdentifierInterface|EntityIdentifierInterface|null;
/**
* @inheritDoc
*/
public function type(): string {
return $this->data[static::PROPERTY_TYPE];
}
/**
* @inheritDoc
*/
public function provider(): string {
return $this->data[static::PROPERTY_PROVIDER];
}
/**
* @inheritDoc
*/
public function service(): string|int {
return $this->data[static::PROPERTY_SERVICE];
}
/**
* @inheritDoc
*/
public function collection(): string|int|null {
return $this->data[static::PROPERTY_COLLECTION] ?? null;
}
/**
* @inheritDoc
*/
public function identifier(): string|int|null {
return $this->data[static::PROPERTY_IDENTIFIER] ?? null;
}
/**
* @inheritDoc
*/
public function signature(): string|null {
return isset($this->data[static::PROPERTY_SIGNATURE])
? (string)$this->data[static::PROPERTY_SIGNATURE]
: null;
}
/**
* @inheritDoc
*/
public function created(): DateTimeImmutable|null {
return isset($this->data[static::PROPERTY_CREATED])
? new DateTimeImmutable($this->data[static::PROPERTY_CREATED])
: null;
}
/**
* @inheritDoc
*/
public function modified(): DateTimeImmutable|null {
return isset($this->data[static::PROPERTY_MODIFIED])
? new DateTimeImmutable($this->data[static::PROPERTY_MODIFIED])
: null;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@@ -19,15 +19,15 @@ use KTXF\Json\JsonSerializable;
*/ */
interface NodeBaseInterface extends JsonSerializable { interface NodeBaseInterface extends JsonSerializable {
public const RESOURCE_TYPE = 'resource.node'; public const PROPERTY_TYPE = 'resource.node';
public const JSON_PROPERTY_PROVIDER = 'provider'; public const PROPERTY_PROVIDER = 'provider';
public const JSON_PROPERTY_SERVICE = 'service'; public const PROPERTY_SERVICE = 'service';
public const JSON_PROPERTY_COLLECTION = 'collection'; public const PROPERTY_COLLECTION = 'collection';
public const JSON_PROPERTY_IDENTIFIER = 'identifier'; public const PROPERTY_IDENTIFIER = 'identifier';
public const JSON_PROPERTY_SIGNATURE = 'signature'; public const PROPERTY_SIGNATURE = 'signature';
public const JSON_PROPERTY_CREATED = 'created'; public const PROPERTY_CREATED = 'created';
public const JSON_PROPERTY_MODIFIED = 'modified'; public const PROPERTY_MODIFIED = 'modified';
public const JSON_PROPERTY_PROPERTIES = 'properties'; public const PROPERTY_PROPERTIES = 'properties';
/** /**
* Node type * Node type

View File

@@ -28,56 +28,56 @@ abstract class NodeMutableAbstract extends NodeBaseAbstract implements NodeMutab
$this->data = []; $this->data = [];
if (isset($data[static::JSON_PROPERTY_COLLECTION])) { if (isset($data[static::PROPERTY_COLLECTION])) {
if (!is_string($data[static::JSON_PROPERTY_COLLECTION]) && !is_int($data[static::JSON_PROPERTY_COLLECTION])) { if (!is_string($data[static::PROPERTY_COLLECTION]) && !is_int($data[static::PROPERTY_COLLECTION])) {
throw new \InvalidArgumentException("Collection must be a string or integer"); throw new \InvalidArgumentException("Collection must be a string or integer");
} }
$this->data[static::JSON_PROPERTY_COLLECTION] = $data[static::JSON_PROPERTY_COLLECTION]; $this->data[static::PROPERTY_COLLECTION] = $data[static::PROPERTY_COLLECTION];
} else { } else {
$this->data[static::JSON_PROPERTY_COLLECTION] = null; $this->data[static::PROPERTY_COLLECTION] = null;
} }
if (isset($data[static::JSON_PROPERTY_IDENTIFIER])) { if (isset($data[static::PROPERTY_IDENTIFIER])) {
if (!is_string($data[static::JSON_PROPERTY_IDENTIFIER]) && !is_int($data[static::JSON_PROPERTY_IDENTIFIER])) { if (!is_string($data[static::PROPERTY_IDENTIFIER]) && !is_int($data[static::PROPERTY_IDENTIFIER])) {
throw new \InvalidArgumentException("Identifier must be a string or integer"); throw new \InvalidArgumentException("Identifier must be a string or integer");
} }
$this->data[static::JSON_PROPERTY_IDENTIFIER] = $data[static::JSON_PROPERTY_IDENTIFIER]; $this->data[static::PROPERTY_IDENTIFIER] = $data[static::PROPERTY_IDENTIFIER];
} else { } else {
$this->data[static::JSON_PROPERTY_IDENTIFIER] = null; $this->data[static::PROPERTY_IDENTIFIER] = null;
} }
if (isset($data[static::JSON_PROPERTY_SIGNATURE])) { if (isset($data[static::PROPERTY_SIGNATURE])) {
if (!is_string($data[static::JSON_PROPERTY_SIGNATURE]) && !is_int($data[static::JSON_PROPERTY_SIGNATURE])) { if (!is_string($data[static::PROPERTY_SIGNATURE]) && !is_int($data[static::PROPERTY_SIGNATURE])) {
throw new \InvalidArgumentException("Signature must be a string or integer"); throw new \InvalidArgumentException("Signature must be a string or integer");
} }
$this->data[static::JSON_PROPERTY_SIGNATURE] = $data[static::JSON_PROPERTY_SIGNATURE]; $this->data[static::PROPERTY_SIGNATURE] = $data[static::PROPERTY_SIGNATURE];
} else { } else {
$this->data[static::JSON_PROPERTY_SIGNATURE] = null; $this->data[static::PROPERTY_SIGNATURE] = null;
} }
if (isset($data[static::JSON_PROPERTY_CREATED])) { if (isset($data[static::PROPERTY_CREATED])) {
if (!is_string($data[static::JSON_PROPERTY_CREATED])) { if (!is_string($data[static::PROPERTY_CREATED])) {
throw new \InvalidArgumentException("Created date must be a string in ISO 8601 format"); throw new \InvalidArgumentException("Created date must be a string in ISO 8601 format");
} }
$this->data[static::JSON_PROPERTY_CREATED] = $data[static::JSON_PROPERTY_CREATED]; $this->data[static::PROPERTY_CREATED] = $data[static::PROPERTY_CREATED];
} else { } else {
$this->data[static::JSON_PROPERTY_CREATED] = null; $this->data[static::PROPERTY_CREATED] = null;
} }
if (isset($data[static::JSON_PROPERTY_MODIFIED])) { if (isset($data[static::PROPERTY_MODIFIED])) {
if (!is_string($data[static::JSON_PROPERTY_MODIFIED])) { if (!is_string($data[static::PROPERTY_MODIFIED])) {
throw new \InvalidArgumentException("Modified date must be a string in ISO 8601 format"); throw new \InvalidArgumentException("Modified date must be a string in ISO 8601 format");
} }
$this->data[static::JSON_PROPERTY_MODIFIED] = $data[static::JSON_PROPERTY_MODIFIED]; $this->data[static::PROPERTY_MODIFIED] = $data[static::PROPERTY_MODIFIED];
} else { } else {
$this->data[static::JSON_PROPERTY_MODIFIED] = null; $this->data[static::PROPERTY_MODIFIED] = null;
} }
if (isset($data[static::JSON_PROPERTY_PROPERTIES])) { if (isset($data[static::PROPERTY_PROPERTIES])) {
if (!is_array($data[static::JSON_PROPERTY_PROPERTIES])) { if (!is_array($data[static::PROPERTY_PROPERTIES])) {
throw new \InvalidArgumentException("Properties must be an array"); throw new \InvalidArgumentException("Properties must be an array");
} }
$this->getProperties()->jsonDeserialize($data[static::JSON_PROPERTY_PROPERTIES]); $this->getProperties()->jsonDeserialize($data[static::PROPERTY_PROPERTIES]);
} }
return $this; return $this;

View File

@@ -18,16 +18,17 @@ namespace KTXF\Resource\Provider\Node;
*/ */
abstract class NodePropertiesBaseAbstract implements NodePropertiesBaseInterface { abstract class NodePropertiesBaseAbstract implements NodePropertiesBaseInterface {
protected string $type = 'resource.data';
protected array $data = []; protected array $data = [];
public function __construct(array $data) { public function __construct(array $data) {
if (!isset($data[static::JSON_PROPERTY_TYPE])) { if (!isset($data[static::PROPERTY_TYPE])) {
$data[static::JSON_PROPERTY_TYPE] = static::JSON_TYPE; $data[static::PROPERTY_TYPE] = $this->type;
} }
if (!isset($data[static::JSON_PROPERTY_SCHEMA])) { if (!isset($data[static::PROPERTY_SCHEMA])) {
$data[static::JSON_PROPERTY_SCHEMA] = 1; $data[static::PROPERTY_SCHEMA] = 1;
} }
$this->data = $data; $this->data = $data;
@@ -44,14 +45,14 @@ abstract class NodePropertiesBaseAbstract implements NodePropertiesBaseInterface
* @inheritDoc * @inheritDoc
*/ */
public function type(): string { public function type(): string {
return $this->data[static::JSON_PROPERTY_TYPE]; return $this->data[static::PROPERTY_TYPE];
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function schema(): int { public function schema(): int {
return $this->data[static::JSON_PROPERTY_SCHEMA]; return $this->data[static::PROPERTY_SCHEMA];
} }
} }

View File

@@ -18,11 +18,8 @@ use JsonSerializable;
*/ */
interface NodePropertiesBaseInterface extends JsonSerializable { interface NodePropertiesBaseInterface extends JsonSerializable {
public const RESOURCE_TYPE = 'resource.data'; public const PROPERTY_TYPE = '@type';
public const PROPERTY_SCHEMA = 'schema';
public const JSON_TYPE = 'resource.data';
public const JSON_PROPERTY_TYPE = '@type';
public const JSON_PROPERTY_SCHEMA = 'schema';
/** /**
* Get resource node properties type * Get resource node properties type

View File

@@ -16,6 +16,4 @@ use KTXF\Json\JsonDeserializable;
* *
* @since 2025.05.01 * @since 2025.05.01
*/ */
interface NodePropertiesMutableInterface extends NodePropertiesBaseInterface, JsonDeserializable { interface NodePropertiesMutableInterface extends NodePropertiesBaseInterface, JsonDeserializable {}
}