История коммитов

.
refactor(security): take the sanitizer interface in the injected consumers
Nine services, use cases and controllers asked the container for a raw
\HTMLPurifier; they now take HtmlSanitizerInterface and speak of policies
instead of the library. Behaviour is unchanged: every call site keeps the
default rich-content policy it had.

The tests that stubbed the vendor class mock the interface instead, and
ItemContentFormatterTest asserts what the formatter owes (null for no content,
sanitized before it becomes Markup) rather than re-testing the sanitizing that
HtmlSanitizerTest already covers.
.
feat(security): introduce a policy-based html sanitizer
Callers state what kind of content they have (HtmlPolicy) and ask
HtmlSanitizerInterface to clean it; which library does the work is now an
implementation detail of a single class.

- HtmlPolicy: RichContent, Inline, InlineWithParagraphs
- HtmlPurifierFactory holds every policy, including the two configs that the
consent module used to build for itself
- the definition of the rich policy is cached in data/cache/htmlpurifier, so it
is no longer recompiled on every request and no longer written into vendor/
- Johncms\Security\HTMLPurifier is deprecated and delegates to the factory
- 85 tests covering xss vectors, preserved editor markup, policy boundaries and
multibyte text
.
ci(node): keep the emnapi peer entries in the lock file
The npm of the runner requires @emnapi/runtime in the lock file while the older npm of the development machine drops it, so npm ci failed. The lock file is regenerated with the npm version of the runner and now satisfies npm 10 and 11 alike.
.
ci(node): run the build on node 24
npm 11 drops the @emnapi/* peer entries of an optional package from the lock file, and npm 10 of node 22 refuses to install without them, so npm ci failed. The workflow now uses the same node as the development environment, with the setup-node action updated and the npm cache turned on.
.
chore: update node packages
.
fix(logs): write php errors to the log of the application
The boot pointed the php error_log at a second file, so failures happening before the error handlers exist ended up in errors-<date>.log instead of johncms-<date>.log. LoggerFactory now tells which file it writes to, and log_errors is on outside DEBUG as well.
.
chore: update composer packages
.
docs: update the submodule pointer
.
refactor: drop the aura/autoload dependency
Nothing was resolved through it any more: every module class is covered by composer PSR-4. The installer now requires its own class directly, Modules::registerAutoloader() and module_lib_loader() are gone, and ModuleInstaller no longer looks up the old module namespace. Dead PSR-4 entries of Downloads\ and Library\ are removed too.
.
fix(forum): stop the view counter from breaking on topics with no views
The view_count column is nullable and new topics were created without it, so ShortNumberFormatter got null and the topic page failed, while a plain increment kept the value NULL forever.