diff --git a/.phpdoc/template/template.xml b/.phpdoc/template/template.xml
new file mode 100644
index 0000000000..dad167d3b4
--- /dev/null
+++ b/.phpdoc/template/template.xml
@@ -0,0 +1,11 @@
+
+
+ phpdoc
+ Jaap van Otterdijk
+ jaap@phpdoc.org
+ 1.0.0
+ default
+
+
+
+
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 1cda5ae0bf..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: php
-php:
- - 5.3
- - 5.4
-
-script:
- - phpunit --coverage-text
-
-before_script:
- - sudo apt-get update
- - sudo apt-get install graphviz
- - pyrus install -f http://download.pear.php.net/package/PEAR-1.9.4.tgz
- - pyrus install -f -p pyrus/Pyrus_Developer
- - pyrus install -f pear2.php.net/PEAR2_Exception
- - wget http://getcomposer.org/composer.phar
- - php composer.phar install
\ No newline at end of file
diff --git a/.twig-cs-fixer.php b/.twig-cs-fixer.php
new file mode 100644
index 0000000000..d48e2c8ff6
--- /dev/null
+++ b/.twig-cs-fixer.php
@@ -0,0 +1,19 @@
+addStandard(new TwigCsFixer\Standard\TwigCsFixer());
+$ruleset->overrideRule(new \TwigCsFixer\Rules\Variable\VariableNameRule(
+ case: \TwigCsFixer\Rules\Variable\VariableNameRule::CAMEL_CASE,
+));
+$ruleset->addRule(new \TwigCsFixer\ForIfRule());
+
+$config = new TwigCsFixer\Config\Config();
+$config->setRuleset($ruleset);
+
+$config->allowNonFixableRules();
+
+return $config;
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000..30885a1b74
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,1040 @@
+2021-08-20: Version 3.1.1
+
+# Fixed
+- Add workaround for phar distribution and plantuml, thanks to [Jaapio]
+- XML template invalid XML due to missing marker.type, #2986, thanks to [Jaapio]
+- Class's traits not showing up in docs, #2984, thanks to [Jaapio]
+- Files with forced global namespace fail with "" is not a valid Fqsen, #2967, thanks to [Jaapio]
+- XML output missing method tags, #2965, thanks to [Jaapio]
+
+# CI
+- Updated code style checks, thanks to [jrfnl]
+
+
+2021-07-07: Version 3.1.0
+
+# ADDED
+- Fix parameter usage in templates, thanks to [Jaapio]
+- Introduce source view in default template #2919, thanks to [Jaapio]
+- Show var description on properties and constants, thanks to [Jaapio]
+- Extend guide descriptor with configuration, thanks to [Jaapio]
+- Add help screen to our Make setup, thanks to [Mike van Riel]
+- Add source value object in config #2855, thanks to [Jaapio]
+- Guides: write test for RenderCommand, thanks to [Mike van Riel]
+- Guides: Add more tests, thanks to [Mike van Riel]
+- Guides: Complete/introduce versionadded directive, thanks to [Mike van Riel]
+- Guides: Remove slug from Environment, clean more up, thanks to [Mike van Riel]
+- Guides: automatically determine directives for formats, thanks to [Mike van Riel]
+- Add php 8 syntax support, thanks to [Jaapio]
+- Guides: make options a firstclass citizen, move to autoloading, thanks to [Mike van Riel]
+- Guides: remove old classes and name more inline with the rest, thanks to [Mike van Riel]
+- Guides: Remove createSpanNode from Parser, thanks to [Mike van Riel]
+- Guides: Refactored NodeFactory and Instantiators away, thanks to [Mike van Riel]
+- Guides: clean up more, thanks to [Mike van Riel]
+- Guides: refactor last service references from nodes, thanks to [Mike van Riel]
+- Move rendering of Guide directives to Twig extension, thanks to [Mike van Riel]
+- Guides: remove render functions from twig, thanks to [Mike van Riel]
+- Guides: removed unused template parts, thanks to [Mike van Riel]
+- Move init of twig to init step #2845, thanks to [Jaapio]
+- Simplified node renderers and render paths, thanks to [Mike van Riel]
+- Guides: Complete Flyweighting NodeRenderers, thanks to [Mike van Riel]
+- Guides: DocumentNodeRenderer and Default renderer needed updating, thanks to [Mike van Riel]
+- Guides: Refactor renderers into Flyweights, thanks to [Mike van Riel]
+- Update PlantUmlClassDiagram to use new Renderer, thanks to [Mike van Riel]
+- Split transformer from template creation, thanks to [Jaapio]
+- Style activity diagram and allow for classes, thanks to [Mike van Riel]
+- Render UML diagrams using plantuml #2840, thanks to [Mike van Riel]
+- Guides: Copy asset when using Image directive, thanks to [Mike van Riel]
+- Guides: Render code blocks, thanks to [Mike van Riel]
+- Split the compile and transform stage, thanks to [Jaapio]
+- Bump phpunit for php8, thanks to [Jaapio]
+- introduce VersionSpecification, thanks to [orklah]
+- Improve documentation and add Markdown parser, thanks to [Mike van Riel]
+- Improve TOC for Guides, thanks to [Mike van Riel]
+- try to load the right phpunit version in phive based on php version, thanks to [orklah]
+- try to change phive range of version to support php8, thanks to [orklah]
+- try to run on php 8, thanks to [orklah]
+- reintroduce unused code detection, thanks to [orklah]
+- Add test for default value of parameters, thanks to [Jaapio]
+- use null coalesce operator when more logical, thanks to [orklah]
+
+# FIXED
+- Support UTF-8 in the contents of reST tables #2938, thanks to [David Stächele]
+- Add required tag description filters, thanks to [Jaapio]
+- Fix constant value desplaying as empty string when zero #2894, thanks to [WhizSid]
+- Fix permission issues because of flysystem, thanks to [Jaapio]
+- Fix #2832: Determine plantuml location using project dir, thanks to [Mike van Riel]
+- Fix #2833 Admonition contents are not rendered, thanks to [Mike van Riel]
+- Add symfony/polyfill-intl-idn to fix php 7.4 issue, thanks to [Jaapio]
+- Fix interface extends styling, thanks to [Jaapio]
+- Remove proxymanager dependency, thanks to [Jaapio]
+- Close href in search, thanks to [Jaapio]
+- Fix bug in dsn resolving, thanks to [Jaapio]
+- Typo fix, thanks to [Jaapio]
+- Fix set source, thanks to [Jaapio]
+- Fix example notice, thanks to [Jaapio]
+- Fix visibility calculation, thanks to [Jaapio]
+- Fix notice in tests, thanks to [Jaapio]
+- Reimplement filters to use ApiSpecification, thanks to [Jaapio]
+- Add validate flag to config, thanks to [Jaapio]
+- Wip for api config object, thanks to [Jaapio]
+- Leverage newer API of PrettyVersion, thanks to [Alessandro Lai]
+- default version should be '1.0.0', not numeric, thanks to [orklah]
+- fix #2686 Font Awesome is loaded twice in the HTML template, with conflicting technologies, thanks to [Mike Wilkerson]
+- Show Summary and Description for files, thanks to [Mike van Riel]
+- Define statements were not parsed as the strategy was not present, thanks to [Mike van Riel]
+- Fix #2466 Followup: XML template - description of property empty, thanks to [Jeff Horton]
+- Name test sensibly, thanks to [Jeff Horton]
+- Fix #2466 - replace twig variables with the updated names - add a functional test for the xml out put containing the expected outputs, thanks to [Jeff Horton]
+
+# DOCS
+- Update documentation about template parameters, thanks to [Jaapio]
+- Add xsd to docs, thanks to [Jaapio]
+- Extend configuration reference, thanks to [Jaapio]
+- Adjust the nightly releases documentation in README, thanks to [Nicolas CARPi]
+- only build docs on master, thanks to [Jaapio]
+- Fix all unresolved links in the documentation, thanks to [Mike van Riel]
+- Drop duplicated list item, thanks to [Andrii Dembitskyi]
+- Fix typo in document, thanks to [Takuya Aramaki]
+- improve configuration doc, thanks to [orklah]
+- More progress on the ADR for input and output formats, thanks to [Mike van Riel]
+- Start writing an ADR on handling input and output formats, thanks to [Mike van Riel]
+- Update installation guide, thanks to [Mike van Riel]
+- Remove sphinx from tools, thanks to [Jaapio]
+- Build v3 as latest docs, thanks to [Jaapio]
+- Docs: improvements for "references - phpdoc - tags - return", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - since", thanks to [jrfnl]
+- Docs: "references - phpdoc - tags - param" - remove note about error verification, thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - param", thanks to [jrfnl]
+
+# CI
+- Add E2E tests for a Package detail page, thanks to [Mike van Riel]
+- Add E2E tests for functions and fix bug, thanks to [Mike van Riel]
+- Duplicate groups are not allowed by cypress, add version and os, thanks to [Mike van Riel]
+- Enable Cypress retries and recording all E2E tests, thanks to [Mike van Riel]
+- Add E2E tests for constants in an interface, thanks to [Mike van Riel]
+- Add first set of E2E tests for constants, thanks to [Mike van Riel]
+- Add first set of E2E tests for properties, thanks to [Mike van Riel]
+- Add E2E tests for methods in interfaces, thanks to [Mike van Riel]
+- Split test files into their elements, thanks to [Mike van Riel]
+- Rework class overview and add search tests, thanks to [Mike van Riel]
+- Reuse sidebar tests in namespace overview and replace smoketests with e2e tests, thanks to [Mike van Riel]
+- Divide Cypress tests into two groups and fix psalm/phpstan violations, thanks to [Mike van Riel]
+- Add more asserts to Namespace E2E test and setup Cypress Dashboard, thanks to [Mike van Riel]
+- Add more E2E tests for the namespace overview, thanks to [Mike van Riel]
+- Add E2E tests for the frontpage and extract duplicates, thanks to [Mike van Riel]
+- Add E2E tests for the packages and constants on the homepage, thanks to [Mike van Riel]
+- Update and add to frontpage tests, thanks to [Mike van Riel]
+- Add tests for TagDescriptor namespace, thanks to [Mike van Riel]
+- Add matrix setup to smoke test, thanks to [Jaapio]
+- Use prophecy via phar install, thanks to [Jaapio]
+- Prepare for phpunit 10, thanks to [Jaapio]
+- Fix integration test, thanks to [Jaapio]
+- psalm lvl 4, thanks to [orklah]
+- remove unused variable or mark them as unused, thanks to [orklah]
+- Fix e2e tests, thanks to [Jaapio]
+
+
+2020-10-23: Version 3.0.0
+
+# ADDED
+
+- Allow customization of css, thanks to [Jaapio]
+- Filter unresolved interfaces, thanks to [Jaapio]
+- Add missing function location to xml template, thanks to [Jaapio]
+- Fix issues in structure.xml, thanks to [Jaapio]
+- Reintroduce xml structure file, thanks to [Jaapio]
+- Add Visibility on ConstantDescriptor and constantAssembler, thanks to [Orklah]
+- Improve test for the Template class, thanks to [Mike van Riel]
+- Add Files index and make more extendible, thanks to [Mike van Riel]
+- Render Collection Types as links, thanks to [Jaapio]
+- Add border to default template sidebar, thanks to [Jaapio]
+- Disable caching of twig templates and always enable debug, thanks to [Mike van Riel]
+- Redesign header, thanks to [Mike van Riel]
+- More styling of the default template, and include title in the config xsd, thanks to [Mike van Riel]
+- Redesign sidebar / navigation for default template, thanks to [Mike van Riel]
+- Add private and protected icons to table of contents, thanks to [Mike van Riel]
+- Push updates for table-of-contents, thanks to [Mike van Riel]
+- Split templates into smaller templates, thanks to [Mike van Riel]
+- Extract TOC entries to separate template, thanks to [Mike van Riel]
+- Signature should be styled more according to code, thanks to [Mike van Riel]
+- Re-add $ and () to toc entries, thanks to [Mike van Riel]
+- Remove prettify from Javascripts, thanks to [Mike van Riel]
+- Split methods and properties into sub-templates for re-use, thanks to [Mike van Riel]
+- Restructure CSS, thanks to [Mike van Riel]
+- Clean up namespaces, packages and index template files, thanks to [Mike van Riel]
+- Replace namespace and file templates' contents with components, thanks to [Mike van Riel]
+- Add back to top + various changes, thanks to [Mike van Riel]
+- Cache-bust assets in demo application, thanks to [Mike van Riel]
+- Update screenshot for demo, thanks to [Mike van Riel]
+- Integrated RST-Parser into phpDocumentor for faster iterations, thanks to [Mike van Riel]
+- [GUIDES] Move more and more dependencies up, thanks to [Mike van Riel]
+- Replaced custom error handling with logger for Guides, thanks to [Mike van Riel]
+- Refactor custom twig away from Guides and consolidate templates, thanks to [Mike van Riel]
+- Refactor Guides to simplify Depenency Injection, thanks to [Mike van Riel]
+- [GUIDES] Separate generic from restructuredtext specific code, thanks to [Mike van Riel]
+- [GUIDES] Read input from Flysystem, thanks to [Mike van Riel]
+- Migrate phpDocumentor\Descriptor\Filter to Prophecy, thanks to [martzd]
+- Extract parsing of a file into a separate command and handler, thanks to [Mike van Riel]
+- [GUIDES] Use FlySystem for writing output to, thanks to [Mike van Riel]
+- [GUIDES] Move parsing to the parser phase, thanks to [Mike van Riel]
+- [GUIDES] Separate parsing and rendering even more, thanks to [Mike van Riel]
+- [GUIDES] move more services to the front and into the container, thanks to [Mike van Riel]
+- [GUIDES] Shuffle code around to simplify dependencies more, thanks to [Mike van Riel]
+- [GUIDES] Refactor the Kernel out as to split parsing and rendering, thanks to [Mike van Riel]
+- Reintroduce important, note and warning directive and fix paths, thanks to [Mike van Riel]
+- Move caching of guides into the pipeline, thanks to [Mike van Riel]
+- [GUIDES] URLs between all pages and api documentation work, thanks to [Mike van Riel]
+- [GUIDES] Add test for Entry, thanks to [Mike van Riel]
+- [GUIDES] Enable Psalm, thanks to [Mike van Riel]
+- [GUIDES] Enable phpstan and phpcs checks, thanks to [Mike van Riel]
+- [Guides] Enable phpstan, thanks to [Mike van Riel]
+- Introduce ApiSetDescriptors, thanks to [Mike van Riel]
+- Only build Guides in the RenderGuide writer, thanks to [Mike van Riel]
+- Render documentation with phpDocumentor, not Sphinx, thanks to [Mike van Riel]
+- Remove build asset step as it is not really used and fails the build, thanks to [Mike van Riel]
+- Disable cache for guides, thanks to [Mike van Riel]
+- Replace markdown parser with CommonMark, thanks to [Jaapio]
+
+# REMOVED
+
+- Remove redundant functions and add tests, thanks to [Mike van Riel]
+- Remove redundant setters and complete test, thanks to [Mike van Riel]
+- Remove suggestion to install Twig PHP extension, thanks to [Mike van Riel]
+- Remove Behat from the build, thanks to [Mike van Riel]
+
+# FIXED
+
+- Template Default: normalize the section headers, thanks to [jrfnl]
+- Fix include of tags in function, thanks to [Jaapio]
+- Move search input to top, thanks to [Mike van Riel]
+- Resrtructure TOC to use DL instead of table, thanks to [Mike van Riel]
+- Moved CSS around and tweaked design of topnav, thanks to [Mike van Riel]
+- Move TOC, Breadcrumbs and tags into components, thanks to [Mike van Riel
+- Cleanup extension list (origin/php-extensions, php-extensions), thanks to [Jaapio]
+- Escape html in markdown, thanks to [Jaapio]
+- Improve docblock tag rendering, thanks to [Jaapio]
+- ConstantDescriptor can't have FileDescriptor as parent, thanks to [Orklah]
+- Fix usage for numeric version number, thanks to [Jaapio]
+- Fix version and since tags in default template, thanks to [Jaapio]
+- make getTypes never return null values, thanks to [Orklah]
+- Ensure that phpDocumentor2 Wildcards are expanded, thanks to [Mike van Riel]
+- Fix issue with invalid named magic properties, thanks to [Jaapio]
+- Use title and template from v2 config, thanks to [Jaapio]
+- Property descriptor is in markdown format, thanks to [Jaapio]
+- Internal is additional to the other visibilties, thanks to [Jaapio]
+- Remove ext-ctype from suggest because it's already required, thanks to [Randy Geraads]
+- XSD: update phpdoc.org URL to https, thanks to [jrfnl]
+- Fixes #2442: show 'mixed' in TOC for properties without type, thanks to [Mike van Riel]
+- Constant values in TOC should be singleline, thanks to [Mike van Riel]
+- Constants should not show a dollar sign in signature, thanks to [Mike van Riel]
+- Correctly render links to FQSEN references, thanks to [Mike van Riel]
+- Property default value of 0 is shown as an empty string, thanks to [Mike van Riel]
+- Prevent duplicate methods, properties and constants, thanks to [Mike van Riel]
+- Add deeplinks and tweak grid, thanks to [Mike van Riel]
+- Simplify the grid classes and match standards, thanks to [Mike van Riel]
+- Fixes #2457: Do not show global namespace when empty, thanks to [Mike van Riel]
+- Various changes to the default template, thanks to [Mike van Riel]
+- Remove slashes from default values, thanks to [Jaapio]
+- Revert added slashes to constant value, thanks to [Jaapio]
+- Fix graph path, thanks to [Jaapio]
+- Fix issues after parsing vendor dir, thanks to [Jaapio]
+- fix syntax error on base template, thanks to [Jaapio]
+- Improve link rendering for list like types, thanks to [Jaapio]
+- Fix display of return type and param description, thanks to [Jaapio]
+- prevent PHP error. Reason: type parameter for magic property can be null, thanks to [Axel Krysztofiak]
+- fixed phpstan error, thanks to [Randy Geraads]
+- Partially fix strip inline tags, thanks to [Jaapio]
+- Add testcase for issue #2425, thanks to [Jaapio]
+- Allow null descriptions, thanks to [Jaapio]
+- Update CSS with missing parts from website and update docs, thanks to [Mike van Riel]
+- Update demo site's styling, thanks to [Mike van Riel]
+- Fix link rendering, thanks to [Jaapio]
+- Fix namespace defined constants (origin/fix-namespace-constants), thanks to [Jaapio]
+- Apply short notation of elements by default, thanks to [Jaapio]
+- Fixes duplicated logs, thanks to [Jaapio]
+- Ensure traits are part of a namespace, thanks to [Jaapio]
+- Add builder to reducers, thanks to [Jaapio]
+- Fix check for reducer injection, thanks to [Jaapio]
+- Reintroduce examples in config and cli, thanks to [Jaapio]
+- Losen xsd order, thanks to [Jaapio]
+- [GUIDES] Change url linking to make menu work better, thanks to [Mike van Riel]
+- Ensure guides are rendered in the correct location, thanks to [Mike van Riel]
+- Extend list of default config file names, thanks to [Jaapio]
+- Allow multiple visibilities, thanks to [Jaapio]
+- Remove manditory paths setting, thanks to [Jaapio]
+- Fix filter constants, thanks to [Jaapio]
+- Add tests for visiblity, thanks to [Jaapio]
+- Fix commandline argument ignore-tags, thanks to [Jaapio]
+- Update our own config to ignore tags, thanks to [Jaapio]
+- Add strip tags filter, thanks to [Jaapio]
+- Fix configuration loading for ignore-tags, thanks to [Jaapio]
+- Improve creation of element filters, thanks to [Jaapio]
+- Include blockquote and fix height in navbar, thanks to [Mike van Riel]
+- GH#2493 Search links do not resolve on the homepage, thanks to [Mike van Riel]
+- Default template does not have responsiveness, thanks to [Mike van Riel]
+- Tweak navigation, thanks to [Mike van Riel]
+- Removed event dispatching from Node and wrote test, thanks to [Mike van Riel]
+- Add default for null values, thanks to [Jaapio]
+- Resolve style issues (origin/bugfix/2493), thanks to [Mike van Riel]
+- Resolve last issues in default template, thanks to [Mike van Riel]
+
+# Security
+
+- Update Cypress to resolve security issues, thanks to [Mike van Riel]
+- Updated http-foundation to resolve reported security issues, thanks to [Mike van Riel]
+
+# DOCS
+
+- Improve layout of comment after "your environment", thanks to [HonkingGoose]
+- Improve bug report template, thanks to [HonkingGoose]]
+- Add whitespace for readability, thanks to [HonkingGoose]
+- Use proper casing for the word GitHub, thanks to [HonkingGoose]
+- Update README.md, thanks to [HonkingGoose]
+- Cleanup docs, thanks to [Jaapio]
+- Add filesystem docs, thanks to [Jaapio]
+- Fix even more links in docs, thanks to [Mike van Riel]
+- Fix documentation links, thanks to [Mike van Riel]
+- Fix typos in docs, thanks to [Mike van Riel]
+- Improve FileDescriptor docs, thanks to [Jaapio]
+- Add tags to improve api docs for templates, thanks to [Jaapio]
+- Add hint about plaintext summaries, thanks to [Jaapio]
+- Small doc improvements, thanks to [Jaapio]
+- Removed all 'under construction' pages, thanks to [Mike van Riel]
+- Docs: improvements for "getting started - changing the look and feel", thanks to [jrfnl]
+- Docs: further improvements for "getting started - installing", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - internal", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - version", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - var", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - todo", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - throws", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - subpackage", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - see", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - filesource", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - deprecated", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - copyright", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - category", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - package", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - link", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - license", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - ignore", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - author", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - api", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - property[<-read|-write>]", thanks to [jrfnl]
+- Docs: improvements for "getting started - your first set of documentation", thanks to [jrfnl]
+- Docs: improvements for "references - phpdoc - tags - method", thanks to [jrfnl]
+- Docs: improvements for "getting started - installing", thanks to [jrfnl]
+- Docs: fix various links [public facing], thanks to [jrfnl]
+- Fix references to the phpdoc.org website [test fixtures], thanks to [jrfnl]
+- Fix references to the phpdoc.org website [test file docblocks], thanks to [jrfnl]
+- Fix references to the phpdoc.org website [src file docblocks], thanks to [jrfnl]
+- Fix references to the phpdoc.org website [templates], thanks to [jrfnl]
+- Fix references to the phpdoc.org website [docs website], thanks to [jrfnl]
+- Fix references to the phpdoc.org website [public facing], thanks to [jrfnl]
+- Docs: remove `:term:` annotations, thanks to [jrfnl]
+- Inline docs: php.net - use language agnostic links and more, thanks to [jrfnl]
+- Docs: php.net - use language agnostic links and more, thanks to [jrfnl]
+- Docs: include instead of duplicate for "index", thanks to [jrfnl]
+- Docs: consistency in referring to the project, thanks to [jrfnl]
+- Template files: remove a broken link, thanks to [jrfnl]
+- Template files: fix various links, thanks to [jrfnl]
+- add option for creating class diagram in the docs, thanks to [Subhojit Paul]
+- Fix internal tag filtering, thanks to [Jaapio]
+- Fix covers annotations, thanks to [Jaapio]
+- Fix more tests and example rendering, thanks to [Jaapio]
+- Advanced inline tag rendering, thanks to [Jaapio]
+- Fix all descriptor tests, thanks to [Jaapio]
+- Expirment with description filter, thanks to [Jaapio]
+- Disable compiler passes right now, thanks to [Jaapio]
+- Switch to Description object, thanks to [Jaapio]
+- Add documentation for custom settings, thanks to [Mike van Riel]
+- Update documentation for guides, thanks to [Mike van Riel]
+- Update readme to prepare for v3, thanks to [Jaapio]
+
+
+# CI
+
+- Composer v2.0: remove `--no-suggest flag` as its going to be deprecated, thanks to [HonkingGoose]
+- Add Docker to .dependabot/config.yml, thanks to [HonkingGoose]
+- removed unused imports, thanks to [Randy Geraads]
+- Add test for ProvideTemplateOverridePathMiddleware, thanks to [Mike van Riel]
+- Improve ci cache, thanks to [Jaap van Otterdijk]
+- Add unittest for flysystem loader, thanks to [Jaapio]
+- Add npm to dependabot, thanks to [Jaapio]
+- Add checker for broken doc links, thanks to [Jaapio]
+- Add psalm to phive, thanks to [Jaapio]
+- Improve ci pipeline setup, thanks to [Jaapio]
+- add strict_types when missing, thanks to [Orklah]
+- add param types where possible, thanks to [Orklah]
+- small fixes. Preparation for Psalm, thanks to [Orklah]
+- psalm improvements, thanks to [Orklah]
+- Migrate phpDocumentor\{Parser, Event, Pipeline} from Mockery to Prophecy, thanks to [simivar]
+- Migrate phpDocumentor\Transformer from Mockery to Prophecy, thanks to [simivar]
+- CI: allow Cypress tests to pass, thanks to [jrfnl]
+- PHPCS config: minor tweaks, thanks to [jrfnl]
+- fix psalm issues on last version, thanks to [Orklah]
+- ignore TooManyTemplate error on Compiler because Psalm doesn't yet expect template annotation to SplPriorityQueue, thanks to [Orklah]
+- add template annotations on Compiler, thanks to [Orklah]
+- ignore phpstan false-positive until the bugfix, thanks to [Randy Geraads]
+- Command to pull the latest docker containers used in the Makefile, thanks to [Randy Geraads]
+- File docblocks: remove license tags, thanks to [jrfnl]
+- Bump release flow to phar action (origin/phar-action, phar-action), thanks to [Jaapio]
+- Start using phar github action, thanks to [Jaapio]
+- Fix composer.lock after update, thanks to [Jaapio]
+- Bump to composer 2, thanks to [Jaapio]
+- Publish NPM package with assets, thanks to [Mike van Riel]
+- Invalid breakpoint used, causing CSS to go wonky, thanks to [Mike van Riel]
+- Re-enable windows testing, thanks to [Jaapio]
+- Enable github-actions updates via Dependabot, thanks to [HonkingGoose]
+- Migrate phpDocumentor\Compiler\Pass from Mockery to Prophecy, thanks to [simivar]
+- Migrate phpDocumentor\Console from Mockery to Prophecy, thanks to [simivar]
+- Migrate test cases that don't use Mockery to PHPUnit's TestCase from MockeryTestCase, thanks to [simivar]
+- Add unit tests for dns, thanks to [Marvin Caspar]
+- Psalm.xml simplification, thanks to [orklah]
+- Migrate phpDocumentor\Descriptor\Builder\Reflector\Tags to Prophecy (#2609), thanks to [martzd]
+- Migrate phpDocumentor\Descriptor\Builder\Reflector to Prophecy (#2607), thanks to [martzd]
+- add details in phpdoc, thanks to [orklah]
+- redundant phpdoc, thanks to [orklah]
+- redundant default parameter value, thanks to [orklah]
+- redundant property initialization, thanks to [orklah]
+- unused variables, thanks to [orklah]
+- use Assert lib instead of native assert, thanks to [orklah]
+- create a MiddlewareInterface and normalize Middlewares, thanks to [orklah]
+- push psalm to level 6, thanks to [orklah]
+- Phpstan doesn't support inheritance of templates + fix various issues, thanks to [orklah]
+- changing templates for coherence, thanks to [orklah]
+- replace static by self and replace className by self when applicable, thanks to [orklah]
+- Rebuild docs when template changes, thanks to [Mike van Riel]
+
+
+2020-02-09: Version 3.0.0-rc
+
+# Removed
+- Self update command thanks to [Jaapio]
+
+# FIXED
+- Docblock errors are now visible in default template, #2250 thanks to [Jaapio]
+- Run doesn't ignore cache with `--force`, #2257 thanks to [Mike van Riel]
+- `--config=none` doesn't respect commandline arguments thanks to [Jaapio]
+- Tag bodies starting with `[` are not accepted, #2260 thanks to [Jaapio]
+- Files starting with shebang are not parsed, #2259 thanks to [Jaapio]
+- Inline markers are not detected, #2256 thanks to [Jaapio]
+- Files with non utf-8 encoding are not processed correctly, #2254 [Jaapio]
+
+# CI
+ - Bring PHPStan to lvl 6 thanks to [Orklah]
+ - Internals are better typed thanks to [Orklah]
+ - Upgrade Coding standards to phpdoc coding standards thanks to [Jaapio]
+
+2020-01-31: Version 3.0.0-beta
+
+# BREAKING CHANGES
+ - Minimum PHP version to run this is 7.2 thanks to [Mike van Riel]
+ - Trunk based development thanks to [Mike van Riel]
+ - Support for XML-based templates was dropped thanks to [Mike van Riel]
+ - Support for rendering an XML-based ast (structure.xml) was dropped thanks to [Mike van Riel]
+
+# ADDED
+ - Add new default template thanks to [Mike van Riel]
+ - Add reports to the new template thanks to [Mike van Riel]
+ - Add missing visibilities thanks to [Mike van Riel]
+ - Add namespace and class-based templates for new default theme thanks to [Mike van Riel]
+ - Adds dockerfile for docs thanks to [Jaapio]
+ - Add Search and a lot of little features to the new template thanks to [Mike van Riel]
+ - Add support for 'deprecated' and test various method modifiers thanks to [Mike van Riel]
+ - Add support for Typed Properties thanks to [Mike van Riel]
+ - Add support for Version 2 configuration and make an upgrade mechanism thanks to [Mike van Riel]
+ - Add VERSION to documentation build thanks to [Mike van Riel]
+ - Allow use of 'local' templates thanks to [Mike van Riel]
+ - Cleaned up dependency versions in Composer thanks to [Mike van Riel]
+ - Ensure Cache Folder is O/S neutral thanks to [Mike van Riel]
+ - Rework File I/O for Writers and Transformations thanks to [Mike van Riel]
+ - Custom Settings may be set from command line or config thanks to [Mike van Riel]
+ - Flesh out new Class Details page thanks to [Mike van Riel]
+ - Improve handling of constants in new template thanks to [Mike van Riel]
+ - Improve new default template thanks to [Mike van Riel]
+ - Improve rendering of properties in the new template thanks to [Mike van Riel]
+ - Initial setup for new template thanks to [Mike van Riel]
+ - Introduce FlySystem into twig file loading thanks to [Mike van Riel]
+ - Introduce Symfony Config for configuration parsing thanks to [Mike van Riel]
+ - Writers should be able to expose custom settings thanks to [Mike van Riel]
+ - Recursively upgrade configuration to newer versions thanks to [Mike van Riel]
+ - Render files as part of new template and link to them thanks to [Mike van Riel]
+
+
+# FIXED
+ - Building an '@package' tree failed with certain characters thanks to [Mike van Riel]
+ - Clean run command docs thanks to [Jaapio]
+ - Clean up file header for new config thanks to [Mike van Riel]
+ - Collections were always replaced, even when unmodified thanks to [Mike van Riel]
+ - Convert v2 config to v3 and make v3 similar to previous thanks to [Mike van Riel]
+ - Allow comma-separated values for `-f` thanks to [Mike van Riel]
+ - Allow default symfony command execution thanks to [Jaapio]
+ - Allow definition of multiple api's thanks to [Jaapio]
+ - Allow for output folders to be set thanks to [Mike van Riel]
+ - Allow multiple directories using comma's thanks to [Mike van Riel]
+ - Fix string class names in tests thanks to [50bhan]
+ - Configuration needed a 'phpdocumentor' root element thanks to [Mike van Riel]
+ - Conversion of slashes causes issues instead of fixing it thanks to [Mike van Riel]
+ - Convert URIs into League URIs thanks to [Mike van Riel]
+ - Dockerfil was missing && thanks to [Mike van Riel]
+ - Ensure that 'filename' and 'directory' is properly checked thanks to [Mike van Riel]
+ - Ensure that the config/secrets/prod folder exists thanks to [Mike van Riel]
+ - Correctly render links to Nullable types thanks to [Mike van Riel]
+ - hotfix/docker-build #1976 thanks to [Jaap van Otterdijk]
+ - More robust vendor directory detection #2153 thanks to [jclaveau]
+ - Replace Cocur/Slugify with Symfony/String #2165 thanks to [Mike van Riel]
+ - relative path resolving #2193 thanks to [Jaap van Otterdijk]
+ - resolve target path #2196 thanks to [Jaap van Otterdijk]
+ - windows path issue #2197 thanks to [Jaap van Otterdijk]
+ - windows template path resolving #2202 thanks to [Jaap van Otterdijk]
+ - Invalid tags processing #2209, #2205 thanks to [Jaap van Otterdijk]
+ - Finish configuration definition for v2 thanks to [Mike van Riel]
+ - Have the Twig writer write using FlySystem thanks to [Mike van Riel]
+ - Upgrade to Symfony 5 thanks to [Mike van Riel
+ - Improve error message during get magic props thanks to [Jaapio]
+ - Improve error message on invalid path thanks to [Jaapio]
+ - Create more domain specific exceptions thanks to [Jaapio]
+ - Fragments cannot be expressed in a route thanks to [Mike van Riel]
+ - Monolog started complaining about a setting in their latest version thanks to [Mike van Riel]
+ - Passing "--config none" throws error thanks to [Mike van Riel]
+ - phpDocumentor goes into infinite loop when class extends itself thanks to [Mike van Riel]
+ - Normalize package names thanks to [Mike van Riel]
+ - Links are not rendered to the correct location thanks to [Mike van Riel]
+ - Show quotes with string values thanks to [Mike van Riel]
+ - Unresolved types could not be rendered thanks to [Mike van Riel]
+
+# REMOVED
+ - Remove validation of DocBlocks
+ - Remove compression on phar thanks to [Jaapio]
+ - Remove default language and set per job thanks to [Mike van Riel]
+ - Removed Travis and Appveyor since Github Actions does all thanks to [Mike van Riel]
+ - Remove duplicate :bug icon thanks to [Jaapio]
+ - Remove duplicate entry from the build pipeline thanks to [Mike van Riel]
+ - Removed Zend Serialiser and StdLib thanks to [Mike van Riel]
+ - Remove OS dependence on vendor folder thanks to [Mike van Riel]
+ - Remove our own Uri object thanks to [Mike van Riel]
+ - Remove Parse and TransformCommand thanks to [Mike van Riel]
+ - Remove pr and lable from issue workflow thanks to [Jaapio]
+ - Remove Type descriptors thanks to [Mike van Riel]
+ - Remove unused exception classes thanks to [Mike van Riel]
+ - Remove unused exception classes thanks to [Mike van Riel]
+ - Remove unused function and test thanks to [Mike van Riel]
+ - Remove unused interface thanks to [Mike van Riel]
+ - Remove unused property thanks to [Mike van Riel]
+ - Remove unused settings, fix linting and one test thanks to [Mike van Riel]
+ - Remove workaround for generating projects in other folders thanks to [Mike van Riel]
+
+
+# DOCS
+ - Ensure that all 404's are redirect to /latest thanks to [Mike van Riel]
+ - Ensure that the docroot always goes to /latest thanks to [Mike van Riel]
+ - Fixed link to Graphviz thanks to [Mike van Riel]
+ - Update CONTRIBUTING.md with new branches and repo names thanks to [Mike van Riel]
+ - Update documentation on how Configuration works thanks to [Mike van Riel]
+ - Update documentation template to match new style thanks to [Mike van Riel]
+ - Update README with a couple of links thanks to [Mike van Riel]
+ - Update shields thanks to [Mike van Riel]
+ - Use default nginx image and allow versioning thanks to [Mike van Riel]
+ - Improve installation descriptions thanks to [Jaapio]
+ - Improve run command docs thanks to [Jaapio]
+ - Readme update thanks to [Jaapio]
+
+# CI
+ - Fix some errors on PHPStan lvl 6 thanks to [Orklah]
+ - Fixed indentation thanks to [Graham Campbell]
+ - Raised test coverage from 35% to 70% thanks to [Jaapio] & [Mike van Riel]
+ - Add dependabot automerge thanks to [Jaapio]
+ - Add unit testing to Github Actions pipeline thanks to [Mike van Riel]
+ - Add working lables for actions and packagist thanks to [Jaapio]
+ - Add PHAR building to Behat PHAR tests thanks to [Mike van Riel]
+ - Add a quick check for code coverage thanks to [Mike van Riel]
+ - Add a smoke test stage thanks to [Mike van Riel]
+ - Add initial e2e test for Default template thanks to [Mike van Riel]
+ - Add E2E tests for the Class details of Default thanks to [Mike van Riel]
+ - Add behat as binary thanks to [Jaapio]
+ - Add behat to execute thanks to [Jaapio]
+ - Add bin folder to cache thanks to [Jaapio]
+ - Add build matrix on unit tests thanks to [Mike van Riel]
+ - Add convenience binaries for tools thanks to [Mike van Riel]
+ - Add extra comment with cache key determination thanks to [Mike van Riel]
+ - Add make target for setting up phive and fix tests thanks to [Mike van Riel]
+ - Add missing symbols to require checker and check on pre-commit thanks to [Mike van Riel]
+ - Add support for testing the clean template thanks to [Mike van Riel]
+ - Add Symfony's var-dump-server binary to the gitignore thanks to [Mike van Riel]
+ - Add issue templates thanks to [Jaapio]
+ - Build documentation using Github Actions thanks to [Mike van Riel]
+ - Bump phpstan to 0.12 thanks to [Jaapio]
+ - Change caching of build tools thanks to [Mike van Riel]
+ - Change output folders for tests thanks to [Mike van Riel]
+ - Use the PHAR of PHPUnit instead of installing it globally thanks to [Mike van Riel]
+ - Enable the behat tests for all environments thanks to [Mike van Riel]
+ - Download tools in setup step and cache it thanks to [Mike van Riel]
+ - Update issue triage workflow thanks to [Jaapio]
+ - Improve build workflow with Behat tests thanks to [Mike van Riel]
+ - Switch from xdebug to pcov for Code Coverage thanks to [Mike van Riel]
+ - Move example project to examples and include Cypress in build thanks to [Mike van Riel]
+ - Update Cypress tests to include latest changes in the template thanks to [Mike van Riel]
+ - Include Windows and MacOSX builds thanks to [Mike van Riel]
+ - PHPStan Lvl4 thanks to [Mike van Riel]
+ - Merge pull request #2187 from phpDocumentor/fix/phpstan-level-5 thanks to [Jaap van Otterdijk]
+ - Merge pull request #2141 from phpDocumentor/tighten-up-coding-standards thanks to [Jaap van Otterdijk]
+ - Merge pull request #2134 from phpDocumentor/feature/phpunit8 thanks to [Jaap van Otterdijk]
+ - Merge pull request #2139 from phpDocumentor/feature/php74 thanks to [Jaap van Otterdijk]
+ - Simplify Behat build matrix and improve labels thanks to [Mike van Riel]
+ - Simplify Docker setup thanks to [Mike van Riel]
+ - Simplify installation of phive and add ocular thanks to [Mike van Riel]
+ - Persist PHAR as artifact and re-use it where possible thanks to [Mike van Riel]
+ - Run Cypress/E2E tests against all major O/S thanks to [Mike van Riel]
+ - Run Cypress on 16.04 due to a bug in 18.04/Cypress 3.8.2 thanks to [Mike van Riel]
+ - Split phpunit into a fast version and a build matrix version thanks to [Mike van Riel]
+
+
+
+
+
+[Mike van Riel]: https://github.com/mvriel
+[Jaapio]: https://github.com/jaapio
+[jrfnl]: https://github.com/jrfnl
+[Jaap van Otterdijk]: https://github.com/jaapio
+[jclaveau]: https://github.com/jclaveau
+
+```
+DROP: Support symlinks
+```
+
+2014-11-23: Version 2.8.2
+-------------------------
+
+```
+FIXED: Self-update for PHAR files
+FIXED: Log now shows which elements do not have a summary
+FIXED: When omitting markers the code now automatically picks TODO and FIXME
+FIXED: Missing assets in new-black and abstract template
+FIXED: phpDocumentor will error if the iconv extension is missing.
+```
+
+2014-11-13: Version 2.8.1
+-------------------------
+
+```
+FIXED: Fatal error in phar file when used from a folder containing a composer.json
+```
+
+2014-10-29: Version 2.8.0
+-------------------------
+
+```
+ADDED: Argument "--cache-folder" to indicate where the cache is stored
+ADDED: `phpdoc self-update` command to the PHAR archive to update phpDocumentor with a single command
+FIXED: #423: Error report in responsive and responsive-twig template should hide empty results and update error
+ counter next to the filename.
+FIXED: #573: Visibility filters in 'responsive' and 'responsive-twig' do not function properly
+FIXED: Several scrutinizer reported clean ups
+FIXED: If tmp was somewhere in path it would be incorrectly replaced
+FIXED: Several tests were added
+FIXED: It is now possible to install phpDocumentor using composer in a project using ZF 2.3 or higher
+FIXED: Fatal error: Call to a member function getParent() on a non-object in ConstantDescriptor.php
+FIXED: Fatal error: Call to a member function getParent() on a non-object in PropertyDescriptor.php
+REMOVED: Knp menu from composer.json because it was not used
+```
+
+2014/08/18: Version 2.7.0
+-------------------------
+
+```
+ADDED: A new writer that outputs a statistical extract from the collected data
+ADDED: Windows support for Ansible playbooks
+ADDED: 8% to 10% Code Coverage thanks to #testfest 2014
+ADDED: #1347: Support for custom Vendor folders
+ADDED: Plugins can now be configured using parameters.
+ADDED: Complete support for @example
+ADDED: NamespacePrefix to LegacyNamespaceConverter plugin
+FIXED: Fatal error in MethodDescriptor when a parent was incorrectly called
+FIXED: Notice in '@see' handling
+FIXED: #1349: Configuration file was not found in working directory
+FIXED: Phing integration by re-instating the bootstrap class
+FIXED: Fixing type inference and variable length issues
+FIXED: Whether a method is inherited is shown again in XSL-based templates
+FIXED: Various minor bugs that became visible during the writing of tests
+FIXED: #1390: Source code paths were incorrect if the source was in folder
+FIXED: #1341: Icons in clean template were shown incorrectly
+FIXED: #1331: Not all validations were properly shown
+FIXED: #1077: Spaces in a path won't trip up libxml anymore
+CHANGED: Changed reference to deprecated Parsedown method parse() to text()
+CHANGED: Completely replaced Puppet with Ansible to provision contributor VMs
+CHANGED: Simpler provisioning for generic contributors; to do profiling
+ another task is now needed
+CHANGED: Docs no longer refer to Short Description or Long Description but to
+ Summary and Description per PSR-5
+```
+
+2014/07/09: Version 2.6.1
+-------------------------
+
+```
+FIXED: #1330: Fix crash when assembling package tags
+FIXED: #1326: Fix crash while generating routes in Twig templates
+```
+
+2014/06/27: Version 2.6.0
+-------------------------
+
+```
+ADDED: #1087: Fully support `@see`
+ADDED: #1213: Resolve inline @see and @link to Markdown link
+CHANGED: #1186: Move checking of writer requirements
+CHANGED: #1267: XSL should use Router
+CHANGED: Update contribution guide to match new XHGUI
+CHANGED: #1248: Replace ZendConfig with Serializer-based config
+CHANGED: #1017: Updated help output for --hidden to be more descriptive
+CHANGED: #1264: Clean template no longer requires an internet connection
+CHANGED: #1212: Plugin configuration can now be loaded from a config file
+CHANGED: #1194: Add support for default parameter values in @method
+FIXED: #1313: Namespace Aliases are not stored on FileDescriptor
+FIXED: #1308: Multiple templates in configuration do not work
+FIXED: #713: XSL Templates are not found in Windows
+FIXED: #1253: Transformation crashes on typehint
+FIXED: #1268: Restore handling of visibility
+FIXED: #1130: Arrays not resolved in documentation
+FIXED: #1278: Template is not read from configuration
+FIXED: #1239: Parseprivate always triggers a complete parsing run
+FIXED: Parsing crashes on visibility as string
+FIXED: Routing crashes in Twig
+FIXED: #1307: Parsing crashes on unknown trait
+FIXED: #1114: Debug mode for Twig was not enabled
+FIXED: Errors were not shown in XSL templates
+FIXED: Remove duplicate namespace separator in constants defined by DEFINE
+FIXED: #930: @see and @link did not resolve self
+FIXED: #993: UTF-8 characters in filenames do not work in windows
+FIXED: #790: Inheritance in XSL was incorrectly registered
+FIXED: #713: Phar was sometimes not working on windows due to paths
+FIXED: Restore Behat tests
+FIXED: #1252: Namespaces are not shown on responsive template
+```
+
+2014/05/17: Version 2.5.0
+-------------------------
+
+```
+FIXED: #1211: Loading a single plugin is not possible
+FIXED: #1232: Routing crashes on magic property in trait
+FIXED: #157: Classes do not inherit trait methods and props
+FIXED: #1193: Package tags don't inherit to classes
+FIXED: #1229: @method tag in a trait causes Exception
+FIXED: #1196: Some files cannot be copied with FileIO
+CHANGED: Better OPcache handling, annotations are not stripped anymore in PHP 5.5+
+CHANGED: phpdoc.php was renamed to phpdoc; phpdoc.php is kept for backwards compatibility
+```
+
+2014/04/01: Version 2.4.0
+-------------------------
+
+```
+FIXED: #1141: Deprecated report was missing in Clean template.
+FIXED: #1191: Opcache comments were not disabled due to incorrect extension name
+FIXED: #1184, #1181: @package tag on File was not recognized and not inherited on children
+FIXED: #1180: phpDocumentor crashes if an `@subpackage` has no name set
+FIXED: #1178: Generating a marker listing crashes sometimes
+FIXED: #1176: DocBlocks were not overridden on subclasses
+FIXED: #1163: Responsive and Responsive-twig templates do not work on HTTPS
+FIXED: #1158: Clean and Responsive template shows empty namespace menu when there are no namespaces
+FIXED: #1134, #1132: GraphViz reports can crash due to empty labels
+FIXED: #1098: Re-added missing Javascript file
+FIXED: #1037: IE did not like empty anchors
+FIXED: #152: @internal and @ignore did not behave as expected
+FIXED: Javascript notices in Clean by upgrading jQuery
+ADDED: #1141: Deprecated report to the Clean template
+ADDED: #629: Support for Variadics
+CHANGED: #1099, #1101: Replaced custom PHAR compiling with box-project.org and fixing issues in the mean time
+```
+
+2014/03/07: Version 2.3.2
+-------------------------
+
+```
+FIXED: #1133: Fixed subpackage without package validation
+FIXED: #1120: Set stable versions of DOMPDF and ezcDocument in Composer.json
+```
+
+2014/02/26: Version 2.3.1
+-------------------------
+
+```
+CHANGED: #1128: Minimum Symfony/Console version was set at 2.3 to support LTS version.
+FIXED: #1090: There were still GraphViz issues, these have now been fixed and confirmed.
+FIXED: #1131: Fatal Error on ConstantConverter when using an XML-based template.
+```
+
+2014/02/16: Version 2.3
+-----------------------
+
+```
+ADDED: Support for writing PDF files using a Twig template by adding the PDF writer.
+ADDED: More documentation on types, running phpDocumentor, the @var tag.
+ADDED: Support for sorting lists with Twig and XSLT.
+ADDED: Basic support for generating reference documentation with ReST documents.
+CHANGED: Replaced custom phar building with the library from https://box-project.github.io/.
+FIXED: #1090: GraphViz issues where the global namespace caused GraphViz not to generate.
+FIXED: #1037 by @siad007: if opcode cache is enabled for CLI then annotations are dropped.
+FIXED: #1031: Fixed inheritance for the summary, description, tags and the way @inheritdoc works.
+FIXED: Adding several unit tests.
+FIXED: Cleaned up code to remove warnings and errors.
+FIXED: #1111: An infinite loop occurred during processing of global constants.
+FIXED: Crash that occurred when building a tree of packages.
+FIXED: Crash that occurred when an interface was not recognized.
+FIXED: XSLTCache extension could not be used instead of XSLTProcessor due to a stray typehint.
+FIXED: #1110: Crash on incomplete `define` definition.
+FIXED: #949: `@inheritdoc` is not working with interfaces.
+```
+
+2013/11/23: Version 2.2
+-----------------------
+
+```
+ADDED: Information how to donate to phpDocumentor using gittip
+ADDED: Profiling information and process
+CHANGED: Moved the external class documentation code to their own router
+CHANGED: #1080: Replaced MarkDownExtra dependency with Parsedown
+CHANGED: Rewrote a lot of the documentation; still a work in progress
+FIXED: #720: External class documentation had ../files prepended
+FIXED: #932: Todo tags did not show up in Twig templates
+FIXED: #1049: Arguments passed by reference did not show up as being by reference
+FIXED: #1075: Prevent output from wrapping in Windows console
+FIXED: Cleaned up code based on Continuous Integration messages
+FIXED: Timezone issues on some machines
+FIXED: Various issues in several templates
+```
+
+2013/09/28: Version 2.1
+-----------------------
+
+```
+ADDED: New cli option 'log' to tell phpDocumentor the path where to log to
+ADDED: Verbosity can now be provided in three level, each indicating how much is written in the log
+ADDED: Support for the XSLCache drop in replacement of ext/xsl
+ADDED: Locale can now be supplied in the configuration
+ADDED: German translation for error messages
+ADDED: Support to insert Markdown files into specific points of the outputted documentation (partials)
+ADDED: Deprecated tag now registers the version number since when the associated element was deprecated
+ADDED: Show which traits are consumed by a class
+ADDED: Link to the traits that are consumed by a class
+ADDED: Show traits with their methods and properties
+CHANGED: phpDocumentor now checks for transformation requirements at the start of the application (#148)
+FIXED: Fatal error with some of the old-style validations
+FIXED: Template:list command errors due to an incorrect path
+FIXED: Checkstyle error report only showed errors of the file itself and not subelements (#1046)
+FIXED: Validation to check for validity of return types
+FIXED: Validation to check for validity of parameters
+FIXED: Fatal error when a parent interface is not in the project
+FIXED: Template:list does not throw an error
+FIXED: XML output correctly exposes @see, @link, @version
+FIXED: XML output now does not choke on special characters
+FIXED: Error code for return type was incorrect
+FIXED: Functions in the responsive twig now unfold to show complete contents
+FIXED: Constants in the responsive twig now unfold to show complete contents
+FIXED: Using an ampersand in the type of an @param no longer causes a fatal (not a recommended practice!)
+REMOVED: #814; removed ParserAbstract base class for Parser
+REMOVED: PSR Draft is now moved to its own repo: https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc.md
+REMOVED: Automatic generation of log files, the new log option can be used or a configuration option
+```
+
+2013/08/08: Version 2.0.1
+-------------------------
+
+```
+FIXED: Generated phar files could not be set to executable and ran.
+FIXED: Missing File-level DocBlocks were not detected.
+FIXED: Classes and namespace were not generated in Windows.
+FIXED: Notices were thrown with the Clean template.
+FIXED: In windows were path calculated incorrectly.
+```
+
+2013/08/03: Version 2.0.0
+-------------------------
+
+```
+ADDED: Presentation mode to router Twig filter, allows for different representations
+ADDED: StandardRouter now also supports generating paths for file documentation pages.
+ADDED: Version tag is now processed in the descriptors
+FIXED: Generated paths in the Twig writer were not windows safe
+FIXED: Minor Descriptor tweaks
+FIXED: Inheritance was broken due to an erroneous merge
+FIXED: Ampersands in tag descriptions caused XSL based templates to fatal
+FIXED: Inheritance of methods in interfaces was broken
+FIXED: All elements had an internal and ignore tag added due to an error in filtering
+FIXED: @internal inline tag handling did not function
+FIXED: Fatal error when an argument in an @method tag does not have a type
+FIXED: The logging directives in the configuration file were not followed.
+CHANGED: When installing composer the template folder will be vendor/phpdocumentor/templates and not data/templates
+CHANGED: The included ProgressHelper was replaced with the new ProgressHelper of Symfony Console
+ Components (https://github.com/symfony/symfony/pull/3501).
+REMOVED: Installer is removed; proved too unreliable
+DEPRECATED: Previously shared assets could be in the /data folder; this unnecessarily complicated template handling
+ and composer integration. Shared assets have now been moved inside the templates and when a template
+ requests shared assets it is in fact requesting files from the abstract template.
+ Using a source attribute with a transformation that has no direct reference to a template will be removed
+ in version 3.0; until that point the code will trigger E_USER_DEPRECATED warnings.
+```
+
+2013/07/12: Version 2.0.0b7
+---------------------------
+
+```
+FIXED: Warning in browser console 'Viewport argument value "device-width;" for key "width" is invalid, and has
+ been ignored. Note that ';' is not a separator in viewport values. The list should be comma-separated.'
+FIXED: VERSION file was missing from phar archive, causing it to fail
+FIXED: Elements with an @ignore tag were not filtered
+FIXED: Deprecated elements are now striken in the class overview
+FIXED: The @see reference was not shown and interpreted
+FIXED: The @uses reference was not shown and interpreted
+FIXED: Response type was not shown with magic methods
+FIXED: Arguments were not shown with magic methods
+FIXED: Type is not shown with magic properties
+FIXED: Magic methods were missing from sidebar
+FIXED: Coding standards issues
+FIXED: Several documentation issues
+FIXED: Windows error where the directory slashes were incorrectly presented.
+FIXED: When a file contains multiple errors, only the first is shown.
+FIXED: Generating a new template gave a fatal error
+FIXED: Generated templates were missing the transformation line for their structure.xml
+FIXED: Linking to functions
+FIXED: Linking to constants
+FIXED: Linking to properties
+FIXED: Linking to methods
+FIXED: Root elements with the same shortname and file but in a different namespace would overwrite the other.
+ADDED: New template 'xml' for outputting a pure XML representation of the project's structure
+ADDED: Update instructions to issue a PR against homebrew if the phar file updates:
+ https://github.com/josegonzalez/homebrew-php/blob/master/Formula/phpdocumentor.rb
+CHANGED: Assembling of Tags to Descriptors was refactored to work the same way as other Descriptors.
+CHANGED: Properties won't emit an error regarding a missing summary if it has an @var tag with a description.
+```
+
+2013/06/23: Version 2.0.0b6
+---------------------------
+
+```
+ADDED: Travis configuration was changed to test against 5.5
+FIXED: Packages were not indexed and shown correctly.
+FIXED: @var descriptions were not shown as summary if the summary was absent for a property.
+FIXED: Added static label on a property in the responsive template.
+FIXED: Alignment of tags in table display.
+FIXED: Response information was missing from method description.
+FIXED: Sourcecode viewer in new-black template.
+FIXED: Magic methods are now shown and inherited in the class view for the responsive-twig template.
+FIXED: Magic properties are now shown and inherited in the class view for the responsive-twig template.
+FIXED: Markdown fencing in responsive and responsive-twig template now correctly indents code examples.
+CHANGED: Deep link should not be shown for members without location.
+CHANGED: phpDocumentor now sets the memory limit to -1 to prevent issues due to a limited memory usage.
+CHANGED: Bumped maximum recursion setting from 5.000 to 10.000 since errors were still reported.
+REMOVED: `/bin/parse.php` binary; its function is carried out by `phpdoc project:parse`.
+REMOVED: `/bin/transform.php` binary; its function is carried out by `phpdoc project:transform`.
+```
+
+2013/06/21: Version 2.0.0b5
+---------------------------
+
+```
+FIXED: Root namespace was named `global` in overviews
+FIXED: An empty `Global ('\')` entry pointed to a non-existing default.html in the index
+FIXED: Since tag now shows the version number
+FIXED: Fatal error when an interface's parent could not be resolved in this project
+FIXED: API Documentation menu remains empty
+FIXED: Interface parents now link to the rest of the documentation
+FIXED: Inheritance of methods, constants and properties was not correctly recognized; this is now fixed
+FIXED: When a method argument has a typehint but no @param tag then the typehint will be shown
+FIXED Fatal error in XSL based templates when an interface extends another
+```
+
+2013/06/16: Version 2.0.0b4
+---------------------------
+
+```
+FIXED Fatal error that occurs when a constant has an error
+FIXED Fatal error that occurs in certain cases with the getError() method
+FIXED Refactored Builder into Assemblers to reduce technical debt
+CHANGED Refactored ProjectDescriptor Builder to separate assembling from filtering and validating
+CHANGED Introduced Symfony Validator component for element validation
+CHANGED Introduced ZF2 Filter component to filter elements (for example with @internal)
+```
+
+2013/06/14: Version 2.0.0b3
+---------------------------
+
+```
+FIXED Using an @uses tag results in a fatal error during execution
+FIXED Errors are now shown on the errors report of the responsive-twig template
+FIXED The error count on the index page of the responsive-twig template is restored
+FIXED Checkstyle output now functions as expected
+FIXED new-black template failed due to a capitalization issue with the Sourcecode writer
+FIXED Updated all templates to generate a structure.xml
+FIXED Fatal error when a property, constant or method collection contains a null value
+FIXED Fixed several errors in the Old Ocean template
+FIXED Removed broken logging call from Xsl writer
+FIXED Several PHP notices
+```
+
+2013/06/09: Version 2.0.0b2
+---------------------------
+
+```
+FIXED Package could not be set for constants, resulting in fatal error
+FIXED Default template was still responsive and not responsive-twig
+```
+
+2013/06/09: Version 2.0.0b1
+---------------------------
+
+The 13th alpha of phpDocumentor contains the final functionality for version 2.0.
+A lot of effort has been put in making sure that the API, Object structure and plugin mechanism will remain
+backwards compatible until version 3.0.
+
+Features have been changed, removed and added; making this an incredibly large backwards compatibility break compared
+to 2.0.0a13.
+
+> Important: if you have written your own XSL based template; please change the template.xml to generate the XML output
+> first by adding a transformation with the XmlAst writer. Please look at our existing templates for an example.
+
+> Important: please open an issue for every broken piece of functionality. We have taken the utmost care not to
+> introduce bugs but due to large change some might occur.
+
+In the following list we have tried to exhaustively document the list of changes and their impact. Due to the size of
+the refactoring it is nigh impossible to make a 100% accurate list. Please contact us if you have questions; the website
+https://www.phpdoc.org describes various methods.
+
+```
+ADDED Twig Writer
+ADDED Xml Writer
+ADDED Router component to provide locations for various Url Schemes
+ADDED Responsive-twig template
+ADDED More tests
+ADDED Statistics are being logged to a log file (more will be logged there in the future)
+ADDED Compiler component that adds the ability to inject compiler passes at various points
+ADDED Linker to create object links between the various elements
+ADDED Indexes containing pre-generated lists to make the generation of templates faster
+ADDED More unit tests
+FIXED Define transformations in phpdoc.xml
+FIXED Define multiple templates in phpdoc.xml
+FIXED Performance is improved by re-approaching inheritance from a different angle
+FIXED Various small and unnamed bugs
+CHANGED Moved Inheritance from a Behaviour into the Descriptors
+CHANGED Temporarily removed deprecated report
+CHANGED Target option of parser now only accepts a folder
+CHANGED Various performance improvements
+CHANGED Doctrine Support is moved to its own Service Provider
+CHANGED Rewired dependencies and injection scheme to make better of the DIC
+CHANGED Object graph is written to various cache folders in a directory named 'build' by default
+CHANGED Cache is generated by Zend\Cache
+CHANGED Commands have been moved to their respective component
+CHANGED The Parser has been promoted to Service Provider
+CHANGED The Transformer has been promoted to Service Provider
+CHANGED Parse command has been prepared for internationalization
+CHANGED Template configuration is parsed using JmsSerializer
+CHANGED All logging is now PSR-3 compliant
+CHANGED Removed documentation for components that are still in flux
+CHANGED Updated documentation for existing functionality
+DEPRECATED Behaviours are only executed for the XmlAst writer
+BC-BREAK Moved Validators to the Descriptor Builder and refactored for internationalization
+BC-BREAK Parser generates an object graph and not XML (structure.xml, use XmlAst writer now for XML output)
+BC-BREAK Replaced plugin system with Service Providers
+```
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000000..f9b502aa20
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,94 @@
+Contributing to phpDocumentor
+=============================
+
+Introduction
+------------
+
+phpDocumentor aims to be a high quality Documentation Generation Application (DGA) but at the same time wants to give
+contributors freedom when submitting fixes or improvements.
+
+As such we want to *encourage* but not obligate you, the contributor, to follow these guidelines. The only exception to
+this are the guidelines regarding *GitHub Usage & Branching* to prevent `merge-hell`.
+
+Having said that: we really appreciate it when you apply the guidelines in part or wholly as that will save us time
+which, in turn, we can spend on bugfixes and new features.
+
+GitHub Usage & Branching
+------------------------
+
+Once you decide you want to contribute to phpDocumentor (which we really appreciate!) you can fork the project from
+https://github.com/phpDocumentor/phpDocumentor.
+
+Currently phpDocumentor version 3.0 is developed in our `master` branch. Large parts of the code in there will be
+rewritten or removed. If you want to contribute to phpDocumentor v3.0, create your feature branch from `master`. If you
+want to fix a bug in the current released version, base your branch on `2.9`. Please *always* create a new branch for
+each feature/bugfix you want to contribute.
+
+> If you create your branch from the wrong base branch we won't be able to merge your feature in to the right version.
+> Which means that either your feature will only be released with v3.0 or bugfix will never be in a new 2.* release.
+
+To get more information about the usage of Git, please refer to the [Pro Git book][PROGIT] written
+by Scott Chacon and/or [this help page of GitHub][GITHUB_HELP_PR].
+
+Setting Up Your Development Environment
+---------------------------------------
+
+You need the following:
+
+- Git
+- Composer (https://getcomposer.org)
+- Phive (https://phar.io)
+- Docker (https://docker.com), including Docker Compose
+
+Once you cloned the repository you should be able to run the following commands to get started
+
+ $ composer install
+ $ phive install
+ $ docker-compose run phpdoc
+
+To run the tests you can use the following command:
+
+ $ make test
+
+Before issuing a pull request it is also recommended to run the following commands:
+
+ $ make phpcs
+ $ make phpstan
+
+These command will check the quality of your code; this is also done by Travis during the pull request process but
+performing these checks yourself will help getting your pull request merged.
+
+Coding Standards
+----------------
+
+phpDocumentor uses the [PSR-2 Coding Standard][PSR2] as defined by the
+[PHP Framework Interoperability Group (PHP-FIG)][PHP_FIG].
+
+It is recommended to check your code using phpCodeSniffer using the *PSR2* standard using the following command:
+
+ $ make phpcs
+
+Unit testing
+------------
+
+phpDocumentor aims to be have at least 90% Code Coverage using unit tests using PHPUnit. It is appreciated to include
+unit tests in your pull requests as they also help understand what the contributed code exactly does.
+
+In order to run the unit tests you can execute the following command from your phpDocumentor folder:
+
+ $ make test
+
+### Running tests without Docker
+
+To make sure that the application is tested in a controlled way we use Docker. However, sometimes it is not possible to
+use Docker on a development machine. In these cases it is recommended to run the following commands:
+
+ $ make install-phive
+ $ ./tools/phive.phar install --copy --trust-gpg-keys 4AA394086372C20A,D2CCAC42F6295E7D,E82B2FB314E9906E,8E730BA25823D8B5,D0254321FB74703A --force-accept-unsigned
+
+And after this you can run phpunit using `./tools/phpunit`.
+
+[PROGIT]: https://git-scm.com/book
+[GITHUB_HELP_PR]: https://help.github.com/articles/using-pull-requests
+[PSR2]: https://www.php-fig.org/psr/psr-2/
+[PHP_FIG]: https://www.php-fig.org/
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000..77e3f8d6c3
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,48 @@
+FROM php:8.4-trixie AS base
+
+# /usr/share/man/man1 needs to be created before installing openjdk-11-jre lest it will fail
+# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199#23
+RUN mkdir -p /usr/share/man/man1 \
+ && apt-get update \
+ && apt-get install --no-install-recommends -yq libicu-dev libicu76 zlib1g-dev ca-certificates-java gpg
+
+RUN apt-get -yq install openjdk-21-jre-headless \
+ && rm -rf /var/lib/apt/lists/* /usr/share/man/man1 \
+ && docker-php-ext-install -j$(nproc) intl
+
+FROM composer:2 AS build
+
+COPY . /opt/phpdoc
+WORKDIR /opt/phpdoc
+RUN /usr/bin/composer install --prefer-dist -o --no-interaction --no-dev
+
+FROM base AS phpdoc_base
+
+WORKDIR /data
+VOLUME /data
+
+ENV PHPDOC_ENV=prod
+ENV PATH="/opt/phpdoc/bin:${PATH}"
+
+COPY --from=build /opt/phpdoc /opt/phpdoc
+RUN echo "memory_limit=-1" >> /usr/local/etc/php/conf.d/phpdoc.ini
+
+ENTRYPOINT ["/opt/phpdoc/bin/phpdoc"]
+
+COPY --from=composer /usr/bin/composer /usr/bin/composer
+
+FROM phpdoc_base AS prod
+
+RUN echo "error_reporting=E_ALL & ~E_DEPRECATED" >> /usr/local/etc/php/conf.d/phpdoc.ini
+
+FROM prod AS dev
+
+RUN apt-get update \
+ && apt-get install -yq git \
+ && useradd -m -s /bin/bash phpdoc
+
+FROM dev AS dev-pcov
+
+COPY --from=ghcr.io/php/pie:bin /pie /usr/bin/pie
+
+RUN pie install pecl/pcov
diff --git a/LICENSE b/LICENSE
index 615e4cf23b..792e4040f2 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,3 +1,5 @@
+The MIT License (MIT)
+
Copyright (c) 2010 Mike van Riel
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -16,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
+THE SOFTWARE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000..b67ff97b60
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,172 @@
+ARGS ?=
+
+.USER = CURRENT_UID=$(shell id -u):$(shell id -g)
+.DOCKER_COMPOSE_RUN = ${.USER} docker compose run --rm
+.PHP = docker run --user=$(shell id -u):$(shell id -g) -it --rm -v${CURDIR}:/data -w /data php:8.1
+
+CYPRESS_VERSION = 15.6.0
+
+.PHONY: help
+help:
+ @echo " _ ____ _ ";
+ @echo " _ __ | |__ _ __ | _ \ ___ ___ _ _ _ __ ___ ___ _ __ | |_ ___ _ __ ";
+ @echo "| '_ \| '_ \| '_ \| | | |/ _ \ / __| | | | '_ ' _ \ / _ \ '_ \| __/ _ \| '__|";
+ @echo "| |_) | | | | |_) | |_| | (_) | (__| |_| | | | | | | __/ | | | || (_) | | ";
+ @echo "| .__/|_| |_| .__/|____/ \___/ \___|\__,_|_| |_| |_|\___|_| |_|\__\___/|_| ";
+ @echo "|_| |_| ";
+ @echo "";
+ @echo "Available commands:";
+ @echo "";
+ @echo "== Setup ==";
+ @echo "setup - Installs phive and all phar-based dependencies";
+ @echo "install-phive - Installs phive, the phar.io package manager.";
+ @echo "pull-containers - pulls all development docker containers";
+ @echo "composer - Runs composer install from within the phpdoc container";
+ @echo "shell - starts the phpDocumentor docker container and opens a terminal";
+ @echo "";
+ @echo "== Automated testing ==";
+ @echo "pre-commit-test - runs all checks needed before committing";
+ @echo "";
+ @echo "test - runs unit tests and checks the code coverage percentage";
+ @echo "unit-test - runs unit tests";
+ @echo "integration-test - runs integration tests";
+ @echo "functional-test - runs functional tests";
+ @echo "composer-require-checker - checks for any missing composer packages";
+ @echo "";
+ @echo "e2e-test - runs phpDocumentor and verifies the output using Cypress";
+ @echo "build/default/index.html - builds the 'default' template's example project";
+ @echo "build/clean/index.html - builds the 'clean' template's example project";
+ @echo "cypress/integration/*.spec.js - runs e2e tests on a specific specification";
+ @echo "";
+ @echo "== Code Quality ==";
+ @echo "lint - performs all linting on the code";
+ @echo "phpcs - performs code-style checks";
+ @echo "phpcbf - fixes most code-style issues";
+ @echo "phpstan - performs static analysis on the codebase using phpstan";
+ @echo "";
+ @echo "== Release tools ==";
+ @echo "composer-mirror - Runs a production-version of composer install for, i.e., the phar building";
+ @echo "composer-pre-release - Update guides for next release";
+ @echo "phar - Creates the PHAR file";
+ @echo "docs - Creates local docs docker image";
+ @echo "";
+
+.PHONY: phar
+phar: composer-mirror
+ composer remove --dev phpstan/extension-installer; \
+ php -d phar.readonly=false tools/box compile --config=box.json
+
+tools/phive.phar:
+ wget -O tools/phive.phar https://phar.io/releases/phive.phar; \
+ wget -O tools/phive.phar.asc https://phar.io/releases/phive.phar.asc; \
+ gpg --keyserver pool.sks-keyservers.net --recv-keys 0x9D8A98B29B2D5D79; \
+ gpg --verify tools/phive.phar.asc tools/phive.phar; \
+ chmod +x tools/phive.phar
+
+.PHONY: install-phive
+install-phive: tools/phive.phar
+
+.PHONY: setup
+setup: install-phive
+ docker-compose run --rm --entrypoint=/usr/local/bin/php phpdoc tools/phive.phar install --copy --trust-gpg-keys 4AA394086372C20A,D2CCAC42F6295E7D,E82B2FB314E9906E,8E730BA25823D8B5,D0254321FB74703A,8A03EA3B385DBAA1 --force-accept-unsigned
+
+.PHONY: pull-containers
+pull-containers:
+ docker pull phpdoc/phpcs-ga
+ docker pull php:8.1
+ docker pull node
+
+.PHONY: phpcs
+phpcs:
+ ${.PHP} ./bin/phpcs -s ${ARGS}
+
+.PHONY: phpcbf
+phpcbf:
+ ${.PHP} ./bin/phpcbf ${ARGS}
+
+.PHONY: phpstan
+phpstan:
+ ${.PHP} ./bin/phpstan analyse src tests --memory-limit=1G incubator/*/src incubator/*/tests --configuration phpstan.neon ${ARGS}
+
+.PHONY: lint
+lint: phpcs
+
+.PHONY: test
+test: unit-test
+ ${.PHP} -f ./tests/coverage-checker.php 64
+
+.PHONY: unit-test
+unit-test: SUITE=--testsuite=unit
+
+.PHONY: integration-test
+integration-test: SUITE=--testsuite=integration --no-coverage
+
+.PHONY: functional-test
+functional-test: SUITE=--testsuite=functional --no-coverage
+
+unit-test integration-test functional-test:
+ ${.DOCKER_COMPOSE_RUN} --entrypoint=bin/phpunit phpdoc-pcov $(SUITE) $(ARGS)
+
+.PHONY: e2e-test
+e2e-test: node_modules/.bin/cypress build/default/index.html build/clean/index.html
+ docker run -it --rm -eCYPRESS_CACHE_FOLDER="/e2e/var/cache/.cypress" -v ${CURDIR}:/e2e -w /e2e cypress/included:${CYPRESS_VERSION}
+
+cypress/integration/default/%.spec.js: node_modules/.bin/cypress build/default/index.html .RUN_ALWAYS
+ docker run -it --rm -eCYPRESS_CACHE_FOLDER="/e2e/var/cache/.cypress" -v ${CURDIR}:/e2e -w /e2e cypress/included:${CYPRESS_VERSION} -s $@
+
+cypress/integration/clean/%.spec.js: node_modules/.bin/cypress build/clean/index.html .RUN_ALWAYS
+ docker run -it --rm -eCYPRESS_CACHE_FOLDER="/e2e/var/cache/.cypress" -v ${CURDIR}:/e2e -w /e2e cypress/included:${CYPRESS_VERSION} -s $@
+
+.PHONY: composer-require-checker
+composer-require-checker:
+ ${.DOCKER_COMPOSE_RUN} --entrypoint=./tools/composer-require-checker phpdoc check --config-file /opt/phpdoc/composer-require-config.json composer.json
+
+.PHONY: pre-commit-test
+pre-commit-test: test integration-test phpcs phpstan composer-require-checker
+
+.PHONY: composer
+composer:
+ docker run -it --rm -v${CURDIR}:/opt/project -w /opt/project composer:2 install
+
+.PHONY: composer-mirror
+composer-mirror:
+ rm -rf vendor/phpdocumentor/*
+ COMPOSER_MIRROR_PATH_REPOS=1 composer install --optimize-autoloader
+
+composer-guides-dev:
+ docker run -it --rm -v${CURDIR}:/opt/project -w /opt/project composer:2 require phpdocumentor/guides:dev-main@dev phpdocumentor/guides-graphs:dev-main@dev phpdocumentor/guides-markdown:dev-main@dev phpdocumentor/guides-restructured-text:dev-main@dev
+
+composer-pre-release:
+ docker run -it --rm -v${CURDIR}:/opt/project -w /opt/project composer:2 require phpdocumentor/guides phpdocumentor/guides-graphs phpdocumentor/guides-markdown phpdocumentor/guides-restructured-text
+
+
+.PHONY: shell
+shell:
+ ${.DOCKER_COMPOSE_RUN} --entrypoint=/bin/bash phpdoc
+
+node_modules/.bin/cypress:
+ docker run -it --rm -eCYPRESS_CACHE_FOLDER="/opt/phpdoc/var/cache/.cypress" -v ${CURDIR}:/opt/phpdoc -w /opt/phpdoc node npm install
+
+build/default/index.html: data/examples/MariosPizzeria/**/* data/templates/default/**/* .RUN_ALWAYS
+ ${.DOCKER_COMPOSE_RUN} phpdoc --config=data/examples/MariosPizzeria/phpdoc.xml --template=default --target=build/default --force
+
+build/clean/index.html: data/examples/MariosPizzeria/**/* data/templates/clean/**/* .RUN_ALWAYS
+ ${.DOCKER_COMPOSE_RUN} phpdoc --config=data/examples/MariosPizzeria/phpdoc.xml --template=clean --target=build/clean --force
+
+.PHONY: docs
+docs:
+ ${.DOCKER_COMPOSE_RUN} phpdoc --force -vvv
+
+.PHONY: build-website
+build-website: demo docs
+ cp -p -r ./data/website/* ./build/website
+ cp -p ./data/xsd/phpdoc.xsd ./build/website/docs/
+ docker build -t phpdocumentor/phpdocumentor/phpdoc.org:local ./build/website
+
+.PHONY: demo
+demo:
+ ${.DOCKER_COMPOSE_RUN} phpdoc --template=default -t ./build/website/demo/default
+ ${.DOCKER_COMPOSE_RUN} phpdoc --template=clean -t ./build/website/demo/clean
+
+.PHONY: .RUN_ALWAYS
+.RUN_ALWAYS:
diff --git a/README.md b/README.md
index 89d6779b3c..a0d27fdcc7 100644
--- a/README.md
+++ b/README.md
@@ -1,101 +1,126 @@
-README
-======
+[](https://opensource.org/licenses/MIT)
+
+
+
+[](https://packagist.org/packages/phpDocumentor/phpDocumentor)
+
+
+phpDocumentor
+=============
What is phpDocumentor?
-----------------
+----------------------
-phpDocumentor an application that is capable of analyzing your PHP source code and
-DocBlock comments to generate a complete set of API Documentation.
+phpDocumentor stands as the de-facto documentation tool for PHP projects, offering a robust solution for generating
+comprehensive documentation effortlessly. By analyzing your PHP source code and DocBlock comments, phpDocumentor
+generates a complete set of API documentation, making it an indispensable tool for developers striving
+for clear and well-documented codebases.
-Inspired by phpDocumentor 1 and JavaDoc it continues to innovate and is up to date
-with the latest technologies and PHP language features.
+Beyond its prowess in API documentation, phpDocumentor goes further by providing additional features.
+It is equipped with the ability to create UML diagrams, making it a versatile tool for visualizing code structure.
+Additionally, phpDocumentor offers a full-featured markup language parser, supporting both RestructuredText
+and Markdown syntax. This flexibility allows you to document your project using the markup language that best suits
+your preferences.
-Features
---------
+A notable feature of phpDocumentor is its capability to include parts of your API documentation directly into your
+RestructuredText documentation. This integration ensures that your documentation and code remain in sync, saving you
+time and effort in maintaining accurate and up-to-date project documentation.
-phpDocumentor sports the following:
+Inspired by its predecessors, phpDocumentor 1 and JavaDoc, phpDocumentor continues to innovate, staying up-to-date with
+the latest technologies and PHP language features. This commitment ensures that developers have access to the best
+possible documentation experience, aligning with modern development practices.
-* *PHP 5.3 compatible*, full support for Namespaces, Closures and more is provided.
-* *Shows any tag*, some tags add additional functionality to phpDocumentor (such as @link).
-* *Processing speed*, Zend Framework experienced an 80% reduction in processing time compared to phpDocumentor 1.
-* *Low memory usage*, peak memory usage for small projects is less than 20MB, medium projects 40MB and large frameworks 100MB.
-* *Incremental parsing*, if you kept the Structure file from a previous run you get an additional performance boost of up
- to 80% on top of the mentioned processing speed above.
-* *Easy template building*, if you want to make a branding you only have to call 1 task and edit 3 files.
-* *Command-line compatibility with phpDocumentor 1*, phpDocumentor 2 is an application in its own right but the
- basic phpDocumentor 1 arguments, such as --directory, --file and --target, have been adopted.
-* *Two-step process*, phpDocumentor first generates a XML file with your application structure before creating the output.
- If you'd like you can use that to power your own tools or formatters!
+In this guide, we will explore the various features of phpDocumentor, from its core functionality in generating
+API documentation to its advanced capabilities in parsing markup languages. Whether you're a beginner or an
+experienced developer, phpDocumentor is your ally in creating well-documented, maintainable,
+and understandable PHP projects.
-Requirements
-------------
+phpDocumentor v3 (Stable)
+------------------------------------
+
+v3 is the latest stable release.
+
+Documentation
+-------------
-phpDocumentor requires the following:
+For more detailed information, you can check our online documentation at https://docs.phpdoc.org/.
-* PHP 5.3.3 or higher
-* iconv/ext, http://php.net/manual/en/book.iconv.php (is enabled by default since PHP 5.0.0)
-* The XSL extension, http://www.php.net/manual/en/book.xsl.php
-* Graphviz (optional, used for generating Class diagrams)
-* PEAR (optional, used for generating Class Diagrams or installing via PEAR)
+Features
+--------
-**Note:**
-If you do not want to install the PEAR or Graphviz dependency you are encouraged to generate your own template and make sure that it does not contain anything related to `Graph`.
-An easier solution might be to edit `data/templates/responsive/template.xml` file and remove every line containing the word `Graph` but this will be undone with every upgrade of phpDocumentor.
+phpDocumentor supports the following:
-Please see the documentation about creating your own templates for more information.
+* *PHP 7.0+ compatible*, full support for Namespaces, Closures and more are provided.
+* *Docblock over types*, docblocks can be more explicit about types not all formats are supported by native php.
+* *Shows any tag*, some tags add additional functionality to phpDocumentor (such as @link).
+* *Low memory usage*, peak memory usage for small projects is less than 20MB, medium projects 40MB, and large frameworks 100MB.
+* *Incremental parsing*, if you kept the Structure file from a previous run, you get an additional performance boost of up
+ to 80% on top of the mentioned processing speed increase above.
+* *Easy template building*, if you want to make a branding you only have to call 1 task and edit 3 files.
+* *Two-step process*, phpDocumentor first generates a cache with your application structure before creating the output.
+ If you'd like you can use that to power your own tools or formatters!
+* *Generics support*, with more static analysis in php types have become more complex. phpDocumentor understand these types.
+ And will render them as first class types.
Installation
------------
-There are 2 ways to install phpDocumentor:
+PhpDocumentor requires PHP 8.1 or higher to run.
+However, code of earlier PHP versions can be analyzed.
+
+All templates provided with phpDocumentor have support for Class diagrams based on the read code base.
+This will require the application [PlantUml] to be installed on the machine running phpDocumentor.
+Rendering the class diagrams using [PlantUml] is optional, and warnings about missing [PlantUml] can be ignored.
+However, your documentation will contain some dead links in this case.
+Class diagram will be created with option `--setting=graphs.enabled=true`.
-1. Via PEAR (recommended)
-2. Manual installation using the installer.
+There are 4 ways to install phpDocumentor:
-_*Please note* that it is required that the installation path of phpDocumentor does not
-contain spaces. This is a requirement imposed by an external library (libxml)_
+1. Using phive (recommended)
+2. Using the PHAR (manual install)
+3. Via [Docker]
+4. Via [Composer]
-### PEAR (recommended)
+### Using Phive
-1. phpDocumentor is hosted on its own PEAR channel which can be discovered using the following command:
+`$ phive install phpDocumentor --trust-gpg-keys 6DA3ACC4991FFAE5`
- $ pear channel-discover pear.phpdoc.org
+For more information about phive have a look at their [website](https://phar.io/).
+Now you have phpDocumentor installed, it can be executed like this:
-2. After that it is a simple matter of invoking PEAR to install the application
+`php tools/phpDocumentor`
- $ pear install phpdoc/phpDocumentor-alpha
+### Using the PHAR
-### Manual Installation
+1. Download the phar file from https://github.com/phpDocumentor/phpDocumentor/releases
+2. You can execute the phar like this: `php phpDocumentor.phar`
-1. Download the php installer from:
+### Via Docker
- https://raw.github.com/phpDocumentor/phpDocumentor2/develop/installer.php
+1. `$ docker pull phpdoc/phpdoc`
+2. `$ docker run --rm -v $(pwd):/data phpdoc/phpdoc`
- to the intended location. We will refer to this as ``.
+### Via Composer (not recommended)
-2. Run the installer:
+But wait? What about composer?
- `php installer.php`
+Ah, you discovered our secret. There is a phpdocumentor composer package that you can use to install phpDocumentor.
-3. Set up your binaries to use phpDocumentor from any location:
+However: phpDocumentor is a complex application, and its libraries are used in countless other libraries and applications (2 of our libraries have more than 150 million downloads each); and this means that the chances for a conflict between one of our dependencies and yours is high. And when I say high, it is really high.
- - __For Linux or Mac OSX__: create a symlink from `/bin/phpdoc.php`
- to your bin folder (usually /usr/bin) named `phpdoc`.
- - __For Windows__: Add `/bin` to your PATH so that you can invoke
- `phpdoc.bat` from any location.
+So, because of the above: we do not endorse nor actively support installing phpDocumentor using Composer.
How to use phpDocumentor?
--------------------
+-------------------------
The easiest way to run phpDocumentor is by running the following command:
$ phpdoc run -d -t
-This command will parse the source code provided using the `-d` argument and
-output it to the folder indicated by the `-t` argument.
+This command will parse the source code provided using the `-d` argument and output it to the folder indicated by the `-t` argument.
phpDocumentor supports a whole range of options to configure the output of your documentation.
-You can execute the following command, or check our website, for a more detailed listing of available command line options.
+You can execute the following command, or check our website, for a more detailed listing of available command-line options.
$ phpdoc run -h
@@ -105,27 +130,27 @@ Configuration file(s)
phpDocumentor also supports the use of configuration files (named phpdoc.xml or phpdoc.dist.xml by default).
Please consult the documentation to see the format and supported options.
-Documentation
--------------
-
-For more detailed information you can check our online documentation at [http://phpdoc.org/docs/](http://phpdoc.org/docs/).
+### Nightly builds
-Known issues
-------------
-
-1. Search does not work / is not available when accessing the documentation locally from Google Chrome.
- Google Chrome blocks access to local files (and thus the search index) using Javascript when working
- with local files (file://); it is not possible for us to fix this.
-2. phpDocumentor must be installed in a path without spaces due to restrictions in libxml. The XSL transformation
- will throw all kinds of odd warnings if the path contains spaces.
+PhpDocumentor doesn't have nightly releases.
+However, during each pipeline a phar artifact is built.
+If you want to test the bleeding edge version of phpDocumentor, have a look in the [actions] section of this repository.
+Each successful QA workflow has an Artifacts section at the bottom with the phar artifact built.
Contact
-------
-To come in contact is actually dead simple and can be done in a variety of ways.
+Reaching out to us is easy, and can be done with:
+
+* Twitter: [@phpDocumentor]
+* Website: https://www.phpdoc.org
+* GitHub: https://www.github.com/phpDocumentor/phpDocumentor
+* E-mail: [mike@phpdoc.org]
-* Twitter: [@phpDocumentor](http://twitter.com/phpdocumentor)
-* Website: [http://www.phpdoc.org](http://www.phpdoc.org)
-* IRC: Freenode, #phpdocumentor
-* Github: [http://www.github.com/phpdocumentor/phpdocumentor2](http://www.github.com/phpdocumentor/phpdocumentor2)
-* E-mail: [mike.vanriel@naenius.com](mailto:mike.vanriel@naenius.com)
+[@phpDocumentor]: https://twitter.com/phpDocumentor
+[v2 branch]: https://github.com/phpDocumentor/phpDocumentor/tree/2.9
+[Graphviz]: https://www.graphviz.org/download/
+[actions]: https://github.com/phpDocumentor/phpDocumentor/actions?query=workflow%3A%22Qa+workflow%22+is%3Asuccess
+[Docker]: https://hub.docker.com/r/phpdoc/phpdoc/
+[Composer]: https://getcomposer.org/
+[mike@phpdoc.org]: mailto:mike@phpdoc.org
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000000..a5c4c76339
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+3.9.0
diff --git a/action.yml b/action.yml
new file mode 100644
index 0000000000..ffb1b3d9e5
--- /dev/null
+++ b/action.yml
@@ -0,0 +1,18 @@
+ name: 'phpDocumentor'
+ description: 'Builds a static webpage from your docblocks'
+ inputs:
+ template:
+ description: 'template to use'
+ required: false
+ default: 'default'
+ config:
+ description: 'path to config'
+ required: false
+ target:
+ description: 'target path'
+ required: false
+
+ runs:
+ using: 'docker'
+ image: 'Dockerfile'
+ entrypoint: '/opt/phpdoc/bin/githubaction'
diff --git a/bin/githubaction b/bin/githubaction
new file mode 100755
index 0000000000..23e4abe89b
--- /dev/null
+++ b/bin/githubaction
@@ -0,0 +1,16 @@
+#!/usr/bin/env php
+ getenv('INPUT_TEMPLATE'),
+ 'config' => getenv('INPUT_CONFIG'),
+ 'target' => getenv('INPUT_TARGET'),
+]);
+
+foreach ($arguments as $flag => $value) {
+ $_SERVER['argv'][] = sprintf('--%s=%s', $flag, $value);
+}
+
+require_once __DIR__.'/phpdoc';
diff --git a/bin/parse.php b/bin/parse.php
deleted file mode 100755
index 4bbc1e511e..0000000000
--- a/bin/parse.php
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env php
-
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
-
-// if the file exists then this is not a PEAR install; otherwise pick it up
-// from the path
-if (file_exists(dirname(__FILE__) . '/phpdoc.php')) {
- passthru(
- 'php '.dirname(__FILE__).'/phpdoc.php project:parse '
- .implode(' ', array_slice($argv, 1))
- );
-} else {
- passthru('phpdoc project:parse '.implode(' ', array_slice($argv, 1)));
-}
diff --git a/bin/phpdoc b/bin/phpdoc
new file mode 100755
index 0000000000..de3718442e
--- /dev/null
+++ b/bin/phpdoc
@@ -0,0 +1,14 @@
+#!/usr/bin/env php
+run();
diff --git a/bin/phpdoc.bat b/bin/phpdoc.bat
index 6ac87e9e33..114ac41e8d 100644
--- a/bin/phpdoc.bat
+++ b/bin/phpdoc.bat
@@ -1,8 +1,9 @@
@echo off
if "%PHPBIN%" == "" set PHPBIN=php.exe
+if not exist "%PHP_PEAR_BIN_DIR%" set PHP_PEAR_BIN_DIR=%~dp0
if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH
GOTO RUN
:USE_PEAR_PATH
set PHPBIN=%PHP_PEAR_PHP_BIN%
:RUN
-"%PHPBIN%" "%PHP_PEAR_BIN_DIR%\phpdoc.php" %*
\ No newline at end of file
+"%PHPBIN%" "%PHP_PEAR_BIN_DIR%\phpdoc" %*
\ No newline at end of file
diff --git a/bin/phpdoc.php b/bin/phpdoc.php
index 47f5ddcfcc..7f23aa6222 100755
--- a/bin/phpdoc.php
+++ b/bin/phpdoc.php
@@ -5,40 +5,9 @@
*
* PHP Version 5.3
*
- * @author Mike van Riel
- * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
+ * @copyright 2010-2018 Mike van Riel / Naenius (http://www.naenius.com)
+ * @link https://phpdoc.org
*/
-// check whether xhprof is loaded
-$profile = (bool)(getenv('PHPDOC_PROFILE') === 'on');
-if ($profile && extension_loaded('xhprof')) {
- xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
-}
-
-// determine base include folder, if @php_dir@ contains @php_dir then
-// we did not install via PEAR
-$bootstrap_folder = (strpos('@php_dir@', '@php_dir') === 0)
- ? __DIR__ . '/../src'
- : '@php_dir@/phpDocumentor/src';
-
-require_once $bootstrap_folder . '/phpDocumentor/Application.php';
-$app = new phpDocumentor\Application();
-$app->run();
-
-if (false !== $profile) {
- include_once 'XHProf/utils/xhprof_lib.php';
- include_once 'XHProf/utils/xhprof_runs.php';
-
- $xhprof_data = xhprof_disable();
- if ($xhprof_data !== null) {
- $xhprof_runs = new XHProfRuns_Default();
- $run_id = $xhprof_runs->save_run($xhprof_data, 'phpdoc');
- $profiler_url = sprintf('index.php?run=%s&source=%s', $run_id, 'phpdoc');
- echo 'Profile can be found at: ' . $profiler_url . PHP_EOL;
- }
-}
-
-// disable E_STRICT reporting on the end to prevent PEAR from throwing Strict warnings.
-error_reporting(error_reporting() & ~E_STRICT);
\ No newline at end of file
+trigger_error('phpDocumentor2 should be run from the phpdoc file, not phpdoc.php', E_USER_DEPRECATED);
+require_once __DIR__.'/phpdoc';
diff --git a/bin/transform.php b/bin/transform.php
deleted file mode 100755
index 16f987e4e8..0000000000
--- a/bin/transform.php
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env php
-
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
-
-// if the file exists then this is not a PEAR install; otherwise pick it up
-// from the path
-if (file_exists(dirname(__FILE__) . '/phpdoc.php')) {
- passthru(
- 'php '.dirname(__FILE__) . '/phpdoc.php project:transform '
- . implode(' ', array_slice($argv, 1))
- );
-} else {
- passthru('phpdoc project:transform ' . implode(' ', array_slice($argv, 1)));
-}
\ No newline at end of file
diff --git a/bin/utils/package.php b/bin/utils/package.php
deleted file mode 100755
index 4983e76047..0000000000
--- a/bin/utils/package.php
+++ /dev/null
@@ -1,160 +0,0 @@
-
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
-
-error_reporting(E_ALL & ~E_STRICT & ~E_DEPRECATED);
-require_once('PEAR/PackageFileManager2.php');
-PEAR::setErrorHandling(PEAR_ERROR_DIE);
-
-/**
- * Creates a packager object with all basic options set.
- *
- * @param string $original_file Path of the original package.xml.
- * @param string[] $options Set of options to merge in.
- *
- * @return PEAR_Error|PEAR_PackageFileManager2
- */
-function createPackager($original_file, $options = array())
-{
- // merge the options with these defaults.
- $options = array_merge(array(
- 'packagefile' => 'package.xml',
- 'filelistgenerator' => 'file',
- 'simpleoutput' => true,
- 'baseinstalldir' => '/phpDocumentor',
- 'packagedirectory' => dirname(__FILE__).'/../../',
- 'clearcontents' => true,
- 'ignore' => array(
- 'build.properties',
- 'build.xml',
- 'build/*',
- 'data/output/*',
- 'data/log/*',
- 'bin/utils/*',
- 'src/XHProf/*', // Profiling package
- ),
- 'exceptions' => array(
- 'bin/phpdoc.php' => 'script',
- 'bin/phpdoc.bat' => 'script',
- 'phpdoc.dist.xml' => 'php',
- 'LICENSE' => 'php',
- 'phpunit.xml.dist' => 'php',
- 'README' => 'php',
- ),
- 'installexceptions' => array(
- 'bin/phpdoc.php' => '/',
- 'bin/phpdoc.bat' => '/'
- ),
- 'dir_roles' => array(
- 'bin' => 'php',
- 'docs' => 'php',
- 'data' => 'php',
- 'tests' => 'php',
- 'src' => 'php',
- ),
- ), $options);
-
- $packagexml = PEAR_PackageFileManager2::importOptions($original_file, $options);
- $packagexml->setPackageType('php');
-
- $packagexml->setPackage('phpDocumentor');
- $packagexml->setSummary(
- 'PHP 5.3 compatible API Documentation generator aimed at projects of '
- .'all sizes and Continuous Integration'
- );
- $packagexml->setDescription(
-<<setChannel('pear.phpdoc.org');
- $packagexml->setNotes(
- 'Please see the CHANGELOG in the root of the application for the '
- .'latest changes'
- );
-
- $packagexml->setPhpDep('5.3.0');
- $packagexml->setPearinstallerDep('1.4.0');
- $packagexml->addPackageDepWithChannel(
- 'required', 'PEAR', 'pear.php.net', '1.4.0'
- );
- $packagexml->addPackageDepWithChannel(
- 'optional', 'PEAR_PackageFileManager2', 'pear.php.net', '1.0.2'
- );
-
- $packagexml->addReplacement(
- 'bin/phpdoc.php', 'pear-config', '/usr/bin/env php', 'php_bin'
- );
- $packagexml->addGlobalReplacement('pear-config', '@php_bin@', 'php_bin');
- $packagexml->addReplacement(
- 'bin/phpdoc.php', 'pear-config', '@php_dir@', 'php_dir'
- );
-
- $packagexml->addMaintainer(
- 'lead', 'mvriel', 'Mike van Riel', 'mike.vanriel@naenius.com'
- );
- $packagexml->addMaintainer('lead', 'ashnazg', 'Chuck Burgess', '');
- $packagexml->setLicense(
- 'MIT', 'http://www.opensource.org/licenses/mit-license.html'
- );
-
- // Add this as a release, and generate XML content
- $packagexml->addRelease();
- $packagexml->setOSInstallCondition('windows');
- $packagexml->addInstallAs('bin/phpdoc.bat', 'phpdoc.bat');
- $packagexml->addInstallAs('bin/phpdoc.php', 'phpdoc.php');
-
- $packagexml->addRelease();
- $packagexml->addInstallAs('bin/phpdoc.php', 'phpdoc');
- $packagexml->addIgnoreToRelease('bin/phpdoc.bat');
-
- return $packagexml;
-}
-
-
-echo 'phpDocumentor PEAR Packager v1.0'.PHP_EOL;
-
-if ($argc < 3) {
- echo <<setAPIVersion($argv[1]);
-$packager->setReleaseVersion($argv[1]);
-$packager->setReleaseStability($argv[2]);
-$packager->setAPIStability($argv[2]);
-
-$packager->generateContents();
-if (isset($argv[3]) && ($argv[3] == 'make')) {
- $packager->writePackageFile();
-} else {
- $packager->debugPackageFile();
-}
diff --git a/bin/yaml-lint b/bin/yaml-lint
new file mode 100755
index 0000000000..06de88a003
--- /dev/null
+++ b/bin/yaml-lint
@@ -0,0 +1,119 @@
+#!/usr/bin/env php
+realpath = realpath($opened_path) ?: $opened_path;
+ $opened_path = $this->realpath;
+ $this->handle = fopen($this->realpath, $mode);
+ $this->position = 0;
+
+ return (bool) $this->handle;
+ }
+
+ public function stream_read($count)
+ {
+ $data = fread($this->handle, $count);
+
+ if ($this->position === 0) {
+ $data = preg_replace('{^#!.*\r?\n}', '', $data);
+ }
+
+ $this->position += strlen($data);
+
+ return $data;
+ }
+
+ public function stream_cast($castAs)
+ {
+ return $this->handle;
+ }
+
+ public function stream_close()
+ {
+ fclose($this->handle);
+ }
+
+ public function stream_lock($operation)
+ {
+ return $operation ? flock($this->handle, $operation) : true;
+ }
+
+ public function stream_seek($offset, $whence)
+ {
+ if (0 === fseek($this->handle, $offset, $whence)) {
+ $this->position = ftell($this->handle);
+ return true;
+ }
+
+ return false;
+ }
+
+ public function stream_tell()
+ {
+ return $this->position;
+ }
+
+ public function stream_eof()
+ {
+ return feof($this->handle);
+ }
+
+ public function stream_stat()
+ {
+ return array();
+ }
+
+ public function stream_set_option($option, $arg1, $arg2)
+ {
+ return true;
+ }
+
+ public function url_stat($path, $flags)
+ {
+ $path = substr($path, 17);
+ if (file_exists($path)) {
+ return stat($path);
+ }
+
+ return false;
+ }
+ }
+ }
+
+ if (
+ (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+ || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+ ) {
+ return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/symfony/yaml/Resources/bin/yaml-lint');
+ }
+}
+
+return include __DIR__ . '/..'.'/vendor/symfony/yaml/Resources/bin/yaml-lint';
diff --git a/box.json b/box.json
new file mode 100644
index 0000000000..678fa110c0
--- /dev/null
+++ b/box.json
@@ -0,0 +1,31 @@
+{
+ "main": "bin/phpdoc",
+ "stub": "box/stub.php",
+ "output": "build/phpDocumentor.phar",
+ "files": [
+ "VERSION",
+ "composer.json",
+ "src/extension-finder/Finder.php",
+ "vendor/twig/twig/src/TwigTest.php",
+ "vendor/twig/twig/src/Node/Expression/TestExpression.php",
+ "vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php",
+ "vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php",
+ "vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php",
+ "vendor/twig/twig/src/Node/Expression/Test/EvenTest.php",
+ "vendor/twig/twig/src/Node/Expression/Test/NullTest.php",
+ "vendor/twig/twig/src/Node/Expression/Test/OddTest.php",
+ "vendor/twig/twig/src/Node/Expression/Test/SameasTest.php",
+ "vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php"
+ ],
+ "directories-bin": [
+ "config",
+ "data"
+ ],
+ "git-version": "package_version",
+ "exclude-composer-files": false,
+ "compression": "GZ",
+ "compactors": [
+ "KevinGH\\Box\\Compactor\\Json",
+ "KevinGH\\Box\\Compactor\\Php"
+ ]
+}
diff --git a/box/stub.php b/box/stub.php
new file mode 100644
index 0000000000..fb4c8221e8
--- /dev/null
+++ b/box/stub.php
@@ -0,0 +1,15 @@
+#!/usr/bin/env php
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/coding-standard/PhpDocumentorStandard/Sniffs/Commenting/FileHeaderSniff.php b/coding-standard/PhpDocumentorStandard/Sniffs/Commenting/FileHeaderSniff.php
new file mode 100644
index 0000000000..e9ad1ab7f9
--- /dev/null
+++ b/coding-standard/PhpDocumentorStandard/Sniffs/Commenting/FileHeaderSniff.php
@@ -0,0 +1,181 @@
+ */
+ public function register(): array
+ {
+ return [T_OPEN_TAG];
+ }
+
+ /**
+ * @param File $phpcsFile The file being scanned.
+ * @param int $stackPtr The position of the current token in the stack.
+ */
+ public function process(File $phpcsFile, $stackPtr): int
+ {
+ $tokens = $phpcsFile->getTokens();
+
+ $insertAfter = $stackPtr;
+ $next = $this->skipWhitespaceAndComments($tokens, $stackPtr + 1, $insertAfter);
+
+ while ($next !== false && $tokens[$next]['code'] === T_DECLARE) {
+ $closer = $tokens[$next]['parenthesis_closer'] ?? null;
+ if ($closer === null) {
+ break;
+ }
+
+ $i = $closer + 1;
+ while (isset($tokens[$i]) && $tokens[$i]['code'] === T_WHITESPACE) {
+ $i++;
+ }
+
+ if (! isset($tokens[$i]) || $tokens[$i]['code'] !== T_SEMICOLON) {
+ break;
+ }
+
+ $insertAfter = $i;
+ $next = $this->skipWhitespaceAndComments($tokens, $i + 1, $insertAfter);
+ }
+
+ if ($next !== false && $tokens[$next]['code'] === T_DOC_COMMENT_OPEN_TAG) {
+ $end = $tokens[$next]['comment_closer'];
+ $actual = $phpcsFile->getTokensAsString($next, $end - $next + 1);
+ $normalized = preg_replace('/\r\n?/', "\n", $actual) ?? $actual;
+
+ if ($normalized === self::HEADER) {
+ return $phpcsFile->numTokens;
+ }
+
+ $afterDocBlock = $phpcsFile->findNext([T_WHITESPACE], $end + 1, null, true);
+
+ while (
+ $afterDocBlock !== false
+ && $tokens[$afterDocBlock]['code'] === T_ATTRIBUTE
+ && isset($tokens[$afterDocBlock]['attribute_closer'])
+ ) {
+ $afterDocBlock = $phpcsFile->findNext(
+ [T_WHITESPACE],
+ $tokens[$afterDocBlock]['attribute_closer'] + 1,
+ null,
+ true,
+ );
+ }
+
+ $isFileLevelByPosition = $afterDocBlock === false || in_array(
+ $tokens[$afterDocBlock]['code'],
+ [T_NAMESPACE, T_USE, T_DECLARE, T_DOC_COMMENT_OPEN_TAG],
+ true,
+ );
+
+ if ($isFileLevelByPosition) {
+ $fix = $phpcsFile->addFixableError(
+ 'Invalid file-level DocBlock; must match the canonical phpDocumentor header. '
+ . 'Any existing content in this DocBlock will be replaced when auto-fixing.',
+ $next,
+ self::INVALID,
+ );
+
+ if ($fix === true) {
+ $phpcsFile->fixer->beginChangeset();
+ for ($i = $next + 1; $i <= $end; $i++) {
+ $phpcsFile->fixer->replaceToken($i, '');
+ }
+
+ $phpcsFile->fixer->replaceToken($next, self::HEADER);
+ $phpcsFile->fixer->endChangeset();
+ }
+
+ return $phpcsFile->numTokens;
+ }
+ }
+
+ $fix = $phpcsFile->addFixableError(
+ 'Missing file-level DocBlock; expected the canonical phpDocumentor header.',
+ $insertAfter,
+ self::MISSING,
+ );
+
+ if ($fix === true) {
+ $phpcsFile->fixer->beginChangeset();
+ $phpcsFile->fixer->addContent($insertAfter, "\n\n" . self::HEADER);
+ $phpcsFile->fixer->endChangeset();
+ }
+
+ return $phpcsFile->numTokens;
+ }
+
+ /**
+ * Walks forward past whitespace and line/block comments, tracking the last
+ * comment as the preferred insertion anchor so the header lands below any
+ * stray leading comments rather than above them.
+ *
+ * @param array> $tokens
+ *
+ * @return int|false Index of the first non-skippable token, or false at end of file.
+ */
+ private function skipWhitespaceAndComments(array $tokens, int $start, int &$insertAfter)
+ {
+ $i = $start;
+ while (isset($tokens[$i])) {
+ $code = $tokens[$i]['code'];
+ if ($code === T_WHITESPACE) {
+ $i++;
+ continue;
+ }
+
+ if ($code === T_COMMENT) {
+ $insertAfter = $i;
+ $i++;
+ continue;
+ }
+
+ return $i;
+ }
+
+ return false;
+ }
+}
diff --git a/coding-standard/PhpDocumentorStandard/Tests/Commenting/FileHeaderSniffTest.php b/coding-standard/PhpDocumentorStandard/Tests/Commenting/FileHeaderSniffTest.php
new file mode 100644
index 0000000000..7ad695f4af
--- /dev/null
+++ b/coding-standard/PhpDocumentorStandard/Tests/Commenting/FileHeaderSniffTest.php
@@ -0,0 +1,179 @@
+}> */
+ public static function provideScenarios(): iterable
+ {
+ yield 'canonical header passes' => [
+ " [
+ " [
+ " [
+ " [
+ " [
+ " [
+ " [
+ " [
+ " [
+ preg_replace(
+ '/\n/',
+ "\r\n",
+ " $expectedCodes
+ *
+ * @dataProvider provideScenarios
+ */
+ public function testSniffReportsExpectedViolations(string $source, array $expectedCodes): void
+ {
+ $config = new Config([], false);
+ $config->standards = [self::STANDARD_DIR];
+ $config->sniffs = ['PhpDocumentorStandard.Commenting.FileHeader'];
+
+ $ruleset = new Ruleset($config);
+
+ $file = new DummyFile($source, $ruleset, $config);
+ $file->process();
+
+ $reported = [];
+ foreach ($file->getErrors() as $lineErrors) {
+ foreach ($lineErrors as $columnErrors) {
+ foreach ($columnErrors as $error) {
+ $parts = explode('.', $error['source']);
+ $reported[] = end($parts);
+ }
+ }
+ }
+
+ self::assertSame($expectedCodes, $reported, 'Unexpected set of reported error codes.');
+ }
+
+ public function testFixerProducesCanonicalHeaderForMissing(): void
+ {
+ $source = "fix($source));
+ }
+
+ public function testFixerReplacesInvalidHeader(): void
+ {
+ $source = "fix($source));
+ }
+
+ public function testFixerIsIdempotent(): void
+ {
+ $source = "fix($source);
+ $secondPass = $this->fix($firstPass);
+
+ self::assertSame($firstPass, $secondPass);
+ }
+
+ private function fix(string $source): string
+ {
+ $config = new Config([], false);
+ $config->standards = [self::STANDARD_DIR];
+ $config->sniffs = ['PhpDocumentorStandard.Commenting.FileHeader'];
+
+ $ruleset = new Ruleset($config);
+
+ $file = new DummyFile($source, $ruleset, $config);
+ $file->process();
+ $file->fixer->fixFile();
+
+ return $file->fixer->getContents();
+ }
+}
diff --git a/coding-standard/PhpDocumentorStandard/ruleset.xml b/coding-standard/PhpDocumentorStandard/ruleset.xml
new file mode 100644
index 0000000000..c8b99f637f
--- /dev/null
+++ b/coding-standard/PhpDocumentorStandard/ruleset.xml
@@ -0,0 +1,6 @@
+
+
+ Custom sniffs that supplement the shared rulesets used by phpDocumentor.
+
+
+
diff --git a/compile b/compile
deleted file mode 100755
index f8936e3fc7..0000000000
--- a/compile
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env php
-compile();
diff --git a/composer-require-config.json b/composer-require-config.json
new file mode 100644
index 0000000000..6df63f806c
--- /dev/null
+++ b/composer-require-config.json
@@ -0,0 +1,20 @@
+{
+ "symbol-whitelist" : [
+ "null", "true", "false",
+ "static", "self", "parent",
+ "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object",
+ "array_key_last", "str_starts_with",
+ "Composer\\Autoload\\ClassLoader",
+ "League\\Uri\\Exceptions\\SyntaxError",
+ "PackageVersions\\Versions"
+ ],
+ "php-core-extensions" : [
+ "Core",
+ "date",
+ "pcre",
+ "Phar",
+ "Reflection",
+ "SPL",
+ "standard"
+ ]
+}
diff --git a/composer.json b/composer.json
index 9d9527b6fe..8d2b5db86e 100644
--- a/composer.json
+++ b/composer.json
@@ -2,44 +2,156 @@
"name": "phpdocumentor/phpdocumentor",
"description": "Documentation Generator for PHP",
"keywords": ["documentation", "api", "dga", "application", "phpdoc"],
- "homepage": "http://www.phpdoc.org",
+ "homepage": "https://www.phpdoc.org",
"license": "MIT",
"autoload": {
- "psr-0":{
- "phpDocumentor": "src/"
+ "psr-4": {
+ "phpDocumentor\\": [ "src/phpDocumentor/" ]
}
},
- "repositories":[
- { "type":"composer", "url":"http://packages.zendframework.com"}
+ "autoload-dev": {
+ "psr-4": {
+ "phpDocumentor\\JsonPath\\" : [
+ "incubator/json-path/tests/unit/"
+ ],
+ "phpDocumentor\\": [
+ "tests/unit/phpDocumentor/",
+ "tests/integration/phpDocumentor/",
+ "tests/functional/phpDocumentor/"
+ ],
+ "phpDocumentor\\Architecture\\" : [
+ "tests/architecture/"
+ ],
+ "PhpDocumentorStandard\\": [
+ "coding-standard/PhpDocumentorStandard/"
+ ],
+ "TwigCsFixer\\": [
+ "tests/twig-cs-fixer/"
+ ],
+ "Prophecy\\" : [
+ "tests/unit/Prophecy"
+ ]
+ }
+ },
+ "repositories": [
+ {
+ "type": "path",
+ "url": "incubator/json-path",
+ "canonical": false
+ }
],
"require": {
- "php": ">=5.3.3",
- "ext-xsl": "*",
- "cilex/cilex": "1.*",
- "dflydev/markdown": "1.0.*",
- "nikic/php-parser": "dev-master",
- "symfony/event-dispatcher": "2.1.*",
- "zendframework/zend-stdlib": "2.*",
- "zendframework/zend-config": "2.*",
- "zendframework/zend-locale": "2.*",
- "zendframework/zend-servicemanager": "2.*",
- "zendframework/zend-translator": "2.*",
-
- "phpdocumentor/graphviz": "1.*",
- "phpdocumentor/fileset": "1.0.0-beta2",
- "phpdocumentor/reflection-docblock": "1.0.*",
-
- "phpdocumentor/plugin-twig":"1.*",
-
- "phpdocumentor/template-responsive": "1.*",
- "phpdocumentor/template-new-black": "1.*",
- "phpdocumentor/template-zend": "1.*"
+ "php": "^8.1",
+ "ext-ctype": "*",
+ "ext-hash": "*",
+ "ext-iconv": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "ext-xml": "*",
+ "jawira/plantuml": "^1.27",
+ "jean85/pretty-package-versions": "^1.5 || ^2.0.1",
+ "league/commonmark": "^2.2",
+ "league/flysystem": "^1.0",
+ "league/tactician": "^1.0",
+ "league/uri": "^7.5",
+ "league/uri-interfaces": "^7.5",
+ "monolog/monolog": "^3.0",
+ "nikic/php-parser": "^5.0",
+ "phar-io/manifest": "^2.0",
+ "phar-io/version": "^3.2",
+ "phpdocumentor/filesystem": "^1.10",
+ "phpdocumentor/flyfinder": "^1.0",
+ "phpdocumentor/graphviz": "^2.0",
+ "phpdocumentor/guides": "^1.10",
+ "phpdocumentor/guides-graphs": "^1.9",
+ "phpdocumentor/guides-markdown": "^1.10",
+ "phpdocumentor/guides-restructured-text": "^1.10",
+ "phpdocumentor/json-path": "^0.2.1",
+ "phpdocumentor/reflection": "^6.6.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpdocumentor/reflection-docblock": "^5.4",
+ "phpdocumentor/type-resolver": "^1.8",
+ "psr/cache": "^2.0|^3.0",
+ "psr/event-dispatcher": "^1.0",
+ "psr/log": "^2.0 || ^3.0",
+ "symfony/cache": "^6.0",
+ "symfony/config": "^6.0",
+ "symfony/console": "^6.0",
+ "symfony/contracts": "^3.3",
+ "symfony/dependency-injection": "^6.0",
+ "symfony/dom-crawler": "^6.0",
+ "symfony/dotenv": "^6.0",
+ "symfony/event-dispatcher": "^6.0",
+ "symfony/expression-language": "^6.0",
+ "symfony/filesystem": "^6.0",
+ "symfony/finder": "^6.0",
+ "symfony/polyfill-intl-idn": "^1.22",
+ "symfony/process": "^6.0",
+ "symfony/routing": "^6.0",
+ "symfony/stopwatch": "^6.0",
+ "symfony/string": "^6.4",
+ "symfony/yaml": "^6.0",
+ "twig/string-extra": "^3.17",
+ "twig/twig": "^3.17",
+ "webmozart/assert": "^1.3"
},
- "minimum-stability": "dev",
+ "minimum-stability": "stable",
"require-dev": {
- "behat/behat":">=2.4@stable"
+ "doctrine/coding-standard": "^13.0",
+ "fakerphp/faker": "^1.21",
+ "mikey179/vfsstream": "^1.2",
+ "mockery/mockery": "^1.0",
+ "phpat/phpat": "^0.10.20",
+ "phpspec/prophecy-phpunit": "^2.2",
+ "phpstan/extension-installer": "^1.3",
+ "phpstan/phpstan": "^1.10",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^10.0",
+ "rector/rector": "^1.2.5",
+ "symfony/var-dumper": "^6.0",
+ "vincentlanglet/twig-cs-fixer": "^4.0"
},
"config": {
- "bin-dir":"bin/"
+ "bin-dir": "bin/",
+ "preferred-install": {
+ "*": "dist"
+ },
+ "sort-packages": true,
+ "platform": {
+ "php": "8.1.2"
+ },
+ "allow-plugins": {
+ "phpstan/extension-installer": true,
+ "dealerdirect/phpcodesniffer-composer-installer": true
+ }
+ },
+ "replace": {
+ "paragonie/random_compat": "2.*",
+ "symfony/polyfill-iconv": "*",
+ "symfony/polyfill-php72": "*",
+ "symfony/polyfill-php71": "*",
+ "symfony/polyfill-php70": "*",
+ "symfony/polyfill-php56": "*"
+ },
+ "bin": ["bin/phpdoc", "bin/phpdoc.php"],
+ "conflict": {
+ "symfony/symfony": "*",
+ "phpdocumentor/reflection-docblock": "5.4.0"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ },
+ "symfony": {
+ "id": "01C32VS9393M1CP9R8TEJMH62G",
+ "allow-contrib": false,
+ "require": "^6.0"
+ }
+ },
+ "scripts": {
+ "auto-scripts": {
+
+ }
}
}
diff --git a/composer.lock b/composer.lock
index 18a82e318c..a42124a068 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,242 +1,7881 @@
{
- "hash": "875d3df98c3bdcac661b69cb1cd9cc78",
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "d7cfb5abd38964c7fa58755ff07d7357",
"packages": [
{
- "package": "cilex/cilex",
- "version": "dev-master",
- "alias-pretty-version": "1.0.x-dev",
- "alias-version": "1.0.9999999.9999999-dev"
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.42",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+ "scrutinizer/ocular": "1.6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dflydev\\DotAccessData\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Dragonfly Development Inc.",
+ "email": "info@dflydev.com",
+ "homepage": "http://dflydev.com"
+ },
+ {
+ "name": "Beau Simensen",
+ "email": "beau@dflydev.com",
+ "homepage": "http://beausimensen.com"
+ },
+ {
+ "name": "Carlos Frutos",
+ "email": "carlos@kiwing.it",
+ "homepage": "https://github.com/cfrutos"
+ },
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com"
+ }
+ ],
+ "description": "Given a deep data structure, access data by dot notation.",
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+ "keywords": [
+ "access",
+ "data",
+ "dot",
+ "notation"
+ ],
+ "support": {
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
+ },
+ "time": "2024-07-08T12:26:09+00:00"
+ },
+ {
+ "name": "doctrine/deprecations",
+ "version": "1.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
+ "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<=7.5 || >=14"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^12 || ^14",
+ "phpstan/phpstan": "1.4.10 || 2.1.30",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "suggest": {
+ "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Deprecations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+ "homepage": "https://www.doctrine-project.org/",
+ "support": {
+ "issues": "https://github.com/doctrine/deprecations/issues",
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.6"
+ },
+ "time": "2026-02-07T07:09:04+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-05T11:56:58+00:00"
+ },
+ {
+ "name": "jawira/plantuml",
+ "version": "v1.2026.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jawira/plantuml.git",
+ "reference": "5a8bb9b94703905229d3b6a859c8b3fefea5a8be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jawira/plantuml/zipball/5a8bb9b94703905229d3b6a859c8b3fefea5a8be",
+ "reference": "5a8bb9b94703905229d3b6a859c8b3fefea5a8be",
+ "shasum": ""
+ },
+ "bin": [
+ "bin/plantuml"
+ ],
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "GPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Jawira Portugal"
+ }
+ ],
+ "description": "Provides PlantUML executable and plantuml.jar",
+ "keywords": [
+ "diagram",
+ "jar",
+ "plantuml",
+ "plantuml.jar",
+ "uml"
+ ],
+ "support": {
+ "issues": "https://github.com/jawira/plantuml/issues",
+ "source": "https://github.com/jawira/plantuml/tree/v1.2026.6"
+ },
+ "time": "2026-06-12T13:00:45+00:00"
+ },
+ {
+ "name": "jawira/plantuml-encoding",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jawira/plantuml-encoding.git",
+ "reference": "fe8bce2d7ff5bb5cccf374349999cef7d6246a32"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jawira/plantuml-encoding/zipball/fe8bce2d7ff5bb5cccf374349999cef7d6246a32",
+ "reference": "fe8bce2d7ff5bb5cccf374349999cef7d6246a32",
+ "shasum": ""
+ },
+ "require": {
+ "ext-zlib": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/plantuml_functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jawira Portugal",
+ "homepage": "https://jawira.com"
+ }
+ ],
+ "description": "PlantUML encoding functions",
+ "keywords": [
+ "encodep",
+ "encoding",
+ "functions",
+ "plantuml",
+ "uml"
+ ],
+ "support": {
+ "issues": "https://github.com/jawira/plantuml-encoding/issues",
+ "source": "https://github.com/jawira/plantuml-encoding/tree/v1.1.1"
+ },
+ "time": "2024-12-22T17:49:30+00:00"
+ },
+ {
+ "name": "jean85/pretty-package-versions",
+ "version": "2.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Jean85/pretty-package-versions.git",
+ "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a",
+ "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.1.0",
+ "php": "^7.4|^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "jean85/composer-provided-replaced-stub-package": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpunit/phpunit": "^7.5|^8.5|^9.6",
+ "rector/rector": "^2.0",
+ "vimeo/psalm": "^4.3 || ^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Jean85\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alessandro Lai",
+ "email": "alessandro.lai85@gmail.com"
+ }
+ ],
+ "description": "A library to get pretty versions strings of installed dependencies",
+ "keywords": [
+ "composer",
+ "package",
+ "release",
+ "versions"
+ ],
+ "support": {
+ "issues": "https://github.com/Jean85/pretty-package-versions/issues",
+ "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1"
+ },
+ "time": "2025-03-19T14:43:43+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.8.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "59fb075d2101740c337c7216e3f32b36c204218b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b",
+ "reference": "59fb075d2101740c337c7216e3f32b36c204218b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "league/config": "^1.1.1",
+ "php": "^7.4 || ^8.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "cebe/markdown": "^1.0",
+ "commonmark/cmark": "0.31.1",
+ "commonmark/commonmark.js": "0.31.1",
+ "composer/package-versions-deprecated": "^1.8",
+ "embed/embed": "^4.4",
+ "erusev/parsedown": "^1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "^1.4 || ^2.0",
+ "nyholm/psr7": "^1.5",
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "forum": "https://github.com/thephpleague/commonmark/discussions",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-03-19T13:16:38+00:00"
+ },
+ {
+ "name": "league/config",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/config.git",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "shasum": ""
+ },
+ "require": {
+ "dflydev/dot-access-data": "^3.0.1",
+ "nette/schema": "^1.2",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Config\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Define configuration arrays with strict schemas and access values with dot notation",
+ "homepage": "https://config.thephpleague.com",
+ "keywords": [
+ "array",
+ "config",
+ "configuration",
+ "dot",
+ "dot-access",
+ "nested",
+ "schema"
+ ],
+ "support": {
+ "docs": "https://config.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/config/issues",
+ "rss": "https://github.com/thephpleague/config/releases.atom",
+ "source": "https://github.com/thephpleague/config"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-11T20:36:23+00:00"
+ },
+ {
+ "name": "league/csv",
+ "version": "9.27.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/csv.git",
+ "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/csv/zipball/26de738b8fccf785397d05ee2fc07b6cd8749797",
+ "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^8.1.2"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "ext-xdebug": "*",
+ "friendsofphp/php-cs-fixer": "^3.75.0",
+ "phpbench/phpbench": "^1.4.1",
+ "phpstan/phpstan": "^1.12.27",
+ "phpstan/phpstan-deprecation-rules": "^1.2.1",
+ "phpstan/phpstan-phpunit": "^1.4.2",
+ "phpstan/phpstan-strict-rules": "^1.6.2",
+ "phpunit/phpunit": "^10.5.16 || ^11.5.22 || ^12.3.6",
+ "symfony/var-dumper": "^6.4.8 || ^7.3.0"
+ },
+ "suggest": {
+ "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes",
+ "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters",
+ "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters",
+ "ext-mysqli": "Requiered to use the package with the MySQLi extension",
+ "ext-pdo": "Required to use the package with the PDO extension",
+ "ext-pgsql": "Requiered to use the package with the PgSQL extension",
+ "ext-sqlite3": "Required to use the package with the SQLite3 extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "League\\Csv\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://github.com/nyamsprod/",
+ "role": "Developer"
+ }
+ ],
+ "description": "CSV data manipulation made easy in PHP",
+ "homepage": "https://csv.thephpleague.com",
+ "keywords": [
+ "convert",
+ "csv",
+ "export",
+ "filter",
+ "import",
+ "read",
+ "transform",
+ "write"
+ ],
+ "support": {
+ "docs": "https://csv.thephpleague.com",
+ "issues": "https://github.com/thephpleague/csv/issues",
+ "rss": "https://github.com/thephpleague/csv/releases.atom",
+ "source": "https://github.com/thephpleague/csv"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2025-10-25T08:35:20+00:00"
+ },
+ {
+ "name": "league/flysystem",
+ "version": "1.1.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1",
+ "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "league/mime-type-detection": "^1.3",
+ "php": "^7.2.5 || ^8.0"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
+ },
+ "require-dev": {
+ "phpspec/prophecy": "^1.11.1",
+ "phpunit/phpunit": "^8.5.8"
+ },
+ "suggest": {
+ "ext-ftp": "Allows you to use FTP server storage",
+ "ext-openssl": "Allows you to use FTPS server storage",
+ "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+ "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+ "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+ "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+ "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+ "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+ "league/flysystem-webdav": "Allows you to use WebDAV storage",
+ "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+ "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "Filesystem abstraction: Many filesystems, one API.",
+ "keywords": [
+ "Cloud Files",
+ "WebDAV",
+ "abstraction",
+ "aws",
+ "cloud",
+ "copy.com",
+ "dropbox",
+ "file systems",
+ "files",
+ "filesystem",
+ "filesystems",
+ "ftp",
+ "rackspace",
+ "remote",
+ "s3",
+ "sftp",
+ "storage"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/flysystem/issues",
+ "source": "https://github.com/thephpleague/flysystem/tree/1.1.10"
+ },
+ "funding": [
+ {
+ "url": "https://offset.earth/frankdejonge",
+ "type": "other"
+ }
+ ],
+ "time": "2022-10-04T09:16:37+00:00"
+ },
+ {
+ "name": "league/mime-type-detection",
+ "version": "1.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/mime-type-detection.git",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "phpstan/phpstan": "^0.12.68",
+ "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\MimeTypeDetection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "Mime-type detection for Flysystem",
+ "support": {
+ "issues": "https://github.com/thephpleague/mime-type-detection/issues",
+ "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/frankdejonge",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-21T08:32:55+00:00"
+ },
+ {
+ "name": "league/tactician",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/tactician.git",
+ "reference": "93b2eafa4321f84164f3d3f607a32a953f3fff0b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/tactician/zipball/93b2eafa4321f84164f3d3f607a32a953f3fff0b",
+ "reference": "93b2eafa4321f84164f3d3f607a32a953f3fff0b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.3",
+ "phpunit/phpunit": "^7.5.20 || ^9.3.8",
+ "squizlabs/php_codesniffer": "^3.5.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Tactician\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ross Tuck",
+ "homepage": "http://tactician.thephpleague.com"
+ }
+ ],
+ "description": "A small, flexible command bus. Handy for building service layers.",
+ "keywords": [
+ "command",
+ "command bus",
+ "service layer"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/tactician/issues",
+ "source": "https://github.com/thephpleague/tactician/tree/v1.2.0"
+ },
+ "time": "2025-12-21T18:05:37+00:00"
+ },
+ {
+ "name": "league/uri",
+ "version": "7.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430",
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430",
+ "shasum": ""
+ },
+ "require": {
+ "league/uri-interfaces": "^7.5",
+ "php": "^8.1"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-fileinfo": "to create Data URI from file contennts",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain",
+ "league/uri-components": "Needed to easily manipulate URI objects components",
+ "php-64bit": "to improve IPV4 host parsing",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri/tree/7.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-08T08:40:02+00:00"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "7.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928",
+ "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^8.1",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "php-64bit": "to improve IPV4 host parsing",
+ "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2026-03-08T20:05:35+00:00"
+ },
+ {
+ "name": "masterminds/html5",
+ "version": "2.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Masterminds/html5-php.git",
+ "reference": "fcf91eb64359852f00d921887b219479b4f21251"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251",
+ "reference": "fcf91eb64359852f00d921887b219479b4f21251",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Masterminds\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Butcher",
+ "email": "technosophos@gmail.com"
+ },
+ {
+ "name": "Matt Farina",
+ "email": "matt@mattfarina.com"
+ },
+ {
+ "name": "Asmir Mustafic",
+ "email": "goetas@gmail.com"
+ }
+ ],
+ "description": "An HTML5 parser and serializer.",
+ "homepage": "http://masterminds.github.io/html5-php",
+ "keywords": [
+ "HTML5",
+ "dom",
+ "html",
+ "parser",
+ "querypath",
+ "serializer",
+ "xml"
+ ],
+ "support": {
+ "issues": "https://github.com/Masterminds/html5-php/issues",
+ "source": "https://github.com/Masterminds/html5-php/tree/2.10.0"
+ },
+ "time": "2025-07-25T09:04:22+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "3.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0",
+ "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^2.0 || ^3.0"
+ },
+ "provide": {
+ "psr/log-implementation": "3.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7 || ^8",
+ "ext-json": "*",
+ "graylog2/gelf-php": "^1.4.2 || ^2.0",
+ "guzzlehttp/guzzle": "^7.4.5",
+ "guzzlehttp/psr7": "^2.2",
+ "mongodb/mongodb": "^1.8 || ^2.0",
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
+ "php-console/php-console": "^3.1.8",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^10.5.17 || ^11.0.7",
+ "predis/predis": "^1.1 || ^2",
+ "rollbar/rollbar": "^4.0",
+ "ruflin/elastica": "^7 || ^8",
+ "symfony/mailer": "^5.4 || ^6",
+ "symfony/mime": "^5.4 || ^6"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "ext-openssl": "Required to send log messages using SSL",
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/3.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-01-02T08:56:05+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002",
+ "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^4.0",
+ "php": "8.1 - 8.5"
+ },
+ "require-dev": {
+ "nette/phpstan-rules": "^1.0",
+ "nette/tester": "^2.6",
+ "phpstan/extension-installer": "^1.4@stable",
+ "phpstan/phpstan": "^2.1.39@stable",
+ "tracy/tracy": "^2.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nette\\": "src"
+ },
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.3.5"
+ },
+ "time": "2026-02-23T03:47:12+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v4.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "2778deb6aab136c8db4ed1f4d6e9f465ca2dbee3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/2778deb6aab136c8db4ed1f4d6e9f465ca2dbee3",
+ "reference": "2778deb6aab136c8db4ed1f4d6e9f465ca2dbee3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "8.0 - 8.5"
+ },
+ "conflict": {
+ "nette/finder": "<3",
+ "nette/schema": "<1.2.2"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "^1.2",
+ "nette/tester": "^2.5",
+ "phpstan/phpstan-nette": "^2.0@stable",
+ "tracy/tracy": "^2.9"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nette\\": "src"
+ },
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v4.0.10"
+ },
+ "time": "2025-12-01T17:30:42+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
+ },
+ "time": "2025-12-06T11:56:16+00:00"
+ },
+ {
+ "name": "parsica-php/parsica",
+ "version": "0.8.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/parsica-php/parsica.git",
+ "reference": "e5b0a763e26e89de39a0790e949b8ff7f0909d73"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/parsica-php/parsica/zipball/e5b0a763e26e89de39a0790e949b8ff7f0909d73",
+ "reference": "e5b0a763e26e89de39a0790e949b8ff7f0909d73",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "ext-json": "*",
+ "mathiasverraes/uptodocs": "dev-main",
+ "phpbench/phpbench": "^1.0.1",
+ "phpunit/phpunit": "^9.0",
+ "psr/event-dispatcher": "^1.0",
+ "vimeo/psalm": "^4.30"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/characters.php",
+ "src/combinators.php",
+ "src/numeric.php",
+ "src/predicates.php",
+ "src/primitives.php",
+ "src/recursion.php",
+ "src/sideEffects.php",
+ "src/space.php",
+ "src/strings.php",
+ "src/Expression/expression.php",
+ "src/Internal/FP.php",
+ "src/Curry/functions.php"
+ ],
+ "psr-4": {
+ "Parsica\\Parsica\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mathias Verraes",
+ "email": "mathias@verraes.net",
+ "homepage": "https://verraes.net"
+ },
+ {
+ "name": "Toon Daelman",
+ "email": "spinnewebber_toon@hotmail.com",
+ "homepage": "https://github.com/turanct"
+ }
+ ],
+ "description": "The easiest way to build robust parsers in PHP.",
+ "homepage": "https://parsica-php.github.io/",
+ "keywords": [
+ "parser",
+ "parser combinator",
+ "parser-combinator",
+ "parsing"
+ ],
+ "support": {
+ "issues": "https://github.com/parsica-php/parsica/issues",
+ "source": "https://github.com/parsica-php/parsica/tree/0.8.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/turanct",
+ "type": "github"
+ }
+ ],
+ "time": "2025-07-09T08:39:51+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpdocumentor/filesystem",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/filesystem.git",
+ "reference": "1234be43d6604bd5ca0951e5d0e8e61e62b872b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/filesystem/zipball/1234be43d6604bd5ca0951e5d0e8e61e62b872b0",
+ "reference": "1234be43d6604bd5ca0951e5d0e8e61e62b872b0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1",
+ "webmozart/assert": "^1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\FileSystem\\": "src/"
+ },
+ "classmap": [
+ "Flysystem/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Filesystem abstraction for phpdocumentor projects.",
+ "homepage": "https://www.phpdoc.org",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/filesystem/issues",
+ "source": "https://github.com/phpDocumentor/filesystem/tree/1.10.0"
+ },
+ "time": "2026-04-13T20:20:50+00:00"
+ },
+ {
+ "name": "phpdocumentor/flyfinder",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/FlyFinder.git",
+ "reference": "6e145e676d9fbade7527fd8d4c99ab36b687b958"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/FlyFinder/zipball/6e145e676d9fbade7527fd8d4c99ab36b687b958",
+ "reference": "6e145e676d9fbade7527fd8d4c99ab36b687b958",
+ "shasum": ""
+ },
+ "require": {
+ "league/flysystem": "^1.0",
+ "php": "^7.2||^8.0"
+ },
+ "require-dev": {
+ "league/flysystem-memory": "~1",
+ "mockery/mockery": "^1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Flyfinder\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Flysystem plugin to add file finding capabilities to the Filesystem entity",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "Flysystem",
+ "phpdoc"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/FlyFinder/issues",
+ "source": "https://github.com/phpDocumentor/FlyFinder/tree/1.1.0"
+ },
+ "time": "2021-06-04T13:44:40+00:00"
+ },
+ {
+ "name": "phpdocumentor/graphviz",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/GraphViz.git",
+ "reference": "115999dc7f31f2392645aa825a94a6b165e1cedf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/115999dc7f31f2392645aa825a94a6b165e1cedf",
+ "reference": "115999dc7f31f2392645aa825a94a6b165e1cedf",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "ext-simplexml": "*",
+ "mockery/mockery": "^1.2",
+ "phpstan/phpstan": "^0.12",
+ "phpunit/phpunit": "^8.2 || ^9.2",
+ "psalm/phar": "^4.15"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\GraphViz\\": "src/phpDocumentor/GraphViz",
+ "phpDocumentor\\GraphViz\\PHPStan\\": "./src/phpDocumentor/PHPStan"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "mike.vanriel@naenius.com"
+ }
+ ],
+ "description": "Wrapper for Graphviz",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/GraphViz/issues",
+ "source": "https://github.com/phpDocumentor/GraphViz/tree/2.1.0"
+ },
+ "time": "2021-12-13T19:03:21+00:00"
+ },
+ {
+ "name": "phpdocumentor/guides",
+ "version": "1.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/guides-core.git",
+ "reference": "f90731c13f0132dac864c21adce866f0f756541a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/guides-core/zipball/f90731c13f0132dac864c21adce866f0f756541a",
+ "reference": "f90731c13f0132dac864c21adce866f0f756541a",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.1",
+ "ext-json": "*",
+ "ext-zlib": "*",
+ "league/flysystem": "^1.1.0 || ^3.29.1",
+ "league/tactician": "^1.1",
+ "league/uri": "^7.5.1",
+ "php": "^8.1",
+ "phpdocumentor/filesystem": "^1.7.4",
+ "phpdocumentor/flyfinder": "^1.1 || ^2.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/clock": "^6.4.8 || ^7.4 || ^8",
+ "symfony/html-sanitizer": "^6.4.8 || ^7.4 || ^8",
+ "symfony/http-client": "^6.4.9 || ^7.4 || ^8",
+ "symfony/polyfill-php84": "^1.33.0",
+ "symfony/string": "^6.4.9 || ^7.4 || ^8",
+ "symfony/translation-contracts": "^3.5.1",
+ "twig/twig": "~2.15 || ^3.0",
+ "webmozart/assert": "^1.11"
+ },
+ "require-dev": {
+ "psr/log": "^3.0.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Guides\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Contains the core functionality from the phpDocumentor Guides.",
+ "homepage": "https://www.phpdoc.org",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/guides-core/issues",
+ "source": "https://github.com/phpDocumentor/guides-core/tree/1.10.1"
+ },
+ "time": "2026-05-08T14:29:08+00:00"
+ },
+ {
+ "name": "phpdocumentor/guides-graphs",
+ "version": "1.9.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/guides-graphs.git",
+ "reference": "580ffeb50d12363973b09a24109fb4d7a198efdd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/guides-graphs/zipball/580ffeb50d12363973b09a24109fb4d7a198efdd",
+ "reference": "580ffeb50d12363973b09a24109fb4d7a198efdd",
+ "shasum": ""
+ },
+ "require": {
+ "jawira/plantuml-encoding": "^1.0",
+ "php": "^8.1",
+ "phpdocumentor/guides": "^1.0 || ^2.0",
+ "phpdocumentor/guides-restructured-text": "^1.0 || ^2.0",
+ "symfony/process": "^5.4 || ^6.3 || ^7.0 || ^8.0",
+ "twig/twig": "~2.0 || ^3.0"
+ },
+ "suggest": {
+ "jawira/plantuml": "To render graphs locally using plant uml"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Guides\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Provides Plantuml support for restructured text rendered by the phpDocumentor's Guides library.",
+ "homepage": "https://www.phpdoc.org",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/guides-graphs/issues",
+ "source": "https://github.com/phpDocumentor/guides-graphs/tree/1.9.6"
+ },
+ "time": "2026-01-18T19:20:03+00:00"
+ },
+ {
+ "name": "phpdocumentor/guides-markdown",
+ "version": "1.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/guides-markdown.git",
+ "reference": "8e30419d5724f025014d3fd6ecc2648a7ebda2a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/guides-markdown/zipball/8e30419d5724f025014d3fd6ecc2648a7ebda2a9",
+ "reference": "8e30419d5724f025014d3fd6ecc2648a7ebda2a9",
+ "shasum": ""
+ },
+ "require": {
+ "league/commonmark": "^2.4",
+ "php": "^8.1",
+ "phpdocumentor/guides": "^1.0 || ^2.0",
+ "symfony/yaml": "^6.4 || ^7.0 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Guides\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Adds Markdown support to the phpDocumentor's Guides library.",
+ "homepage": "https://www.phpdoc.org",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/guides-markdown/issues",
+ "source": "https://github.com/phpDocumentor/guides-markdown/tree/1.10.2"
+ },
+ "time": "2026-05-12T21:21:19+00:00"
+ },
+ {
+ "name": "phpdocumentor/guides-restructured-text",
+ "version": "1.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/guides-restructured-text.git",
+ "reference": "382bb6f6ae20cb289999bbbd5b8d42a50032bb44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/guides-restructured-text/zipball/382bb6f6ae20cb289999bbbd5b8d42a50032bb44",
+ "reference": "382bb6f6ae20cb289999bbbd5b8d42a50032bb44",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^3.0",
+ "league/csv": "^9.27.0",
+ "php": "^8.1",
+ "phpdocumentor/guides": "^1.0 || ^2.0",
+ "webmozart/assert": "^1.11"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Guides\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Adds reStructuredText Markup support to the phpDocumentor's Guides library.",
+ "homepage": "https://www.phpdoc.org",
+ "support": {
+ "source": "https://github.com/phpDocumentor/guides-restructured-text/tree/1.10.1"
+ },
+ "time": "2026-05-05T21:54:11+00:00"
+ },
+ {
+ "name": "phpdocumentor/json-path",
+ "version": "0.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/json-path.git",
+ "reference": "f1b1cd2ce99c5be7ef576c516d3d476a2e2b6566"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/json-path/zipball/f1b1cd2ce99c5be7ef576c516d3d476a2e2b6566",
+ "reference": "f1b1cd2ce99c5be7ef576c516d3d476a2e2b6566",
+ "shasum": ""
+ },
+ "require": {
+ "parsica-php/parsica": "^0.8.3",
+ "php": "8.1.*|8.2.*|8.3.*|8.4.*",
+ "symfony/property-access": "^5.4|^6.4|^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\JsonPath\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "jaapio",
+ "email": "jaap@phpdoc.org"
+ }
+ ],
+ "description": "Access php objects with json path expressions",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/json-path/issues",
+ "source": "https://github.com/phpDocumentor/json-path/tree/0.2.1"
+ },
+ "time": "2025-10-04T13:52:17+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection",
+ "version": "6.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/Reflection.git",
+ "reference": "c8d36446027506a005103d57265ba5ea56beabfc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/c8d36446027506a005103d57265ba5ea56beabfc",
+ "reference": "c8d36446027506a005103d57265ba5ea56beabfc",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2",
+ "nikic/php-parser": "~4.18 || ^5.0",
+ "php": "8.1.*|8.2.*|8.3.*|8.4.*|8.5.*",
+ "phpdocumentor/reflection-common": "^2.1",
+ "phpdocumentor/reflection-docblock": "^5",
+ "phpdocumentor/type-resolver": "^1.4",
+ "symfony/polyfill-php80": "^1.28",
+ "webmozart/assert": "^1.7"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
+ "doctrine/coding-standard": "^13.0",
+ "eliashaeussler/phpunit-attributes": "^1.8",
+ "mikey179/vfsstream": "~1.2",
+ "mockery/mockery": "~1.6.0",
+ "phpspec/prophecy-phpunit": "^2.4",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^10.5.53",
+ "psalm/phar": "^6.0",
+ "rector/rector": "^1.0.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-5.x": "5.3.x-dev",
+ "dev-6.x": "6.0.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/php-parser/Modifiers.php"
+ ],
+ "psr-4": {
+ "phpDocumentor\\": "src/phpDocumentor"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Reflection library to do Static Analysis for PHP Projects",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/Reflection/issues",
+ "source": "https://github.com/phpDocumentor/Reflection/tree/6.6.0"
+ },
+ "time": "2026-04-12T18:07:10+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.6.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "31a105931bc8ffa3a123383829772e832fd8d903"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/31a105931bc8ffa3a123383829772e832fd8d903",
+ "reference": "31a105931bc8ffa3a123383829772e832fd8d903",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.1",
+ "ext-filter": "*",
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.7",
+ "phpstan/phpdoc-parser": "^1.7|^2.0",
+ "webmozart/assert": "^1.9.1 || ^2"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.5 || ~1.6.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^9.5",
+ "psalm/phar": "^5.26"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.7"
+ },
+ "time": "2026-03-18T20:47:46+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195",
+ "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.3 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpstan/phpdoc-parser": "^1.18|^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.13.9",
+ "vimeo/psalm": "^4.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0"
+ },
+ "time": "2025-11-21T15:09:14+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a",
+ "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2"
+ },
+ "time": "2026-01-25T14:56:51+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
},
{
- "package": "cilex/cilex",
- "version": "dev-master",
- "source-reference": "c9db6dcf69ea9bc11e6bd2f25459075cafc5a305",
- "commit-date": "1338133991"
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
},
{
- "package": "dflydev/markdown",
- "version": "dev-master",
- "alias-pretty-version": "1.0.x-dev",
- "alias-version": "1.0.9999999.9999999-dev"
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
},
{
- "package": "dflydev/markdown",
- "version": "dev-master",
- "source-reference": "b0a6ee857b53228c07b9b631aea5c7a690c33da2",
- "commit-date": "1338238334"
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
},
{
- "package": "nikic/php-parser",
- "version": "dev-master",
- "source-reference": "v0.9.2",
- "commit-date": "1341692605"
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
+ },
+ "time": "2024-09-11T13:17:53+00:00"
},
{
- "package": "phpdocumentor/fileset",
- "version": "1.0.0-beta2"
+ "name": "symfony/cache",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/b9e9b93c9817ec6c789c7943f5e54b57a041c16a",
+ "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/cache": "^2.0|^3.0",
+ "psr/log": "^1.1|^2|^3",
+ "symfony/cache-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/var-exporter": "^6.3.6|^7.0"
+ },
+ "conflict": {
+ "doctrine/dbal": "<2.13.1",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/http-kernel": "<5.4",
+ "symfony/var-dumper": "<5.4"
+ },
+ "provide": {
+ "psr/cache-implementation": "2.0|3.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0",
+ "symfony/cache-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "cache/integration-tests": "dev-master",
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "predis/predis": "^1.1|^2.0",
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Cache\\": ""
+ },
+ "classmap": [
+ "Traits/ValueWrapper.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "caching",
+ "psr6"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/cache/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "package": "phpdocumentor/graphviz",
- "version": "1.0.0-beta3"
+ "name": "symfony/clock",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/clock.git",
+ "reference": "5e15a9c9aeeb44a99f7cf24aa75aa9607795f6f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/5e15a9c9aeeb44a99f7cf24aa75aa9607795f6f8",
+ "reference": "5e15a9c9aeeb44a99f7cf24aa75aa9607795f6f8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/clock": "^1.0",
+ "symfony/polyfill-php83": "^1.28"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/now.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Clock\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Decouples applications from the system clock",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clock",
+ "psr20",
+ "time"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/clock/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "package": "phpdocumentor/plugin-twig",
- "version": "1.0.0"
+ "name": "symfony/config",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "51da0e4494d81bd7b5b5bd80319c55d8e0d7f4ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/51da0e4494d81bd7b5b5bd80319c55d8e0d7f4ff",
+ "reference": "51da0e4494d81bd7b5b5bd80319c55d8e0d7f4ff",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/finder": "<5.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "package": "phpdocumentor/reflection-docblock",
- "version": "1.0.0"
+ "name": "symfony/console",
+ "version": "v6.4.41",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "d21b17ed158e79180fac3895ff751707970eeb57"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/d21b17ed158e79180fac3895ff751707970eeb57",
+ "reference": "d21b17ed158e79180fac3895ff751707970eeb57",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.4.41"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-24T08:48:41+00:00"
},
{
- "package": "phpdocumentor/template-abstract",
- "version": "1.0.1"
+ "name": "symfony/contracts",
+ "version": "v3.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/contracts.git",
+ "reference": "3d8d0c00cf8d2c18fd47a0fbbc4ad6a1d5ede078"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/contracts/zipball/3d8d0c00cf8d2c18fd47a0fbbc4ad6a1d5ede078",
+ "reference": "3d8d0c00cf8d2c18fd47a0fbbc4ad6a1d5ede078",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/cache": "^3.0",
+ "psr/container": "^1.1|^2.0",
+ "psr/event-dispatcher": "^1.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "replace": {
+ "symfony/cache-contracts": "self.version",
+ "symfony/deprecation-contracts": "self.version",
+ "symfony/event-dispatcher-contracts": "self.version",
+ "symfony/http-client-contracts": "self.version",
+ "symfony/service-contracts": "self.version",
+ "symfony/translation-contracts": "self.version"
+ },
+ "require-dev": {
+ "symfony/polyfill-intl-idn": "^1.10"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.7-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "Deprecation/function.php"
+ ],
+ "psr-4": {
+ "Symfony\\Contracts\\": ""
+ },
+ "exclude-from-classmap": [
+ "**/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A set of abstractions extracted out of the Symfony components",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "dev",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/contracts/tree/v3.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-05T15:33:14+00:00"
},
{
- "package": "phpdocumentor/template-new-black",
- "version": "1.0.2"
+ "name": "symfony/dependency-injection",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "d8c5f9781b71c2a868ae9d0e5c9b283684740b6d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d8c5f9781b71c2a868ae9d0e5c9b283684740b6d",
+ "reference": "d8c5f9781b71c2a868ae9d0e5c9b283684740b6d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.2.10|^7.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2",
+ "symfony/config": "<6.1",
+ "symfony/finder": "<5.4",
+ "symfony/proxy-manager-bridge": "<6.3",
+ "symfony/yaml": "<5.4"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0",
+ "symfony/service-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "symfony/config": "^6.1|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows you to standardize and centralize the way objects are constructed in your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/dependency-injection/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "package": "phpdocumentor/template-responsive",
- "version": "1.0.5"
+ "name": "symfony/dom-crawler",
+ "version": "v6.4.40",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dom-crawler.git",
+ "reference": "7e65f76c28f5ed8d933f2c86698a3e2bf0de1b10"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7e65f76c28f5ed8d933f2c86698a3e2bf0de1b10",
+ "reference": "7e65f76c28f5ed8d933f2c86698a3e2bf0de1b10",
+ "shasum": ""
+ },
+ "require": {
+ "masterminds/html5": "^2.6",
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DomCrawler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases DOM navigation for HTML and XML documents",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/dom-crawler/tree/v6.4.40"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-19T20:33:22+00:00"
},
{
- "package": "phpdocumentor/template-zend",
- "version": "1.0.1"
+ "name": "symfony/dotenv",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dotenv.git",
+ "reference": "982a8d58c73a7d91d229bc20493b8ae13208741c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/982a8d58c73a7d91d229bc20493b8ae13208741c",
+ "reference": "982a8d58c73a7d91d229bc20493b8ae13208741c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/console": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Dotenv\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Registers environment variables from a .env file",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/dotenv/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "package": "phpdocumentor/unified-asset-installer",
- "version": "1.0.1-beta4"
+ "name": "symfony/event-dispatcher",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d84384f3f67de3cb650db64d685d70395dacfc3f",
+ "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/error-handler": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "package": "pimple/pimple",
- "version": "dev-master",
- "alias-pretty-version": "1.0.x-dev",
- "alias-version": "1.0.9999999.9999999-dev"
+ "name": "symfony/expression-language",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/expression-language.git",
+ "reference": "f64e152029200cf35da13e9e1444e5fc8ff7fdfa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/expression-language/zipball/f64e152029200cf35da13e9e1444e5fc8ff7fdfa",
+ "reference": "f64e152029200cf35da13e9e1444e5fc8ff7fdfa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ExpressionLanguage\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an engine that can compile and evaluate expressions",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/expression-language/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "package": "pimple/pimple",
- "version": "dev-master",
- "source-reference": "d2cfa2f02f50abef65c238747c753a5f6786f6be",
- "commit-date": "1341139100"
+ "name": "symfony/filesystem",
+ "version": "v6.4.39",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "c507b077756b4e3e09adbbe7975fac81cd3722ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/c507b077756b4e3e09adbbe7975fac81cd3722ca",
+ "reference": "c507b077756b4e3e09adbbe7975fac81cd3722ca",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
+ },
+ "require-dev": {
+ "symfony/process": "^5.4|^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v6.4.39"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-07T13:11:42+00:00"
},
{
- "package": "symfony/class-loader",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "symfony/finder",
+ "version": "v6.4.34",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896",
+ "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.4.34"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-01-28T15:16:37+00:00"
},
{
- "package": "symfony/class-loader",
- "version": "dev-master",
- "source-reference": "4e528fda43c1f3a9c2462098add0122ab894fc5e",
- "commit-date": "1342207366"
+ "name": "symfony/html-sanitizer",
+ "version": "v6.4.28",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/html-sanitizer.git",
+ "reference": "03f9c2eed8ca49f027bd9a54d25c3b9efea35525"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/03f9c2eed8ca49f027bd9a54d25c3b9efea35525",
+ "reference": "03f9c2eed8ca49f027bd9a54d25c3b9efea35525",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "league/uri": "^6.5|^7.0",
+ "masterminds/html5": "^2.7.2",
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HtmlSanitizer\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Titouan Galopin",
+ "email": "galopintitouan@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "Purifier",
+ "html",
+ "sanitizer"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/html-sanitizer/tree/v6.4.28"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-10-29T09:25:59+00:00"
},
{
- "package": "symfony/console",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "symfony/http-client",
+ "version": "v6.4.28",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client.git",
+ "reference": "c9e69c185c4a845f9d46958cdb0dc7aa847f3981"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/c9e69c185c4a845f9d46958cdb0dc7aa847f3981",
+ "reference": "c9e69c185c4a845f9d46958cdb0dc7aa847f3981",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-client-contracts": "~3.4.4|^3.5.2",
+ "symfony/polyfill-php83": "^1.29",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "php-http/discovery": "<1.15",
+ "symfony/http-foundation": "<6.3"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "1.0",
+ "symfony/http-client-implementation": "3.0"
+ },
+ "require-dev": {
+ "amphp/amp": "^2.5",
+ "amphp/http-client": "^4.2.1",
+ "amphp/http-tunnel": "^1.0",
+ "amphp/socket": "^1.1",
+ "guzzlehttp/promises": "^1.4|^2.0",
+ "nyholm/psr7": "^1.0",
+ "php-http/httplug": "^1.0|^2.0",
+ "psr/http-client": "^1.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "http"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client/tree/v6.4.28"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-11-05T17:39:22+00:00"
},
{
- "package": "symfony/console",
- "version": "dev-master",
- "source-reference": "dc021a50834dcf2a7cb65f38f98d570f6eff3f38",
- "commit-date": "1342207366"
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "141046a8f9477948ff284fa65be2095baafb94f2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2",
+ "reference": "141046a8f9477948ff284fa65be2095baafb94f2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-10T16:19:22+00:00"
},
{
- "package": "symfony/event-dispatcher",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.38.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "e9247d281d694a5120554d9afaf54e070e88a603"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603",
+ "reference": "e9247d281d694a5120554d9afaf54e070e88a603",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-26T05:58:03+00:00"
},
{
- "package": "symfony/event-dispatcher",
- "version": "dev-master",
- "source-reference": "b99b49760016467099f010aff7a5098861d49e09",
- "commit-date": "1342207366"
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.38.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "dc21118016c039a66235cf93d96b435ffb282412"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412",
+ "reference": "dc21118016c039a66235cf93d96b435ffb282412",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-25T15:22:23+00:00"
},
{
- "package": "symfony/finder",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.38.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",
+ "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-25T13:48:31+00:00"
},
{
- "package": "symfony/finder",
- "version": "dev-master",
- "source-reference": "3338fb3883eaed08a30b206a79491f6e48dfc12b",
- "commit-date": "1342207366"
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.38.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
+ "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-27T06:59:30+00:00"
},
{
- "package": "symfony/process",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "symfony/polyfill-php80",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-02T08:10:11+00:00"
},
{
- "package": "symfony/process",
- "version": "dev-master",
- "source-reference": "5ec4b91df4ce83a6dad94f79112b4cd218811bf4",
- "commit-date": "1342207366"
+ "name": "symfony/polyfill-php83",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-08T02:45:35+00:00"
},
{
- "package": "twig/twig",
- "version": "dev-master",
- "alias-pretty-version": "1.9.x-dev",
- "alias-version": "1.9.9999999.9999999-dev"
+ "name": "symfony/polyfill-php84",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php84.git",
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191",
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php84\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-24T13:30:11+00:00"
},
{
- "package": "twig/twig",
- "version": "dev-master",
- "source-reference": "3f9f587ba72f9da84266b93ee1d0fc025b6b010f",
- "commit-date": "1342197076"
+ "name": "symfony/process",
+ "version": "v6.4.41",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "c8fc09bdfe9fde9aaa89b415a4477feaccec16a7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/c8fc09bdfe9fde9aaa89b415a4477feaccec16a7",
+ "reference": "c8fc09bdfe9fde9aaa89b415a4477feaccec16a7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v6.4.41"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-23T13:47:21+00:00"
},
{
- "package": "zendframework/zend-config",
- "version": "2.0.0-beta5"
+ "name": "symfony/property-access",
+ "version": "v6.4.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/property-access.git",
+ "reference": "80e0378f2f058b60d87dedc3c760caec882e992c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/80e0378f2f058b60d87dedc3c760caec882e992c",
+ "reference": "80e0378f2f058b60d87dedc3c760caec882e992c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/property-info": "^5.4|^6.0|^7.0"
+ },
+ "require-dev": {
+ "symfony/cache": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PropertyAccess\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides functions to read and write from/to an object or array using a simple string notation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "access",
+ "array",
+ "extraction",
+ "index",
+ "injection",
+ "object",
+ "property",
+ "property-path",
+ "reflection"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/property-access/tree/v6.4.18"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-16T14:42:05+00:00"
},
{
- "package": "zendframework/zend-locale",
- "version": "2.0.0-beta4"
+ "name": "symfony/property-info",
+ "version": "v6.4.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/property-info.git",
+ "reference": "94d18e5cc11a37fd92856d38b61d9cdf72536a1e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/94d18e5cc11a37fd92856d38b61d9cdf72536a1e",
+ "reference": "94d18e5cc11a37fd92856d38b61d9cdf72536a1e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "phpdocumentor/reflection-docblock": "<5.2",
+ "phpdocumentor/type-resolver": "<1.5.1",
+ "symfony/cache": "<5.4",
+ "symfony/dependency-injection": "<5.4|>=6.0,<6.4",
+ "symfony/serializer": "<5.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.12|^2",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "phpstan/phpdoc-parser": "^1.0|^2.0",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^5.4|^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PropertyInfo\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Extracts information about PHP class' properties using metadata of popular sources",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "doctrine",
+ "phpdoc",
+ "property",
+ "symfony",
+ "type",
+ "validator"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/property-info/tree/v6.4.18"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-21T10:52:27+00:00"
},
{
- "package": "zendframework/zend-servicemanager",
- "version": "2.0.0-beta5"
+ "name": "symfony/routing",
+ "version": "v6.4.41",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "af04c79671fd8df0805a44c83fa2b0ba56c8329e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/af04c79671fd8df0805a44c83fa2b0ba56c8329e",
+ "reference": "af04c79671fd8df0805a44c83fa2b0ba56c8329e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "symfony/config": "<6.2",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/yaml": "<5.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.12|^2",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.2|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Maps an HTTP request to a set of configuration variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/routing/tree/v6.4.41"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-24T11:18:16+00:00"
},
{
- "package": "zendframework/zend-stdlib",
- "version": "2.0.0-beta5"
+ "name": "symfony/stopwatch",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "ffec95ba269e541eb2232126c0c20f83086b5c68"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/ffec95ba269e541eb2232126c0c20f83086b5c68",
+ "reference": "ffec95ba269e541eb2232126c0c20f83086b5c68",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a way to profile code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/stopwatch/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
},
{
- "package": "zendframework/zend-translator",
- "version": "2.0.0-beta4"
+ "name": "symfony/string",
+ "version": "v6.4.39",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "62e3c927de664edadb5bef260987eb047a17a113"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/62e3c927de664edadb5bef260987eb047a17a113",
+ "reference": "62e3c927de664edadb5bef260987eb047a17a113",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/intl": "^6.2|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.4.39"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-12T11:44:19+00:00"
+ },
+ {
+ "name": "symfony/var-exporter",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "825f9b00c37bbe1c1691cc1aff9b5451fc9b4405"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/825f9b00c37bbe1c1691cc1aff9b5451fc9b4405",
+ "reference": "825f9b00c37bbe1c1691cc1aff9b5451fc9b4405",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "require-dev": {
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\VarExporter\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clone",
+ "construct",
+ "export",
+ "hydrate",
+ "instantiate",
+ "lazy-loading",
+ "proxy",
+ "serialize"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-exporter/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v6.4.40",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "68dcd1f1602dac9d9221e25729683e0ce8733f3b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/68dcd1f1602dac9d9221e25729683e0ce8733f3b",
+ "reference": "68dcd1f1602dac9d9221e25729683e0ce8733f3b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v6.4.40"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-19T20:33:22+00:00"
+ },
+ {
+ "name": "twig/string-extra",
+ "version": "v3.24.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/string-extra.git",
+ "reference": "6ec8f2e8ca9b2193221a02cb599dc92c36384368"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/string-extra/zipball/6ec8f2e8ca9b2193221a02cb599dc92c36384368",
+ "reference": "6ec8f2e8ca9b2193221a02cb599dc92c36384368",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1.0",
+ "symfony/string": "^5.4|^6.4|^7.0|^8.0",
+ "symfony/translation-contracts": "^1.1|^2|^3",
+ "twig/twig": "^3.13|^4.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Twig\\Extra\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "A Twig extension for Symfony String",
+ "homepage": "https://twig.symfony.com",
+ "keywords": [
+ "html",
+ "string",
+ "twig",
+ "unicode"
+ ],
+ "support": {
+ "source": "https://github.com/twigphp/string-extra/tree/v3.24.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-12-02T14:45:16+00:00"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v3.27.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/ae2071bffb38f04847fc0864d730c94b9cb8ab74",
+ "reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-mbstring": "^1.3"
+ },
+ "require-dev": {
+ "php-cs-fixer/shim": "^3.0@stable",
+ "phpstan/phpstan": "^2.0@stable",
+ "psr/container": "^1.0|^2.0",
+ "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/Resources/core.php",
+ "src/Resources/debug.php",
+ "src/Resources/escaper.php",
+ "src/Resources/string_loader.php"
+ ],
+ "psr-4": {
+ "Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Twig Team",
+ "role": "Contributors"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "https://twig.symfony.com",
+ "keywords": [
+ "templating"
+ ],
+ "support": {
+ "issues": "https://github.com/twigphp/Twig/issues",
+ "source": "https://github.com/twigphp/Twig/tree/v3.27.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-30T17:09:26+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.12.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "9be6926d8b485f55b9229203f962b51ed377ba68"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",
+ "reference": "9be6926d8b485f55b9229203f962b51ed377ba68",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "suggest": {
+ "ext-intl": "",
+ "ext-simplexml": "",
+ "ext-spl": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.12.1"
+ },
+ "time": "2025-10-29T15:56:20+00:00"
}
],
"packages-dev": [
{
- "package": "behat/behat",
- "version": "v2.4.2"
+ "name": "dealerdirect/phpcodesniffer-composer-installer",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCSStandards/composer-installer.git",
+ "reference": "4be43904336affa5c2f70744a348312336afd0da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da",
+ "reference": "4be43904336affa5c2f70744a348312336afd0da",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.4",
+ "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
+ },
+ "require-dev": {
+ "composer/composer": "*",
+ "ext-json": "*",
+ "ext-zip": "*",
+ "php-parallel-lint/php-parallel-lint": "^1.3.1",
+ "phpcompatibility/php-compatibility": "^9.0",
+ "yoast/phpunit-polyfills": "^1.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Franck Nijhof",
+ "email": "franck.nijhof@dealerdirect.com",
+ "homepage": "http://www.frenck.nl",
+ "role": "Developer / IT Manager"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors"
+ }
+ ],
+ "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
+ "homepage": "http://www.dealerdirect.com",
+ "keywords": [
+ "PHPCodeSniffer",
+ "PHP_CodeSniffer",
+ "code quality",
+ "codesniffer",
+ "composer",
+ "installer",
+ "phpcbf",
+ "phpcs",
+ "plugin",
+ "qa",
+ "quality",
+ "standard",
+ "standards",
+ "style guide",
+ "stylecheck",
+ "tests"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPCSStandards/composer-installer/issues",
+ "source": "https://github.com/PHPCSStandards/composer-installer"
+ },
+ "time": "2023-01-05T11:28:13+00:00"
},
{
- "package": "behat/gherkin",
- "version": "v2.2.2"
+ "name": "doctrine/coding-standard",
+ "version": "13.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/coding-standard.git",
+ "reference": "8132673b9075d648c07f7f69cb3f4cc436709b77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/8132673b9075d648c07f7f69cb3f4cc436709b77",
+ "reference": "8132673b9075d648c07f7f69cb3f4cc436709b77",
+ "shasum": ""
+ },
+ "require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0.0",
+ "php": "^7.4 || ^8.0",
+ "slevomat/coding-standard": "^8.16",
+ "squizlabs/php_codesniffer": "^3.7"
+ },
+ "type": "phpcodesniffer-standard",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Steve Müller",
+ "email": "st.mueller@dzh-online.de"
+ }
+ ],
+ "description": "The Doctrine Coding Standard is a set of PHPCS rules applied to all Doctrine projects.",
+ "homepage": "https://www.doctrine-project.org/projects/coding-standard.html",
+ "keywords": [
+ "checks",
+ "code",
+ "coding",
+ "cs",
+ "dev",
+ "doctrine",
+ "rules",
+ "sniffer",
+ "sniffs",
+ "standard",
+ "style"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/coding-standard/issues",
+ "source": "https://github.com/doctrine/coding-standard/tree/13.0.0"
+ },
+ "time": "2025-03-23T15:38:56+00:00"
},
{
- "package": "symfony/config",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
},
{
- "package": "symfony/config",
- "version": "dev-master",
- "source-reference": "e94d9f83fbf64fb7c9be9367beac316b1ca98f92",
- "commit-date": "1342207366"
+ "name": "fakerphp/faker",
+ "version": "v1.24.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "psr/container": "^1.0 || ^2.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "conflict": {
+ "fzaninotto/faker": "*"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "doctrine/persistence": "^1.3 || ^2.0",
+ "ext-intl": "*",
+ "phpunit/phpunit": "^9.5.26",
+ "symfony/phpunit-bridge": "^5.4.16"
+ },
+ "suggest": {
+ "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+ "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+ "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+ "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+ "ext-mbstring": "Required for multibyte Unicode string functionality."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "François Zaninotto"
+ }
+ ],
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "support": {
+ "issues": "https://github.com/FakerPHP/Faker/issues",
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
+ },
+ "time": "2024-11-21T13:46:39+00:00"
},
{
- "package": "symfony/dependency-injection",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "hamcrest/hamcrest-php",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3|^7.0|^8.0"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "^1.4 || ^2.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "hamcrest"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
+ ],
+ "support": {
+ "issues": "https://github.com/hamcrest/hamcrest-php/issues",
+ "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
+ },
+ "time": "2020-07-09T08:09:16+00:00"
},
{
- "package": "symfony/dependency-injection",
- "version": "dev-master",
- "source-reference": "2a99f2b0b9d5fda1f5b7710723f393f93aa399b6",
- "commit-date": "1342207366"
+ "name": "mikey179/vfsstream",
+ "version": "v1.6.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bovigo/vfsStream.git",
+ "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/fe695ec993e0a55c3abdda10a9364eb31c6f1bf0",
+ "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5||^8.5||^9.6",
+ "yoast/phpunit-polyfills": "^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "org\\bovigo\\vfs\\": "src/main/php"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Frank Kleine",
+ "homepage": "http://frankkleine.de/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Virtual file system to mock the real file system in unit tests.",
+ "homepage": "http://vfs.bovigo.org/",
+ "support": {
+ "issues": "https://github.com/bovigo/vfsStream/issues",
+ "source": "https://github.com/bovigo/vfsStream/tree/master",
+ "wiki": "https://github.com/bovigo/vfsStream/wiki"
+ },
+ "time": "2024-08-29T18:43:31+00:00"
},
{
- "package": "symfony/translation",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "mockery/mockery",
+ "version": "1.6.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "^2.0.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=7.3"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5 || ^9.6.17",
+ "symplify/easy-coding-standard": "^12.1.14"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "library/helpers.php",
+ "library/Mockery.php"
+ ],
+ "psr-4": {
+ "Mockery\\": "library/Mockery"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "https://github.com/padraic",
+ "role": "Author"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "https://davedevelopment.co.uk",
+ "role": "Developer"
+ },
+ {
+ "name": "Nathanael Esayeas",
+ "email": "nathanael.esayeas@protonmail.com",
+ "homepage": "https://github.com/ghostwriter",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Mockery is a simple yet flexible PHP mock object framework",
+ "homepage": "https://github.com/mockery/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "support": {
+ "docs": "https://docs.mockery.io/",
+ "issues": "https://github.com/mockery/mockery/issues",
+ "rss": "https://github.com/mockery/mockery/releases.atom",
+ "security": "https://github.com/mockery/mockery/security/advisories",
+ "source": "https://github.com/mockery/mockery"
+ },
+ "time": "2024-05-16T03:13:13+00:00"
},
{
- "package": "symfony/translation",
- "version": "dev-master",
- "source-reference": "4a5467c883b2f5791d4597ac74d67c5ccfd772f8",
- "commit-date": "1342207366"
+ "name": "myclabs/deep-copy",
+ "version": "1.13.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-01T08:46:24+00:00"
},
{
- "package": "symfony/yaml",
- "version": "dev-master",
- "alias-pretty-version": "2.1.x-dev",
- "alias-version": "2.1.9999999.9999999-dev"
+ "name": "phpat/phpat",
+ "version": "0.10.20",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/carlosas/phpat.git",
+ "reference": "55154db9c36d56aaae5de4bcddb7f5a1202f1910"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/carlosas/phpat/zipball/55154db9c36d56aaae5de4bcddb7f5a1202f1910",
+ "reference": "55154db9c36d56aaae5de4bcddb7f5a1202f1910",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^1.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "3.46",
+ "kubawerlos/php-cs-fixer-custom-fixers": "3.18",
+ "phpunit/phpunit": "^9.0 || ^10.0",
+ "vimeo/psalm": "^5.0"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "helpers.php"
+ ],
+ "psr-4": {
+ "PHPat\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Carlos Alandete Sastre",
+ "email": "carlos.alandete@gmail.com"
+ }
+ ],
+ "description": "PHP Architecture Tester",
+ "support": {
+ "issues": "https://github.com/carlosas/phpat/issues",
+ "source": "https://github.com/carlosas/phpat/tree/0.10.20"
+ },
+ "time": "2024-11-23T21:56:24+00:00"
},
{
- "package": "symfony/yaml",
- "version": "dev-master",
- "source-reference": "84ec179dc8ecc36c84b3ccbd88901f867b8746a2",
- "commit-date": "1342207366"
+ "name": "phpspec/prophecy",
+ "version": "v1.22.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "35f1adb388946d92e6edab2aa2cb2b60e132ebd5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/35f1adb388946d92e6edab2aa2cb2b60e132ebd5",
+ "reference": "35f1adb388946d92e6edab2aa2cb2b60e132ebd5",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2 || ^2.0",
+ "php": "^7.4 || 8.0.* || 8.1.* || 8.2.* || 8.3.* || 8.4.*",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.40",
+ "phpspec/phpspec": "^6.0 || ^7.0",
+ "phpstan/phpstan": "^2.1.13",
+ "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "dev",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/v1.22.0"
+ },
+ "time": "2025-04-29T14:58:06+00:00"
+ },
+ {
+ "name": "phpspec/prophecy-phpunit",
+ "version": "v2.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy-phpunit.git",
+ "reference": "89f91b01d0640b7820e427e02a007bc6489d8a26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/89f91b01d0640b7820e427e02a007bc6489d8a26",
+ "reference": "89f91b01d0640b7820e427e02a007bc6489d8a26",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3 || ^8",
+ "phpspec/prophecy": "^1.18",
+ "phpunit/phpunit": "^9.1 || ^10.1 || ^11.0 || ^12.0 || ^13.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.10"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\PhpUnit\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christophe Coevoet",
+ "email": "stof@notk.org"
+ }
+ ],
+ "description": "Integrating the Prophecy mocking library in PHPUnit test cases",
+ "homepage": "http://phpspec.net",
+ "keywords": [
+ "phpunit",
+ "prophecy"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy-phpunit/issues",
+ "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.5.0"
+ },
+ "time": "2026-02-09T15:40:55+00:00"
+ },
+ {
+ "name": "phpstan/extension-installer",
+ "version": "1.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/extension-installer.git",
+ "reference": "85e90b3942d06b2326fba0403ec24fe912372936"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936",
+ "reference": "85e90b3942d06b2326fba0403ec24fe912372936",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.0",
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.9.0 || ^2.0"
+ },
+ "require-dev": {
+ "composer/composer": "^2.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2.0",
+ "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PHPStan\\ExtensionInstaller\\Plugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\ExtensionInstaller\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Composer plugin for automatic installation of PHPStan extensions",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpstan/extension-installer/issues",
+ "source": "https://github.com/phpstan/extension-installer/tree/1.4.3"
+ },
+ "time": "2024-09-04T20:21:43+00:00"
+ },
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.12.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "ceb937fb39a92deabc02d20709cf14b2c452502c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ceb937fb39a92deabc02d20709cf14b2c452502c",
+ "reference": "ceb937fb39a92deabc02d20709cf14b2c452502c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2024-11-10T17:10:04+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-webmozart-assert",
+ "version": "1.2.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-webmozart-assert.git",
+ "reference": "960dd44e8466191590dd0d7940d3e9496eebebbd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-webmozart-assert/zipball/960dd44e8466191590dd0d7940d3e9496eebebbd",
+ "reference": "960dd44e8466191590dd0d7940d3e9496eebebbd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.12"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^4.13.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-deprecation-rules": "^1.2",
+ "phpstan/phpstan-phpunit": "^1.4",
+ "phpstan/phpstan-strict-rules": "^1.6",
+ "phpunit/phpunit": "^9.5",
+ "webmozart/assert": "^1.11.0"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan webmozart/assert extension",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-webmozart-assert/issues",
+ "source": "https://github.com/phpstan/phpstan-webmozart-assert/tree/1.2.11"
+ },
+ "time": "2024-09-11T15:48:08+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "10.1.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "7e308268858ed6baedc8704a304727d20bc07c77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77",
+ "reference": "7e308268858ed6baedc8704a304727d20bc07c77",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
+ "php": ">=8.1",
+ "phpunit/php-file-iterator": "^4.1.0",
+ "phpunit/php-text-template": "^3.0.1",
+ "sebastian/code-unit-reverse-lookup": "^3.0.0",
+ "sebastian/complexity": "^3.2.0",
+ "sebastian/environment": "^6.1.0",
+ "sebastian/lines-of-code": "^2.0.2",
+ "sebastian/version": "^4.0.1",
+ "theseer/tokenizer": "^1.2.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.1"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "10.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-22T04:31:57+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c",
+ "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-31T06:24:48+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:56:09+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+ "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-31T14:07:24+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:57:52+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "10.5.63",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "33198268dad71e926626b618f3ec3966661e4d90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90",
+ "reference": "33198268dad71e926626b618f3ec3966661e4d90",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.13.4",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=8.1",
+ "phpunit/php-code-coverage": "^10.1.16",
+ "phpunit/php-file-iterator": "^4.1.0",
+ "phpunit/php-invoker": "^4.0.0",
+ "phpunit/php-text-template": "^3.0.1",
+ "phpunit/php-timer": "^6.0.0",
+ "sebastian/cli-parser": "^2.0.1",
+ "sebastian/code-unit": "^2.0.0",
+ "sebastian/comparator": "^5.0.5",
+ "sebastian/diff": "^5.1.1",
+ "sebastian/environment": "^6.1.0",
+ "sebastian/exporter": "^5.1.4",
+ "sebastian/global-state": "^6.0.2",
+ "sebastian/object-enumerator": "^5.0.0",
+ "sebastian/recursion-context": "^5.0.1",
+ "sebastian/type": "^4.0.0",
+ "sebastian/version": "^4.0.1"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "10.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-01-27T05:48:37+00:00"
+ },
+ {
+ "name": "rector/rector",
+ "version": "1.2.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/rectorphp/rector.git",
+ "reference": "40f9cf38c05296bd32f444121336a521a293fa61"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61",
+ "reference": "40f9cf38c05296bd32f444121336a521a293fa61",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "phpstan/phpstan": "^1.12.5"
+ },
+ "conflict": {
+ "rector/rector-doctrine": "*",
+ "rector/rector-downgrade-php": "*",
+ "rector/rector-phpunit": "*",
+ "rector/rector-symfony": "*"
+ },
+ "suggest": {
+ "ext-dom": "To manipulate phpunit.xml via the custom-rule command"
+ },
+ "bin": [
+ "bin/rector"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Instant Upgrade and Automated Refactoring of any PHP code",
+ "keywords": [
+ "automation",
+ "dev",
+ "migration",
+ "refactoring"
+ ],
+ "support": {
+ "issues": "https://github.com/rectorphp/rector/issues",
+ "source": "https://github.com/rectorphp/rector/tree/1.2.10"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/tomasvotruba",
+ "type": "github"
+ }
+ ],
+ "time": "2024-11-08T13:59:10+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+ "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T07:12:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:58:43+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:59:15+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "5.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d",
+ "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/diff": "^5.0",
+ "sebastian/exporter": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-01-24T09:25:16+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "68ff824baeae169ec9f2137158ee529584553799"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799",
+ "reference": "68ff824baeae169ec9f2137158ee529584553799",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-21T08:37:17+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "5.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0",
+ "symfony/process": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T07:15:17+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "6.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
+ "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "https://github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "security": "https://github.com/sebastianbergmann/environment/security/policy",
+ "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-23T08:47:14+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "5.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "0735b90f4da94969541dac1da743446e276defa6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6",
+ "reference": "0735b90f4da94969541dac1da743446e276defa6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-09-24T06:09:11+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+ "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "https://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T07:19:19+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0",
+ "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-21T08:38:20+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:08:32+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:06:18+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "5.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a",
+ "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T07:50:56+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:10:45+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-07T11:34:05+00:00"
+ },
+ {
+ "name": "slevomat/coding-standard",
+ "version": "8.16.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/slevomat/coding-standard.git",
+ "reference": "490023f23813483b5f75381c4ee07d26d9edced1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/490023f23813483b5f75381c4ee07d26d9edced1",
+ "reference": "490023f23813483b5f75381c4ee07d26d9edced1",
+ "shasum": ""
+ },
+ "require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0",
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpdoc-parser": "^2.1.0",
+ "squizlabs/php_codesniffer": "^3.11.3"
+ },
+ "require-dev": {
+ "phing/phing": "3.0.1",
+ "php-parallel-lint/php-parallel-lint": "1.4.0",
+ "phpstan/phpstan": "2.1.6",
+ "phpstan/phpstan-deprecation-rules": "2.0.1",
+ "phpstan/phpstan-phpunit": "2.0.4",
+ "phpstan/phpstan-strict-rules": "2.0.3",
+ "phpunit/phpunit": "9.6.8|10.5.45|11.4.4|11.5.9|12.0.4"
+ },
+ "type": "phpcodesniffer-standard",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SlevomatCodingStandard\\": "SlevomatCodingStandard/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
+ "keywords": [
+ "dev",
+ "phpcs"
+ ],
+ "support": {
+ "issues": "https://github.com/slevomat/coding-standard/issues",
+ "source": "https://github.com/slevomat/coding-standard/tree/8.16.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kukulich",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-23T16:33:42+00:00"
+ },
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "3.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
+ "reference": "2d1b63db139c3c6ea0c927698e5160f8b3b8d630"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/2d1b63db139c3c6ea0c927698e5160f8b3b8d630",
+ "reference": "2d1b63db139c3c6ea0c927698e5160f8b3b8d630",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4"
+ },
+ "bin": [
+ "bin/phpcbf",
+ "bin/phpcs"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Sherwood",
+ "role": "Former lead"
+ },
+ {
+ "name": "Juliette Reinders Folmer",
+ "role": "Current lead"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors"
+ }
+ ],
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+ "keywords": [
+ "phpcs",
+ "standards",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues",
+ "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy",
+ "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+ "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/phpcsstandards",
+ "type": "thanks_dev"
+ }
+ ],
+ "time": "2025-03-18T05:04:51+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v6.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7",
+ "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/console": "<5.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/error-handler": "^6.3|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.7"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:22:46+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "b7489ce515e168639d17feec34b8847c326b0b3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c",
+ "reference": "b7489ce515e168639d17feec34b8847c326b0b3c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2025-11-17T20:03:58+00:00"
+ },
+ {
+ "name": "vincentlanglet/twig-cs-fixer",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git",
+ "reference": "366f7cca494a6f95c5f410ae542aef9c164d329e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/366f7cca494a6f95c5f410ae542aef9c164d329e",
+ "reference": "366f7cca494a6f95c5f410ae542aef9c164d329e",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.0.0",
+ "ext-ctype": "*",
+ "php": ">=8.1",
+ "symfony/console": "^5.4.9 || ^6.4 || ^7.0 || ^8.0",
+ "symfony/filesystem": "^5.4 || ^6.4 || ^7.0 || ^8.0",
+ "symfony/finder": "^5.4 || ^6.4 || ^7.0 || ^8.0",
+ "symfony/string": "^5.4.42 || ^6.4.10 || ~7.0.10 || ^7.1.3 || ^8.0",
+ "twig/twig": "^3.15",
+ "webmozart/assert": "^1.10 || ^2.0"
+ },
+ "require-dev": {
+ "composer/semver": "^3.2.0",
+ "dereuromark/composer-prefer-lowest": "^0.1.10",
+ "ergebnis/composer-normalize": "^2.29",
+ "friendsofphp/php-cs-fixer": "^3.13.0",
+ "infection/infection": "^0.26.16 || ^0.32.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpstan/phpstan-symfony": "^2.0",
+ "phpstan/phpstan-webmozart-assert": "^2.0",
+ "phpunit/phpunit": "^9.5.26 || ^11.5.18 || ^12.1.3",
+ "rector/rector": "^2.0.0",
+ "shipmonk/composer-dependency-analyser": "^1.6",
+ "symfony/process": "^5.4 || ^6.4 || ^7.0 || ^8.0",
+ "symfony/twig-bridge": "^5.4 || ^6.4 || ^7.0 || ^8.0",
+ "symfony/ux-twig-component": "^2.2.0",
+ "twig/cache-extra": "^3.2"
+ },
+ "bin": [
+ "bin/twig-cs-fixer"
+ ],
+ "type": "coding-standard",
+ "autoload": {
+ "psr-4": {
+ "TwigCsFixer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Vincent Langlet"
+ }
+ ],
+ "description": "A tool to automatically fix Twig code style",
+ "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer",
+ "support": {
+ "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues",
+ "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/VincentLanglet",
+ "type": "github"
+ }
+ ],
+ "time": "2026-06-18T15:31:27+00:00"
}
],
- "aliases": [
-
- ],
- "minimum-stability": "dev",
- "stability-flags": {
- "nikic/php-parser": 20,
- "phpdocumentor/fileset": 10,
- "behat/behat": 0
- }
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1",
+ "ext-ctype": "*",
+ "ext-hash": "*",
+ "ext-iconv": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "ext-xml": "*"
+ },
+ "platform-dev": {},
+ "platform-overrides": {
+ "php": "8.1.2"
+ },
+ "plugin-api-version": "2.9.0"
}
diff --git a/config.subsplit-publish.json b/config.subsplit-publish.json
new file mode 100644
index 0000000000..9f7b3ac76d
--- /dev/null
+++ b/config.subsplit-publish.json
@@ -0,0 +1,10 @@
+{
+ "sub-splits": [
+ {
+ "name": "json-path",
+ "directory": "incubator/json-path",
+ "target": "git@github.com:phpDocumentor/json-path.git",
+ "target-branch": "main"
+ }
+ ]
+}
diff --git a/config/guides.yaml b/config/guides.yaml
new file mode 100644
index 0000000000..f36197dfe5
--- /dev/null
+++ b/config/guides.yaml
@@ -0,0 +1,32 @@
+###################################################################################
+## Guides - EXPERIMENTAL ##########################################################
+###################################################################################
+
+services:
+ _defaults:
+ autowire: true
+ autoconfigure: true
+ public: false
+
+ phpDocumentor\Pipeline\Stage\Parser\ParseGuides:
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.parse', priority: 0 }
+
+ phpdoc.guides.noderenderer.html.phpreference:
+ class: phpDocumentor\Guides\NodeRenderers\TemplateNodeRenderer
+ arguments:
+ $renderer: '@phpDocumentor\Guides\TemplateRenderer'
+ $template: 'inline/phpreference.html.twig'
+ $nodeClass: 'phpDocumentor\Guides\Nodes\InlineToken\PHPReferenceNode'
+ tags:
+ - 'phpdoc.guides.noderenderer.html'
+
+# phpDocumentor\Pipeline\Stage\Cache\LoadGuidesFromCache:
+# tags:
+# - { name: 'phpdoc.pipeline.api_documentation.parse', priority: 2000 }
+# - { name: 'phpdoc.pipeline.api_documentation.transform', priority: 5000 }
+#
+# phpDocumentor\Pipeline\Stage\Cache\StoreGuidesToCache:
+# tags:
+# - { name: 'phpdoc.pipeline.api_documentation.parse', priority: -1000 }
+#
diff --git a/config/pipelines.yaml b/config/pipelines.yaml
new file mode 100644
index 0000000000..4e70eaf17e
--- /dev/null
+++ b/config/pipelines.yaml
@@ -0,0 +1,50 @@
+services:
+ phpDocumentor\Pipeline\PipelineFactory: ~
+
+ # Will call all pipeline and stages tagged with 'phpdoc.pipeline.api_documentation.generate',
+ # this includes both the parse and transform pipeline
+ phpdoc.pipeline.complete:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.api_documentation.generate]
+
+ phpdoc.pipeline.configuration:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.application.configuration]
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.generate', priority: 10000 }
+
+ phpdoc.pipeline.parse:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.api_documentation.parse]
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.generate', priority: 8000 }
+
+ phpdoc.pipeline.parse_api_documentation_set:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.api_documentation.parse_api_documentation_set]
+
+ phpdoc.pipeline.compile:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.compile ]
+
+ phpdoc.pipeline.compile.api_documentation:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.api_documentation.compile]
+
+ phpdoc.pipeline.compile.guides:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.guides.compile]
+
+ phpdoc.pipeline.transform:
+ class: 'League\Pipeline\Pipeline'
+ factory: ['@phpDocumentor\Pipeline\PipelineFactory', 'create']
+ arguments: [!tagged phpdoc.pipeline.api_documentation.transform]
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.generate', priority: 5000 }
diff --git a/config/reflection.yaml b/config/reflection.yaml
new file mode 100644
index 0000000000..03961b30b6
--- /dev/null
+++ b/config/reflection.yaml
@@ -0,0 +1,68 @@
+services:
+ _defaults:
+ autowire: true
+ autoconfigure: true
+ bind:
+ $reducers: !tagged_iterator phpdoc.reflection.reducer
+
+ _instanceof:
+ phpDocumentor\Reflection\Php\ProjectFactoryStrategy:
+ tags: ['phpdoc.reflection.strategy']
+ phpDocumentor\Reflection\Php\Factory\Reducer\Reducer:
+ tags: ['phpdoc.reflection.reducer']
+
+ phpDocumentor\Reflection\Php\:
+ resource: '%vendor_dir%/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php'
+
+ phpDocumentor\Reflection\Php\NodesFactory:
+ class: phpDocumentor\Reflection\Php\NodesFactory
+ factory: [ phpDocumentor\Reflection\Php\NodesFactory, 'createInstance' ]
+
+ phpDocumentor\Reflection\Php\Expression\ExpressionPrinter: ~
+ phpDocumentor\Reflection\FqsenResolver: ~
+ phpDocumentor\Reflection\DocBlock\TagFactory: '@phpDocumentor\Reflection\DocBlock\StandardTagFactory'
+ phpDocumentor\Reflection\DocBlock\StandardTagFactory:
+ calls:
+ - [ 'addService', [ '@phpDocumentor\Reflection\DocBlock\DescriptionFactory' ] ]
+ - [ 'addService', [ '@phpDocumentor\Reflection\TypeResolver' ] ]
+ phpDocumentor\Reflection\TypeResolver: ~
+ phpDocumentor\Reflection\DocBlock\DescriptionFactory: ~
+ phpDocumentor\Reflection\DocBlockFactoryInterface:
+ class: phpDocumentor\Reflection\DocBlockFactory
+ factory: [ \phpDocumentor\Reflection\DocBlockFactory, 'createInstance' ]
+
+ phpDocumentor\Reflection\Php\Factory\ConstructorPromotion:
+ arguments:
+ $methodStrategy: '@phpDocumentor\Reflection\Php\Factory\Method'
+ tags:
+ - name: 'phpdoc.reflection.strategy'
+ priority: 1100
+
+ phpDocumentor\Reflection\Php\Factory\Noop:
+ tags:
+ - name: 'phpdoc.reflection.strategy'
+ priority: -10000
+
+ phpDocumentor\Reflection\Php\Factory\File:
+ factory: [ phpDocumentor\Parser\FileFactory, 'createInstance' ]
+ arguments:
+ $middlewares: !tagged phpdoc.parser.middleware
+
+ phpDocumentor\Reflection\ProjectFactory:
+ class: phpDocumentor\Reflection\Php\ProjectFactory
+ arguments:
+ $strategies: '@phpDocumentor\Reflection\Php\ProjectFactoryStrategies'
+
+ phpDocumentor\Reflection\Php\Factory\Reducer\Parameter:
+ arguments:
+ $valueConverter: '@phpDocumentor\Reflection\Php\Expression\ExpressionPrinter'
+
+ phpDocumentor\Reflection\Php\ProjectFactoryStrategies:
+ arguments:
+ $strategies: []
+
+
+ ###################################################################################
+ ## Autoloading definitions for external services ##################################
+ ###################################################################################
+ PhpParser\PrettyPrinter\Standard: ~
diff --git a/config/routes.yaml b/config/routes.yaml
new file mode 100644
index 0000000000..5d1381adb9
--- /dev/null
+++ b/config/routes.yaml
@@ -0,0 +1,16 @@
+document:
+ path: /{name}.html
+ requirements:
+ name: ".+"
+
+file:
+ path: /files/{name}.html
+
+package:
+ path: /packages/{name}.html
+
+namespace:
+ path: /namespaces/{name}.html
+
+class:
+ path: /classes/{name}.html
diff --git a/config/services.yaml b/config/services.yaml
new file mode 100644
index 0000000000..0d91c6befd
--- /dev/null
+++ b/config/services.yaml
@@ -0,0 +1,265 @@
+imports:
+ - { resource: 'pipelines.yaml' }
+ - { resource: 'reflection.yaml' }
+ - { resource: 'stages.yaml' }
+ - { resource: 'guides.yaml' }
+
+services:
+ _defaults:
+ autowire: true
+ autoconfigure: true
+ public: false
+ bind:
+ $defaultTemplateName: 'default'
+ $globalTemplatesPath: "@=service('phpDocumentor\\\\Application').templateDirectory()"
+ $servicesWithCustomSettings: !tagged_iterator app.with_custom_settings
+ _instanceof:
+ # Tag any service that implements WithCustomSettings so that we can auto-register them
+ # with the ProjectDescriptor
+ phpDocumentor\WithCustomSettings:
+ tags: ['app.with_custom_settings']
+
+ phpDocumentor\Descriptor\Filter\FilterInterface:
+ tags: ['phpdoc.descriptor.filter']
+
+ phpDocumentor\Transformer\Writer\WriterAbstract:
+ tags: ['phpdoc.transformer.writer']
+
+ ###################################################################################
+ ## Autoloading definitions for whole namespaces ###################################
+ ###################################################################################
+
+ phpDocumentor\:
+ resource: '../src/phpDocumentor/*'
+ exclude:
+ - '../src/phpDocumentor/Linker/Linker'
+ - '../src/phpDocumentor/Compiler'
+ - '../src/phpDocumentor/**/Messages'
+ - '../src/phpDocumentor/Pipeline/Stage'
+ - '../src/phpDocumentor/Transformer/**/{Event, Exception}/{**}'
+ - '../src/phpDocumentor/Guides/RenderCommand.php'
+ - '../src/phpDocumentor/Guides/Handlers/*Handler.php'
+
+ phpDocumentor\Console\:
+ resource: '../src/phpDocumentor/Console'
+
+ phpDocumentor\Parser\:
+ resource: '../src/phpDocumentor/Parser'
+ exclude: '../src/phpDocumentor/Parser/Middleware'
+
+ phpDocumentor\Parser\Middleware\:
+ resource: '../src/phpDocumentor/Parser/Middleware'
+ tags: [ { name: 'phpdoc.parser.middleware', priority: 1000 } ]
+
+ phpDocumentor\Transformer\:
+ resource: '../src/phpDocumentor/Transformer'
+ exclude: '../src/phpDocumentor/Transformer/**/{Event, Exception}/{**}'
+
+ ###################################################################################
+ ## Autoloading definitions for individual classes #################################
+ ###################################################################################
+
+ Twig\Loader\FilesystemLoader: ~
+ Twig\Environment:
+ arguments:
+ $loader: '@Twig\Loader\FilesystemLoader'
+
+ application:
+ alias: 'phpDocumentor\Application'
+ public: true
+
+ phpDocumentor\Application:
+ public: true
+
+ phpDocumentor\Console\Command\Project\RunCommand:
+ arguments:
+ - '@phpDocumentor\ProjectDescriptorBuilder'
+ - '@phpdoc.pipeline.complete'
+ tags: [ { name: 'console.command' } ]
+ public: true
+
+ phpDocumentor\Console\Command\Project\ListSettingsCommand:
+ tags: [ { name: 'console.command' } ]
+ public: true
+
+ phpDocumentor\Descriptor\Builder\AssemblerFactory:
+ class: 'phpDocumentor\Descriptor\Builder\AssemblerFactory'
+ factory: ['phpDocumentor\Descriptor\Builder\AssemblerFactory', 'createDefault']
+
+ phpDocumentor\Descriptor\Filter\Filter:
+ arguments:
+ - !tagged_iterator 'phpdoc.descriptor.filter'
+
+ phpDocumentor\Configuration\Configuration:
+ factory: ['@phpDocumentor\Configuration\ConfigurationFactory', 'fromDefaultLocations']
+
+ phpDocumentor\Configuration\ConfigurationFactory:
+ arguments:
+ $defaultFiles:
+ - "@=service('application').getWorkingDir() ~ '/phpdoc.xml'"
+ - "@=service('application').getWorkingDir() ~ '/phpdoc.dist.xml'"
+ - "@=service('application').getWorkingDir() ~ '/phpdoc.xml.dist'"
+ - "@=service('application').getWorkingDir() ~ '/.phpdoc.xml.dist'"
+ - "@=service('application').getWorkingDir() ~ '/.phpdoc.xml'"
+ - "@=service('application').getWorkingDir() ~ '/.phpdoc.dist.xml'"
+ $symfonyConfigFactory: '@phpDocumentor\Configuration\SymfonyConfigFactory'
+
+ phpDocumentor\Configuration\SymfonyConfigFactory:
+ arguments:
+ $definitions:
+ '2': '@phpDocumentor\Configuration\Definition\Version2'
+ '3': '@phpDocumentor\Configuration\Definition\Version3'
+
+ phpDocumentor\Parser\Parser: ~
+
+ phpDocumentor\Reflection\DocBlock\ExampleFinder: ~
+
+ phpDocumentor\JsonPath\Executor: ~
+ phpdoc.jsonpath.parser:
+ class: phpDocumentor\JsonPath\Parser
+ factory: ['phpDocumentor\JsonPath\Parser', 'createInstance']
+
+ phpDocumentor\Query\Engine:
+ arguments:
+ $parser: '@phpdoc.jsonpath.parser'
+
+ phpDocumentor\Parser\Middleware\StopwatchMiddleware:
+ tags: [ { name: 'phpdoc.parser.middleware', priority: 5000 } ]
+
+ # Increments the progress bar; by placing it in front of the cache you see the progress bar
+ # increment, even while we only consume the cache
+ phpDocumentor\Parser\Middleware\EmittingMiddleware:
+ tags: [ { name: 'phpdoc.parser.middleware', priority: 4500 } ]
+
+ phpDocumentor\Parser\Middleware\CacheMiddleware:
+ arguments:
+ $cache: '@files'
+ tags: [ { name: 'phpdoc.parser.middleware', priority: 4000 } ]
+
+ phpDocumentor\Parser\Middleware\ErrorHandlingMiddleware:
+ tags: [ { name: 'phpdoc.parser.middleware', priority: 3000 } ]
+
+ phpDocumentor\Parser\Middleware\ReEncodingMiddleware:
+ tags: [ { name: 'phpdoc.parser.middleware', priority: 2000 } ]
+
+ phpDocumentor\Cache\ProjectDescriptorMapper:
+ arguments:
+ $cache: '@descriptors'
+
+ phpDocumentor\Parser\Cache\Locator:
+ arguments:
+ $files: '@files'
+ $descriptors: '@descriptors'
+
+ phpDocumentor\Extension\ExtensionHandler:
+ factory: [ '\phpDocumentor\Extension\ExtensionHandler', 'getInstance' ]
+
+ ###################################################################################
+ ## Autoloading definitions for external services ##################################
+ ###################################################################################
+
+ files:
+ class: phpDocumentor\Parser\Cache\FilesystemAdapter
+
+ descriptors:
+ class: phpDocumentor\Parser\Cache\FilesystemAdapter
+
+ Monolog\Logger:
+ public: true
+ arguments:
+ $name: 'app'
+ $processors:
+ - '@Monolog\Processor\PsrLogMessageProcessor'
+
+ Monolog\Processor\PsrLogMessageProcessor: ~
+ Psr\Log\LoggerInterface:
+ alias: 'Monolog\Logger'
+ public: true
+
+ Symfony\Component\EventDispatcher\EventDispatcher:
+ public: true
+ Symfony\Contracts\EventDispatcher\EventDispatcherInterface: '@Symfony\Component\EventDispatcher\EventDispatcher'
+ Psr\EventDispatcher\EventDispatcherInterface: '@Symfony\Contracts\EventDispatcher\EventDispatcherInterface'
+
+ Symfony\Component\Stopwatch\Stopwatch: ~
+
+ League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension:
+ tags: ['commonmark.extension']
+
+ League\CommonMark\Extension\Table\TableExtension:
+ tags: ['commonmark.extension']
+
+ Twig\Extra\String\StringExtension:
+ tags: ['twig.extension']
+
+ League\CommonMark\ConverterInterface: '@League\CommonMark\CommonMarkConverter'
+ League\CommonMark\CommonMarkConverter:
+ factory: ['@phpDocumentor\Transformer\Writer\Twig\CommonMarkFactory', 'createConverter']
+ arguments:
+ - !tagged 'commonmark.extension'
+
+
+ ###################################################################################
+ ## Writers ########################################################################
+ ###################################################################################
+
+ phpDocumentor\Transformer\Writer\Twig\EnvironmentFactory:
+ arguments:
+ $guidesTemplateBasePath: '%phpdoc.guides.base_template_paths%'
+ $extensions: !tagged_iterator { tag: 'twig.extension' }
+
+ phpDocumentor\Transformer\Writer\Collection:
+ arguments: [!tagged_iterator { tag: 'phpdoc.transformer.writer' }]
+
+ ###################################################################################
+ ## Guides ########################################################################
+ ###################################################################################
+
+ phpDocumentor\Guides\RestructuredText\TextRoles\PHPReference:
+ tags:
+ - { name: 'phpdoc.guides.parser.rst.text_role', 'domain': 'php'}
+
+
+ phpDocumentor\Guides\Compiler\NodeTransformer\PHPReferenceNodeTransformer:
+ tags:
+ - { name: 'phpdoc.guides.compiler.nodeTransformers'}
+
+ phpDocumentor\Guides\Compiler\NodeTransformer\ClassListNodeTransformer:
+ tags:
+ - { name: 'phpdoc.guides.compiler.nodeTransformers'}
+
+
+ phpDocumentor\Guides\Compiler\NodeTransformer\ClassDiagramNodeTransformer:
+ tags:
+ - { name: 'phpdoc.guides.compiler.nodeTransformers'}
+
+ phpDocumentor\Guides\RestructuredText\Directives\PHPClassList:
+ arguments:
+ $startingRule: '@phpDocumentor\Guides\RestructuredText\Parser\Productions\DirectiveContentRule'
+ tags:
+ - { name: 'phpdoc.guides.directive' }
+
+ phpDocumentor\Guides\RestructuredText\Directives\PHPElementName:
+ tags:
+ - { name: 'phpdoc.guides.directive' }
+
+ phpDocumentor\Guides\RestructuredText\Directives\PHPElementSummary:
+ tags:
+ - { name: 'phpdoc.guides.directive' }
+
+ phpDocumentor\Guides\RestructuredText\Directives\PHPElementDescription:
+ tags:
+ - { name: 'phpdoc.guides.directive' }
+
+ phpDocumentor\Guides\RestructuredText\Directives\ClassDiagram:
+ tags:
+ - { name: 'phpdoc.guides.directive' }
+
+ phpDocumentor\Uml\PlantumlRenderer:
+ arguments:
+ $plantUmlBinaryPath: '%guides.graphs.plantuml_binary%'
+ tags:
+ - { name: 'phpdoc.guides.graph.renderer', 'alias': 'plantuml_smetana' }
+
+ phpDocumentor\FileSystem\Finder\SpecificationFactoryInterface:
+ class: phpDocumentor\FileSystem\Finder\SpecificationFactory
diff --git a/config/stages.yaml b/config/stages.yaml
new file mode 100644
index 0000000000..d0c7e54896
--- /dev/null
+++ b/config/stages.yaml
@@ -0,0 +1,191 @@
+parameters:
+ linker.substitutions:
+ 'phpDocumentor\Descriptor\ProjectDescriptor': ['files']
+ 'phpDocumentor\Descriptor\ApiSetDescriptor': ['files']
+ 'phpDocumentor\Descriptor\FileDescriptor':
+ - 'tags'
+ - 'classes'
+ - 'interfaces'
+ - 'traits'
+ - 'functions'
+ - 'constants'
+ 'phpDocumentor\Descriptor\ClassDescriptor':
+ - 'tags'
+ - 'parent'
+ - 'interfaces'
+ - 'constants'
+ - 'properties'
+ - 'methods'
+ - 'usedTraits'
+ - 'attributes'
+ 'phpDocumentor\Descriptor\InterfaceDescriptor':
+ - 'tags'
+ - 'parent'
+ - 'constants'
+ - 'methods'
+ - 'attributes'
+ 'phpDocumentor\Descriptor\TraitDescriptor':
+ - 'tags'
+ - 'properties'
+ - 'methods'
+ - 'usedTraits'
+ - 'attributes'
+ 'phpDocumentor\Descriptor\EnumDescriptor':
+ - 'tags'
+ - 'interfaces'
+ - 'cases'
+ - 'methods'
+ - 'usedTraits'
+ - 'attributes'
+ 'phpDocumentor\Descriptor\FunctionDescriptor':
+ - 'tags'
+ - 'arguments'
+ 'phpDocumentor\Descriptor\MethodDescriptor':
+ - 'tags'
+ - 'arguments'
+ - 'attributes'
+ 'phpDocumentor\Descriptor\ArgumentDescriptor':
+ - 'type'
+ 'phpDocumentor\Descriptor\PropertyDescriptor':
+ - 'tags'
+ - 'type'
+ - 'attributes'
+ 'phpDocumentor\Descriptor\ConstantDescriptor':
+ - 'tags'
+ - 'type'
+ - 'attributes'
+ 'phpDocumentor\Descriptor\AttributeDescriptor': ['attribute']
+ 'phpDocumentor\Descriptor\Tag\ParamDescriptor': ['type']
+ 'phpDocumentor\Descriptor\Tag\VarDescriptor': ['type']
+ 'phpDocumentor\Descriptor\Tag\ReturnDescriptor': ['type']
+ 'phpDocumentor\Descriptor\Tag\SeeDescriptor': ['reference']
+ 'phpDocumentor\Descriptor\Tag\UsesDescriptor': ['reference']
+ 'phpDocumentor\Descriptor\Tag\UsedByDescriptor': ['reference']
+
+services:
+ _defaults:
+ autowire: true
+ autoconfigure: true
+ _instanceof:
+ phpDocumentor\Compiler\Version\Pass\TableOfContentsBuilder\DocumentationSetBuilder:
+ tags: ['app.toc.documentation_set_builder']
+
+ phpDocumentor\Compiler\:
+ resource: '../src/phpDocumentor/Compiler'
+
+ phpDocumentor\Pipeline\Stage\Configure:
+ arguments:
+ $currentWorkingDir: "@=service('application').getWorkingDir()"
+ tags:
+ - { name: 'phpdoc.pipeline.application.configuration', priority: 10000 }
+
+ phpDocumentor\Parser\Cache\Locator: ~
+
+ phpDocumentor\Pipeline\Stage\TransformToPayload:
+ tags:
+ - { name: 'phpdoc.pipeline.application.configuration', priority: 9000 }
+
+ phpDocumentor\Pipeline\Stage\InitializeBuilderFromConfig:
+ tags:
+ - { name: 'phpdoc.pipeline.application.configuration', priority: 8000 }
+
+ ###################################################################################
+ ## Autoloading definitions for cache stages #################################
+ ###################################################################################
+
+ phpDocumentor\Pipeline\Stage\Cache\PurgeCachesWhenForced:
+ arguments:
+ $filesCache: '@files'
+ $descriptorsCache: '@descriptors'
+ tags:
+ - { name: 'phpdoc.pipeline.application.configuration', priority: 7000 }
+
+ phpDocumentor\Pipeline\Stage\Cache\LoadProjectDescriptorFromCache:
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.parse', priority: 2000 }
+ - { name: 'phpdoc.pipeline.api_documentation.transform', priority: 6000 }
+
+ phpDocumentor\Pipeline\Stage\Cache\StoreProjectDescriptorToCache:
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.parse', priority: -1000 }
+
+ ###################################################################################
+ ## Autoloading definitions for parser stages #################################
+ ###################################################################################
+
+ phpDocumentor\Pipeline\Stage\ParseApiDocumentationSets:
+ arguments:
+ $parseApiDocumentationSetPipeline: '@phpdoc.pipeline.parse_api_documentation_set'
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.parse', priority: 3000 }
+
+ phpDocumentor\Pipeline\Stage\Parser\CollectFiles:
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.parse_api_documentation_set', priority: 4000 }
+
+ phpDocumentor\Pipeline\Stage\Cache\GarbageCollectCache:
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.parse_api_documentation_set', priority: 3000 }
+
+ phpDocumentor\Pipeline\Stage\Parser\ParseFiles:
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.parse_api_documentation_set', priority: 0 }
+
+
+ ###################################################################################
+ ## Autoloading definitions for compiler version stages #########################
+ ###################################################################################
+
+ phpDocumentor\Compiler\Version\Pass\SetVersionPass:
+ tags:
+ - { name: 'phpdoc.pipeline.compile', priority: 10000 }
+
+ phpdoc.pipeline.compile.stage.api_documentation:
+ class: phpDocumentor\Pipeline\Stage\Compiler\DocumentationSetCompiler
+ arguments:
+ $compilerPipeline: '@phpdoc.pipeline.compile.api_documentation'
+ $type: '\phpDocumentor\Descriptor\ApiSetDescriptor'
+ tags:
+ - { name: 'phpdoc.pipeline.compile', priority: 3000 }
+
+ phpdoc.pipeline.compile.stage.guides:
+ class: phpDocumentor\Pipeline\Stage\Compiler\DocumentationSetCompiler
+ arguments:
+ $compilerPipeline: '@phpdoc.pipeline.compile.guides'
+ $type: '\phpDocumentor\Descriptor\GuideSetDescriptor'
+ tags:
+ - { name: 'phpdoc.pipeline.compile', priority: 2000 }
+
+ phpDocumentor\Compiler\Version\Pass\TableOfContentsBuilder:
+ arguments:
+ $builders: !tagged_iterator 'app.toc.documentation_set_builder'
+ tags:
+ - { name: 'phpdoc.pipeline.compile', priority: 1000 }
+
+ ###################################################################################
+ ## Autoloading definitions for compiler stages #################################
+ ###################################################################################
+ phpDocumentor\Compiler\ApiDocumentation\Linker\Linker:
+ arguments: ['%linker.substitutions%']
+
+ ###################################################################################
+ ## Autoloading definitions for compiler guides stages #########################
+ ###################################################################################
+
+ phpDocumentor\Compiler\Guides\Pass\GuidesCompiler:
+ tags:
+ - { name: 'phpdoc.pipeline.guides.compile', priority: 3000 }
+
+ ###################################################################################
+ ## Autoloading definitions for transform stages #################################
+ ###################################################################################
+
+ phpDocumentor\Pipeline\Stage\Compile:
+ arguments:
+ $compilerPipeline: '@phpdoc.pipeline.compile'
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.transform', priority: 5000 }
+
+ phpDocumentor\Pipeline\Stage\Transform:
+ tags:
+ - { name: 'phpdoc.pipeline.api_documentation.transform', priority: 0 }
diff --git a/cypress.config.js b/cypress.config.js
new file mode 100644
index 0000000000..1ad656e909
--- /dev/null
+++ b/cypress.config.js
@@ -0,0 +1,11 @@
+const { defineConfig } = require('cypress')
+
+module.exports = defineConfig({
+ e2e:{
+ projectId: "ifc328",
+ supportFile: false,
+ specPattern: "**/*.spec.js",
+ retries: 2,
+ defaultCommandTimeout: 10000
+ }
+})
diff --git a/cypress/integration/clean/frontpage.spec.js b/cypress/integration/clean/frontpage.spec.js
new file mode 100644
index 0000000000..2f8f09177b
--- /dev/null
+++ b/cypress/integration/clean/frontpage.spec.js
@@ -0,0 +1,9 @@
+describe('Frontpage', function() {
+ beforeEach(function(){
+ cy.visit('build/clean/index.html');
+ });
+
+ it('Has the "Marios" namespace in the main content', function() {
+ cy.get('.content.namespace').contains("Marios");
+ });
+});
diff --git a/cypress/integration/default/classes.spec.js b/cypress/integration/default/classes.spec.js
new file mode 100644
index 0000000000..2457107225
--- /dev/null
+++ b/cypress/integration/default/classes.spec.js
@@ -0,0 +1,138 @@
+import sidebar from './sidebar.inc';
+import search from './search.inc';
+import {getToc, getTocEntry} from './helpers/tableOfContents.lib';
+import {getEntryIn, getSummaryEntry} from './helpers/onThisPage.lib';
+
+describe('Classes', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Pizzeria.html');
+ });
+
+ describe('Search', search);
+ describe('In the sidebar', sidebar);
+
+ describe('Breadcrumb', function() {
+ it('Has a breadcrumb featuring "Marios"', function() {
+ cy.get('.phpdocumentor-breadcrumb').should('have.length', 2);
+ cy.get('.phpdocumentor-breadcrumb').contains('Marios');
+ });
+
+ it('will send you to the namespace page when clicking on "Marios" in the breadcrumb', function() {
+ cy.get('.phpdocumentor-breadcrumb')
+ .contains("Marios")
+ .click();
+ cy.url().should('include', '/namespaces/marios.html');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Page title includes the fully qualified class name', function () {
+ cy.title().should('match', /\u00bb \\Marios\\Pizzeria\s*$/);
+ });
+
+ it('Has "Pizzeria" as title', function () {
+ cy.get('.phpdocumentor-content__title').contains('Pizzeria');
+ });
+
+ it('Shows a single implemented interface; which is not clickable because it is external', function () {
+ cy.get('.phpdocumentor-element__implements').contains("JsonSerializable");
+ cy.get('.phpdocumentor-element__implements abbr')
+ .should("have.attr", 'title', '\\JsonSerializable');
+ });
+
+ it('Has a summary', function () {
+ cy.get('.phpdocumentor-element.-class > .phpdocumentor-summary')
+ .contains("Entrypoint for this pizza ordering application.");
+ });
+
+ it('Has a description', function () {
+ cy.get('.phpdocumentor-element.-class > .phpdocumentor-description')
+ .contains('This class provides an interface through which you can order pizza\'s and pasta\'s from Mario\'s Pizzeria.');
+ });
+
+ it('Shows a class is readonly', function () {
+ cy.visit('build/default/classes/Marios-Pizza.html');
+ cy.get('.phpdocumentor-element.-class .phpdocumentor-label')
+ .contains('Read only');
+ });
+
+ it('Shows a class is final', function () {
+ cy.visit('build/default/classes/Marios-Pizza.html');
+ cy.get('.phpdocumentor-element.-class .phpdocumentor-label')
+ .contains('Final');
+ });
+
+ it('Shows a class is abstract', function () {
+ cy.visit('build/default/classes/Marios-Pizza-Topping.html');
+ cy.get('.phpdocumentor-element.-class .phpdocumentor-label')
+ .contains('Abstract');
+ });
+
+ describe('Shows tags', function () {
+ it('Shows the tags section', function () {
+ cy.get('.phpdocumentor-tag-list__heading')
+ .contains("Tags")
+ })
+
+ it('Shows link without description', function () {
+ cy.get('.phpdocumentor-element.-class > .phpdocumentor-tag-list >.phpdocumentor-tag-list__definition > a')
+ .contains('https://wwww.phpdoc.org')
+ .should('have.attr', 'href', 'https://wwww.phpdoc.org')
+ });
+
+ it('Shows link with description', function () {
+ cy.get('.phpdocumentor-element.-class > .phpdocumentor-tag-list >.phpdocumentor-tag-list__definition > a')
+ .contains('docs')
+ .parent()
+ .should('have.attr', 'href', 'https://docs.phpdoc.org')
+ });
+
+ it('Groups repeated tags under a single entry with one definition per occurrence', function () {
+ cy.get('.phpdocumentor-element.-class > .phpdocumentor-tag-list > .phpdocumentor-tag-list__entry')
+ .as('entries')
+ .should('have.length', 2);
+ cy.get('@entries').eq(0)
+ .should('contain', 'link')
+ .next('.phpdocumentor-tag-list__definition')
+ .should('contain', 'https://wwww.phpdoc.org')
+ .next('.phpdocumentor-tag-list__definition')
+ .should('contain', 'docs');
+ cy.get('@entries').eq(1)
+ .should('contain', 'since')
+ .next('.phpdocumentor-tag-list__definition')
+ .should('contain', '3.0')
+ .next('.phpdocumentor-tag-list__definition')
+ .should('contain', '3.1')
+ .and('contain', 'Does extra stuff');
+ });
+ });
+ });
+
+ describe('Table of Contents', function() {
+ it('Shows methods with their return type and visibility', function() {
+ getTocEntry(getToc('methods', 'Methods'), 'jsonSerialize()')
+ .should('have.class', '-method')
+ .and('have.class', '-public')
+ .and('contain', ': array'); // type including generic arguments
+ });
+ });
+
+ describe('On This Page', function() {
+ it('renders links to the summary items', function() {
+ getSummaryEntry('Methods').should('exist');
+ });
+ it('renders references to methods on this page', function() {
+ getEntryIn('Methods', 'jsonSerialize()').should('exist');
+ getEntryIn('Methods', 'order()').should('exist');
+ getEntryIn('Methods', 'doOrder()').should('exist');
+ });
+ });
+
+ describe('Applying a trait', function() {
+ // FIXME: This is a bug in the application; the method is not imported
+ it.skip('Use method with an alias and changed visibility', function() {
+ cy.get('.phpdocumentor-table-of-contents__entry')
+ .contains('myPrivateHello()');
+ });
+ });
+});
diff --git a/cypress/integration/default/constants.spec.js b/cypress/integration/default/constants.spec.js
new file mode 100644
index 0000000000..c57af5e680
--- /dev/null
+++ b/cypress/integration/default/constants.spec.js
@@ -0,0 +1,203 @@
+import {getElementWithName} from "./helpers/elements.lib";
+
+describe('Showing constants for a class', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Pizza.html');
+ });
+
+ describe('Synopsis', function() {
+ it('Show the name', function() {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .should('be.visible');
+ });
+
+ it('Can be marked "public" (visibility) to influence styling', function () {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .should('have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "protected" (visibility) to influence styling', function() {
+ getElementWithName('constant', 'TYPE_AMERICAN')
+ .should('not.have.class', '-public')
+ .and('have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "private" (visibility) to influence styling', function() {
+ getElementWithName('constant', 'TYPE_HYBRID')
+ .should('not.have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('have.class', '-private');
+ });
+
+ it('Show the file name where the constant is located in the project', function() {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pizza.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/Pizza.php');
+ });
+
+ it('Links to the file documentation wherein the constant is', function() {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pizza.php')
+ .should('have.attr', 'href', 'files/src-pizza.html');
+ });
+
+ it('Show the line number where the constant is located', function() {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .find('.phpdocumentor-element-found-in__line')
+ .should((element) => {
+ expect(parseInt(element.text())).to.be.at.least(1);
+ });
+ });
+ });
+
+ describe('Signature', function() {
+ it('Can show the "public" visibility specifier', function() {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public');
+ });
+
+ it('Can show the "protected" visibility specifier', function() {
+ getElementWithName('constant', 'TYPE_AMERICAN')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('protected');
+ });
+
+ it('Can show the "private" visibility specifier', function() {
+ getElementWithName('constant', 'TYPE_HYBRID')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('private');
+ });
+
+ it('has the deprecated modifier', function() {
+ getElementWithName('constant', 'TYPE_AMERICAN')
+ .find('.phpdocumentor-signature')
+ .should('have.class', '-deprecated');
+ });
+
+ it('Shows the name of the constant', function() {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .find('.phpdocumentor-signature__name')
+ .contains('TYPE_ITALIAN');
+ });
+
+ it('Shows the type', function() {
+ getElementWithName('constant', 'TYPE_AMERICAN')
+ .find('.phpdocumentor-signature__type')
+ .contains('string');
+ });
+
+ it('Type defaults to mixed when unable to infer', function() {
+ getElementWithName('constant', 'TYPE_ITALIAN')
+ .find('.phpdocumentor-signature__type')
+ .contains('mixed');
+ });
+ });
+});
+
+describe('Showing constants for an interface', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Product.html');
+ });
+
+ describe('Synopsis', function() {
+ it('Show the name', function() {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .should('be.visible');
+ });
+
+ it('Show the file name where the constant is located in the project', function() {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Product.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/Product.php');
+ });
+
+ it('Can be marked "public" (visibility) to influence styling', function () {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .should('have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "protected" (visibility) to influence styling', function() {
+ getElementWithName('constant', 'PROTECTED_CONSTANT')
+ .should('not.have.class', '-public')
+ .and('have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "private" (visibility) to influence styling', function() {
+ getElementWithName('constant', 'PRIVATE_CONSTANT')
+ .should('not.have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('have.class', '-private');
+ });
+
+ it('Links to the file documentation wherein the constant is', function() {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Product.php')
+ .should('have.attr', 'href', 'files/src-product.html');
+ });
+
+ it('Show the line number where the constant is located', function() {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .find('.phpdocumentor-element-found-in__line')
+ .should((element) => {
+ expect(parseInt(element.text())).to.be.at.least(1);
+ });
+ });
+ });
+
+ describe('Signature', function() {
+ it('Can show the "public" visibility specifier', function() {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public');
+ });
+
+ it('Can show the "protected" visibility specifier', function() {
+ getElementWithName('constant', 'PROTECTED_CONSTANT')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('protected');
+ });
+
+ it('Can show the "private" visibility specifier', function() {
+ getElementWithName('constant', 'PRIVATE_CONSTANT')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('private');
+ });
+
+ it('has the deprecated modifier', function() {
+ getElementWithName('constant', 'PROTECTED_CONSTANT')
+ .find('.phpdocumentor-signature')
+ .should('have.class', '-deprecated');
+ });
+
+ it('Shows the name of the constant', function() {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .find('.phpdocumentor-signature__name')
+ .contains('PUBLIC_CONSTANT');
+ });
+
+ it('Shows the type', function() {
+ getElementWithName('constant', 'PROTECTED_CONSTANT')
+ .find('.phpdocumentor-signature__type')
+ .contains('string');
+ });
+
+ it('Type defaults to mixed when unable to infer', function() {
+ getElementWithName('constant', 'PUBLIC_CONSTANT')
+ .find('.phpdocumentor-signature__type')
+ .contains('mixed');
+ });
+ });
+});
diff --git a/cypress/integration/default/enums.spec.js b/cypress/integration/default/enums.spec.js
new file mode 100644
index 0000000000..0a144a3edb
--- /dev/null
+++ b/cypress/integration/default/enums.spec.js
@@ -0,0 +1,110 @@
+import sidebar from './sidebar.inc';
+import search from './search.inc';
+import {getEntryIn, getSummaryEntry} from './helpers/onThisPage.lib';
+
+describe('Enums', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Delivery.html');
+ });
+
+ describe('Search', search);
+ describe('In the sidebar', sidebar);
+
+ describe('Breadcrumb', function() {
+ it('Has a breadcrumb featuring "Marios"', function() {
+ cy.get('.phpdocumentor-breadcrumb').should('have.length', 2);
+ cy.get('.phpdocumentor-breadcrumb').contains('Marios');
+ });
+
+ it('will send you to the namespace page when clicking on "Marios" in the breadcrumb', function() {
+ cy.get('.phpdocumentor-breadcrumb')
+ .contains("Marios")
+ .click();
+ cy.url().should('include', '/namespaces/marios.html');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Has "Delivery" as title', function () {
+ cy.get('.phpdocumentor-content__title').contains('Delivery');
+ });
+
+ it('Shows the backing type next to the enum name', function () {
+ cy.get('.phpdocumentor-element__extends').contains('string');
+ });
+
+ it('Has a summary', function () {
+ cy.get('.phpdocumentor-element.-class > .phpdocumentor-summary')
+ .contains('This is an enum example');
+ });
+
+ it('Has a description', function () {
+ cy.get('.phpdocumentor-element.-class > .phpdocumentor-description')
+ .contains('Enums are introduced in php 8.1.');
+ });
+ });
+
+ describe('Cases', function() {
+ it('Lists each declared case', function() {
+ cy.get('#enumcase_PICKUP').should('exist');
+ cy.get('#enumcase_DELIVER').should('exist');
+ });
+
+ it('Wraps each case in an article tagged as an enum case', function() {
+ cy.get('#enumcase_PICKUP')
+ .closest('article')
+ .should('have.class', 'phpdocumentor-element')
+ .and('have.class', '-enum-case');
+ });
+
+ it('Renders the docblock summary attached to a case', function() {
+ cy.get('#enumcase_PICKUP')
+ .closest('.phpdocumentor-element')
+ .find('.phpdocumentor-summary')
+ .contains('Pickup case');
+ });
+
+ it('Renders the docblock description attached to a case', function() {
+ cy.get('#enumcase_PICKUP')
+ .closest('.phpdocumentor-element')
+ .find('.phpdocumentor-description')
+ .contains('Cases can have docblocks.');
+ });
+
+ it('Does not render docblock sections when the case has no docblock', function() {
+ cy.get('#enumcase_DELIVER')
+ .closest('.phpdocumentor-element')
+ .find('.phpdocumentor-summary, .phpdocumentor-description')
+ .should('not.exist');
+ });
+
+ it('Renders the backing value next to the case in the table of contents', function() {
+ cy.get('.phpdocumentor-table-of-contents__entry')
+ .contains('PICKUP')
+ .parent()
+ .should('contain', "'pickup'");
+ });
+ });
+
+ describe('Methods', function() {
+ it('Lists methods declared on the enum', function() {
+ cy.get('#method_isDeliver').should('exist');
+ });
+ });
+
+ describe('On This Page', function() {
+ it('renders links to the summary items', function() {
+ getSummaryEntry('Cases').should('exist');
+ getSummaryEntry('Methods').should('exist');
+ });
+
+ it('renders references to cases on this page', function() {
+ getEntryIn('Cases', 'PICKUP').should('exist');
+ getEntryIn('Cases', 'DELIVER').should('exist');
+ });
+
+ it('renders references to methods on this page', function() {
+ getEntryIn('Methods', 'isDeliver()').should('exist');
+ });
+ });
+});
diff --git a/cypress/integration/default/frontpage.spec.js b/cypress/integration/default/frontpage.spec.js
new file mode 100644
index 0000000000..c093c10a59
--- /dev/null
+++ b/cypress/integration/default/frontpage.spec.js
@@ -0,0 +1,88 @@
+import {shouldVisitPageWithTitle} from "./helpers/pages.lib";
+import sidebar from './sidebar.inc';
+import search from './search.inc';
+
+describe('Frontpage', function() {
+ beforeEach(function(){
+ cy.visit('build/default/index.html');
+ });
+
+ describe('Search', search);
+ describe('In the sidebar', sidebar);
+
+ describe('Table Of Contents', function() {
+ it('Shows a section "Table Of Contents"', function() {
+ cy.get('h3#toc').should('contain', 'Table of Contents');
+ cy.get('h3#toc')
+ .siblings('.phpdocumentor-table-of-contents')
+ .should('exist');
+ });
+
+ describe('Packages', function() {
+ it('Shows a section "Packages" with a table of contents', function() {
+ cy.get('h4#packages').should('contain', 'Packages');
+ cy.get('h4#packages').next('.phpdocumentor-table-of-contents');
+ });
+
+ it('Shows the "Marios" package', function() {
+ cy.get('h4#packages')
+ .next('.phpdocumentor-table-of-contents')
+ .find('.-package').should('contain', 'Marios')
+ });
+
+ it('Opens the "Marios" package', function() {
+ cy
+ .get('h4#packages').next('.phpdocumentor-table-of-contents')
+ .find('.phpdocumentor-table-of-contents__entry.-package')
+ .contains("Marios")
+ .click();
+
+ shouldVisitPageWithTitle('/packages/Marios.html', 'Marios');
+ });
+ });
+
+ describe('Namespaces', function() {
+ it('Shows a section "Namespaces" with a table of contents', function() {
+ cy.get('h4#namespaces').should('contain', 'Namespaces');
+ cy.get('h4#namespaces').next('.phpdocumentor-table-of-contents');
+ });
+
+ it('Shows the "Marios" namespace', function() {
+ cy.get('h4#namespaces')
+ .next('.phpdocumentor-table-of-contents')
+ .find('.-namespace').should('contain', 'Marios')
+ });
+
+ it('Opens the "Marios" namespace', function() {
+ cy
+ .get('h4#namespaces').next('.phpdocumentor-table-of-contents')
+ .find('.phpdocumentor-table-of-contents__entry.-namespace')
+ .contains("Marios")
+ .click();
+
+ shouldVisitPageWithTitle('/namespaces/marios.html', 'Marios');
+ });
+ });
+
+ describe('Global constants and functions', function() {
+ it('Shows the "HIGHER_OVEN_TEMPERATURE" constant', function() {
+ cy.get('h3#toc')
+ .siblings('.phpdocumentor-table-of-contents')
+ .find('.-constant')
+ .should('contain', 'HIGHER_OVEN_TEMPERATURE')
+ });
+
+ // TODO: Is this the outcome that we want?
+ it('Opens the "HIGHER_OVEN_TEMPERATURE" constant', function() {
+ cy
+ .get('h3#toc')
+ .siblings('.phpdocumentor-table-of-contents')
+ .find('.phpdocumentor-table-of-contents__entry.-constant')
+ .contains('HIGHER_OVEN_TEMPERATURE')
+ .click();
+
+ shouldVisitPageWithTitle('/namespaces/default.html', 'API Documentation');
+ });
+ });
+ });
+});
diff --git a/cypress/integration/default/functions.spec.js b/cypress/integration/default/functions.spec.js
new file mode 100644
index 0000000000..f82616bc50
--- /dev/null
+++ b/cypress/integration/default/functions.spec.js
@@ -0,0 +1,127 @@
+import {getElementWithName} from "./helpers/elements.lib";
+
+describe('Showing functions in a namespace', function() {
+ beforeEach(function(){
+ cy.visit('build/default/namespaces/marios.html');
+ });
+
+ describe('Meta-data', function() {
+ it('Is not marked as deprecated by default', function () {
+ getElementWithName('function', 'heatOven()')
+ .should('not.have.class', '-deprecated');
+ });
+
+ it('Can be marked as deprecated', function() {
+ getElementWithName('function', 'populateTemperature()')
+ .should('have.class', '-deprecated');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Show the name', function() {
+ getElementWithName('function', 'heatOven()')
+ .should('be.visible');
+ });
+
+ it('Show the file name where the function is located in the project', function() {
+ getElementWithName('function', 'heatOven()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'functions.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/functions.php');
+ });
+
+ it('Links to the file documentation wherein the function is', function() {
+ getElementWithName('function', 'heatOven()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'functions.php')
+ .should('have.attr', 'href', 'files/src-functions.html');
+ });
+
+ it('Show the line number where the function is located', function() {
+ getElementWithName('function', 'heatOven()')
+ .find('.phpdocumentor-element-found-in__line')
+ .should((element) => {
+ expect(parseInt(element.text())).to.be.at.least(1);
+ });
+ });
+ });
+
+ describe('Signature', function() {
+ it('has the deprecated modifier', function() {
+ getElementWithName('function', 'populateTemperature()')
+ .find('.phpdocumentor-signature')
+ .should('have.class', '-deprecated');
+ });
+
+ it('Shows the name of the function', function() {
+ getElementWithName('function', 'heatOven()')
+ .find('.phpdocumentor-signature__name')
+ .contains('heatOven');
+ });
+
+ it('Shows the return value', function() {
+ getElementWithName('function', 'coolOven()')
+ .find('.phpdocumentor-signature__response_type')
+ .contains('bool');
+ });
+
+ describe ('Arguments', function() {
+ it('Show the name of argument $degrees', function () {
+ getElementWithName('function', 'coolOven()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__name')
+ .contains('$degrees');
+ });
+
+ it('Show the default value of argument $degrees', function () {
+ getElementWithName('function', 'coolOven()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__name')
+ .contains('$degrees')
+ .parent()
+ .find('.phpdocumentor-signature__argument__default-value')
+ .contains('42')
+ });
+
+ it('Show the name of argument $timeout', function () {
+ getElementWithName('function', 'turnOffOven()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__name')
+ .contains('$timeout');
+ });
+
+ it('Show the default value of argument $timeout', function () {
+ getElementWithName('function', 'turnOffOven()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__name')
+ .contains('$timeout')
+ .parent()
+ .find('.phpdocumentor-signature__argument__default-value')
+ .contains('0')
+ });
+ });
+ });
+
+ describe ('Shows the parameters for a function', function () {
+ it('Can have a parameters section', function () {
+ getElementWithName('function', 'coolOven()')
+ .find('.phpdocumentor-argument-list__heading')
+ .contains('Parameters');
+ })
+ });
+
+ describe ('Shows what a function returns', function () {
+ it('Can have a return values section', function () {
+ getElementWithName('function', 'coolOven()')
+ .find('.phpdocumentor-return-value__heading')
+ .contains('Return values');
+ })
+
+ it('Will show the type and description', function () {
+ getElementWithName('function', 'coolOven()')
+ .find('.phpdocumentor-return-value__heading')
+ .next()
+ .should('have.class', 'phpdocumentor-signature__response_type')
+ .contains('bool')
+ .next('.phpdocumentor-description')
+ .contains('whether cooling succeeded')
+ })
+ });
+});
diff --git a/cypress/integration/default/helpers/elements.lib.js b/cypress/integration/default/helpers/elements.lib.js
new file mode 100644
index 0000000000..4c3125b330
--- /dev/null
+++ b/cypress/integration/default/helpers/elements.lib.js
@@ -0,0 +1,6 @@
+export function getElementWithName(type, name) {
+ return cy.get(`.phpdocumentor-element.-${type}`)
+ .find('.phpdocumentor-element__name')
+ .contains(name)
+ .parent();
+}
diff --git a/cypress/integration/default/helpers/onThisPage.lib.js b/cypress/integration/default/helpers/onThisPage.lib.js
new file mode 100644
index 0000000000..9694649355
--- /dev/null
+++ b/cypress/integration/default/helpers/onThisPage.lib.js
@@ -0,0 +1,21 @@
+export function getOnThisPage() {
+ return cy.get('.phpdocumentor-on-this-page__content');
+}
+
+export function getSection(name) {
+ return getOnThisPage()
+ .find('.phpdocumentor-on-this-page-section__title')
+ .contains(name)
+ .next('li');
+}
+
+export function getSummaryEntry(name) {
+ return getSection('Table Of Contents')
+ .find('li').contains(name);
+}
+
+export function getEntryIn(section, name) {
+ return getSection(section)
+ .find('li').contains(name);
+}
+
diff --git a/cypress/integration/default/helpers/pages.lib.js b/cypress/integration/default/helpers/pages.lib.js
new file mode 100644
index 0000000000..28bbd3f28f
--- /dev/null
+++ b/cypress/integration/default/helpers/pages.lib.js
@@ -0,0 +1,4 @@
+export function shouldVisitPageWithTitle(url, title) {
+ cy.url().should('include', url);
+ cy.get('.phpdocumentor-content__title').contains(title);
+}
diff --git a/cypress/integration/default/helpers/search.lib.js b/cypress/integration/default/helpers/search.lib.js
new file mode 100644
index 0000000000..679764be18
--- /dev/null
+++ b/cypress/integration/default/helpers/search.lib.js
@@ -0,0 +1,5 @@
+export function getSearchField() {
+ cy.get('.phpdocumentor-header').contains("Search");
+
+ return cy.get('.phpdocumentor-field.phpdocumentor-search__field');
+}
diff --git a/cypress/integration/default/helpers/sidebar.lib.js b/cypress/integration/default/helpers/sidebar.lib.js
new file mode 100644
index 0000000000..8d556eb61b
--- /dev/null
+++ b/cypress/integration/default/helpers/sidebar.lib.js
@@ -0,0 +1,10 @@
+export function getSidebarHeaderByTitle(title) {
+ return cy.get('.phpdocumentor-sidebar__category-header')
+ .contains(title)
+}
+
+export function getSidebarItemByTitle(sectionTitle, entryTitle, type = 'package') {
+ return getSidebarHeaderByTitle(sectionTitle)
+ .siblings('.phpdocumentor-sidebar__root-' + type)
+ .contains(entryTitle);
+}
diff --git a/cypress/integration/default/helpers/tableOfContents.lib.js b/cypress/integration/default/helpers/tableOfContents.lib.js
new file mode 100644
index 0000000000..e8133fefda
--- /dev/null
+++ b/cypress/integration/default/helpers/tableOfContents.lib.js
@@ -0,0 +1,10 @@
+export function getToc(tocType, tocName) {
+ return cy.get('h4#toc-' + tocType).contains(tocName).next('.phpdocumentor-table-of-contents');
+}
+
+export function getTocEntry(toc, name) {
+ return toc.find('.phpdocumentor-table-of-contents__entry')
+ .contains(name)
+ .parents('.phpdocumentor-table-of-contents__entry');
+}
+
diff --git a/cypress/integration/default/interfaces.spec.js b/cypress/integration/default/interfaces.spec.js
new file mode 100644
index 0000000000..882d442a5f
--- /dev/null
+++ b/cypress/integration/default/interfaces.spec.js
@@ -0,0 +1,82 @@
+import sidebar from './sidebar.inc';
+import search from './search.inc';
+import {getToc, getTocEntry} from './helpers/tableOfContents.lib';
+import {getEntryIn, getSummaryEntry} from './helpers/onThisPage.lib';
+
+describe('Interfaces', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Product.html');
+ });
+
+ describe('Search', search);
+ describe('In the sidebar', sidebar);
+
+ describe('Breadcrumb', function() {
+ it('Has a breadcrumb featuring "Marios"', function() {
+ cy.get('.phpdocumentor-breadcrumb').should('have.length', 1);
+ cy.get('.phpdocumentor-breadcrumb').contains('Marios');
+ });
+
+ it('will send you to the namespace page when clicking on "Marios" in the breadcrumb', function() {
+ cy.get('.phpdocumentor-breadcrumb')
+ .contains('Marios')
+ .click();
+ cy.url().should('include', '/namespaces/marios.html');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Page title includes the fully qualified interface name', function () {
+ cy.title().should('match', /\u00bb \\Marios\\Product\s*$/);
+ });
+
+ it('Has "Product" as title', function () {
+ cy.get('.phpdocumentor-content__title').contains('Product');
+ });
+
+ it('Has a summary', function () {
+ cy.get('.phpdocumentor-element.-interface > .phpdocumentor-summary')
+ .contains('Contract between products.');
+ });
+
+ it('Has a description', function () {
+ cy.get('.phpdocumentor-element.-interface > .phpdocumentor-description')
+ .contains('This is a description on an interface.');
+ });
+ });
+
+ describe('Table of Contents', function() {
+ it('Shows methods with their return type and visibility', function() {
+ getTocEntry(getToc('methods', 'Methods'), 'getName()')
+ .should('have.class', '-method')
+ .and('have.class', '-public')
+ .and('contain', ': string');
+ });
+ it('Shows constants with their visibility', function() {
+ getTocEntry(getToc('constants', 'Constants'), 'PUBLIC_CONSTANT')
+ .should('have.class', '-constant')
+ .and('have.class', '-public');
+ getTocEntry(getToc('constants', 'Constants'), 'PROTECTED_CONSTANT')
+ .should('have.class', '-constant')
+ .and('have.class', '-protected');
+ getTocEntry(getToc('constants', 'Constants'), 'PRIVATE_CONSTANT')
+ .should('have.class', '-constant')
+ .and('have.class', '-private');
+ });
+ });
+
+ describe('On This Page', function() {
+ it('renders links to the summary items', function() {
+ getSummaryEntry('Constants').should('exist');
+ getSummaryEntry('Methods').should('exist');
+ });
+ it('renders references to constants on this page', function() {
+ getEntryIn('Constants', 'PUBLIC_CONSTANT').should('exist');
+ getEntryIn('Constants', 'PROTECTED_CONSTANT').should('exist');
+ getEntryIn('Constants', 'PRIVATE_CONSTANT').should('exist');
+ });
+ it('renders references to methods on this page', function() {
+ getEntryIn('Methods', 'getName()').should('exist');
+ });
+ });
+});
diff --git a/cypress/integration/default/methods.spec.js b/cypress/integration/default/methods.spec.js
new file mode 100644
index 0000000000..9a752160e5
--- /dev/null
+++ b/cypress/integration/default/methods.spec.js
@@ -0,0 +1,418 @@
+import {getElementWithName} from "./helpers/elements.lib";
+
+describe('Showing methods for a class', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Pizzeria.html');
+ });
+
+ describe('Meta-data', function() {
+ it('Can be marked "public" (visibility) to influence styling', function () {
+ getElementWithName('method', 'jsonSerialize()')
+ .should('have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "protected" (visibility) to influence styling', function() {
+ getElementWithName('method', 'doOrder()')
+ .should('not.have.class', '-public')
+ .and('have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "private" (visibility) to influence styling', function() {
+ getElementWithName('method', 'doOldOrder()')
+ .should('not.have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('have.class', '-private');
+ });
+
+ it('Is not marked as static, final or abstract by default', function () {
+ getElementWithName('method', 'jsonSerialize()')
+ .should('not.have.class', '-final')
+ .and('not.have.class', '-static')
+ .and('not.have.class', '-abstract');
+ });
+
+ it('Can be marked as static, but not as final, deprecated or abstract', function() {
+ getElementWithName('method', 'doOrder()')
+ .should('not.have.class', '-final')
+ .and('have.class', '-static')
+ .and('not.have.class', '-abstract')
+ .and('not.have.class', '-deprecated');
+ });
+
+ it('Can be marked as final and deprecated, but not as static or abstract', function() {
+ getElementWithName('method', 'doOldOrder()')
+ .should('have.class', '-final')
+ .and('not.have.class', '-static')
+ .and('not.have.class', '-abstract')
+ .and('have.class', '-deprecated');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Show the name', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .should('be.visible');
+ });
+
+ it('Show the file name where the method is located in the project', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pizzeria.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/Pizzeria.php');
+ });
+
+ it('Links to the file documentation wherein the method is', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pizzeria.php')
+ .should('have.attr', 'href', 'files/src-pizzeria.html');
+ });
+
+ it('Show the line number where the method is located', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-element-found-in__line')
+ .should((element) => {
+ expect(parseInt(element.text())).to.be.at.least(1);
+ });
+ });
+
+ // TODO: A feature request is to include https://github.com/JetBrains/phpstorm-stubs for inheritance resolving
+ it('Does not show a summary because it @inheritdocs an external method', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-summary')
+ .should('not.exist');
+ });
+
+ // TODO: A feature request is to include https://github.com/JetBrains/phpstorm-stubs for inheritance resolving
+ it.skip('Does not show a description because it @inheritdocs an external method', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-signature')
+ .next()
+ .should('not.have.class', 'phpdocumentor-description');
+ });
+ });
+
+ describe('Signature', function() {
+ it('Can show the "public" visibility specifier', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public');
+ });
+
+ it('Can show the "protected" visibility specifier', function() {
+ getElementWithName('method', 'doOrder()')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('protected');
+ });
+
+ it('Can show the "private" visibility specifier', function() {
+ getElementWithName('method', 'doOldOrder()')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('private');
+ });
+
+ it('has the deprecated modifier', function() {
+ getElementWithName('method', 'doOldOrder()')
+ .find('.phpdocumentor-signature')
+ .should('have.class', '-deprecated');
+ });
+
+ it('Shows the "static" keyword', function() {
+ getElementWithName('method', 'doOrder()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__static')
+ .should('exist')
+ .and('contain', 'static');
+ });
+
+ it('Shows the "final" keyword', function() {
+ getElementWithName('method', 'doOldOrder()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__final')
+ .contains('final');
+ });
+
+ it('Shows the name of the method', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-signature__name')
+ .contains('jsonSerialize');
+ });
+
+ it('Shows the "array" return value', function() {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-signature__response_type')
+ .contains('array');
+ });
+
+ it('Shows "false" as return value; the return tag overrides the typehint', function() {
+ getElementWithName('method', 'doOldOrder()')
+ .find('.phpdocumentor-signature__response_type')
+ .contains('false');
+ });
+
+ describe ('Arguments', function() {
+ it('Show the name of argument $temp', function () {
+ cy.visit('build/default/classes/Marios-Oven.html');
+
+ getElementWithName('method', 'heatToTemp()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__name')
+ .contains('$temp');
+ });
+
+ it('Show the default value of argument $temp', function () {
+ cy.visit('build/default/classes/Marios-Oven.html');
+
+ getElementWithName('method', 'heatToTemp()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__name')
+ .contains('$temp')
+ .parent()
+ .find('.phpdocumentor-signature__argument__default-value')
+ .contains('self::DEFAULT_TEMPERATURE')
+ });
+
+ it('Show a variadic indicator', function () {
+ getElementWithName('method', 'order()')
+ .find('.phpdocumentor-signature')
+ .find('.phpdocumentor-signature__argument__variadic-operator')
+ .contains('...');
+ });
+
+ it('Shows the default value links to type Sauce', function () {
+ cy.visit('build/default/classes/Marios-Pizza-Base.html');
+
+ getElementWithName('method', '__construct()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__type')
+ .contains('a', 'Sauce')
+ .should('have.attr', 'href', 'classes/Marios-Pizza-Sauce.html')
+ .find('abbr')
+ .should('have.attr', 'title', '\\Marios\\Pizza\\Sauce');
+
+ getElementWithName('method', '__construct()')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__argument__default-value')
+ .should('contain.text', 'new Sauce()')
+ .find('a')
+ .should('have.attr', 'href', 'classes/Marios-Pizza-Sauce.html')
+ .find('abbr')
+ .should('have.attr', 'title', '\\Marios\\Pizza\\Sauce');
+ });
+ });
+ });
+
+ describe ('Shows tags', function () {
+ it('Can have a tags section', function () {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-tag-list__heading')
+ .contains("Tags");
+ })
+
+ it('Will show an inheritDoc tag', function () {
+ getElementWithName('method', 'jsonSerialize()')
+ .find('.phpdocumentor-tag-list__heading')
+ .next()
+ .should('have.class', 'phpdocumentor-tag-list')
+ .contains('.phpdocumentor-tag-list__entry', 'inheritDoc');
+ })
+ });
+
+ describe ('Shows the parameters for a method', function () {
+ it('Can have a parameters section', function () {
+ getElementWithName('method', 'order()')
+ .find('.phpdocumentor-argument-list__heading')
+ .contains('Parameters');
+ })
+
+ it('Will show a parameter with a linked type', function () {
+ getElementWithName('method', 'order()')
+ .find('.phpdocumentor-argument-list__heading')
+ .next()
+ .should('have.class', 'phpdocumentor-argument-list')
+ .within(function () {
+ // find the argument entry row that mentions the $pizzas parameter
+ cy.contains('.phpdocumentor-argument-list__entry', '$pizzas')
+ .as('pizzasEntry');
+
+ // assert the name is present
+ cy.get('@pizzasEntry')
+ .find('.phpdocumentor-argument-list__argument__name')
+ .contains('$pizzas');
+
+ // assert there is a linked type pointing to the Pizza class (href + abbr title)
+ cy.get('@pizzasEntry')
+ .find('.phpdocumentor-argument-list__argument__type a')
+ .should('have.attr', 'href', 'classes/Marios-Pizza.html')
+ .find('abbr')
+ .should('have.attr', 'title', '\\Marios\\Pizza');
+ });
+ })
+
+ it('Will show a parameter with a description', function () {
+ getElementWithName('method', 'doOrder()')
+ .find('.phpdocumentor-argument-list__heading')
+ .next('.phpdocumentor-argument-list')
+ .contains('.phpdocumentor-argument-list__entry', '$pizza')
+ .next('.phpdocumentor-argument-list__definition')
+ .contains('.phpdocumentor-description', 'The specific pizza to place an order for.');
+ })
+
+ it('Will show default parameter value null without link', function () {
+ getElementWithName('method', 'setBestPizzaEver()')
+ .find('.phpdocumentor-argument-list__heading')
+ .next()
+ .should('have.class', 'phpdocumentor-argument-list')
+ .within(function () {
+ // find the argument entry row that mentions the $pizzas parameter
+ cy.contains('.phpdocumentor-argument-list__entry', 'pizza')
+ .as('pizzaArgument');
+
+ // assert the name is present
+ cy.get('@pizzaArgument')
+ .find('.phpdocumentor-argument-list__argument__name')
+ .contains('$pizza');
+
+ // assert there is a linked type pointing to the Pizza class (href + abbr title)
+ cy.get('@pizzaArgument')
+ .find('.phpdocumentor-argument-list__argument__default-value')
+ .contains('null')
+ .find('a')
+ .should('not.exist');
+ });
+ })
+ });
+
+ describe ('Shows what a method returns', function () {
+ it('Can have a return values section', function () {
+ getElementWithName('method', 'doOrder()')
+ .find('.phpdocumentor-return-value__heading')
+ .contains('Return values');
+ })
+
+ it('Will show the type and description', function () {
+ getElementWithName('method', 'doOrder()')
+ .find('.phpdocumentor-return-value__heading')
+ .next()
+ .should('have.class', 'phpdocumentor-signature__response_type')
+ .contains('bool')
+ .next('.phpdocumentor-description')
+ .contains('Whether the order succeeded')
+ })
+ });
+});
+
+describe('Showing methods for an interface', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Product.html');
+ });
+
+ describe('Synopsis', function() {
+ it('Show the name', function() {
+ getElementWithName('method', 'getName()')
+ .should('be.visible');
+ });
+
+ it('Show the file name where the method is located in the project', function() {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Product.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/Product.php');
+ });
+
+ it('Links to the file documentation wherein the method is', function() {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Product.php')
+ .should('have.attr', 'href', 'files/src-product.html');
+ });
+
+ it('Show the line number where the method is located', function() {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-element-found-in__line')
+ .should((element) => {
+ expect(parseInt(element.text())).to.be.at.least(1);
+ });
+ });
+ });
+
+ describe('Signature', function() {
+ it('Can show the "public" visibility specifier', function() {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public');
+ });
+
+ it('Shows the name of the method', function() {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-signature__name')
+ .contains('getName');
+ });
+
+ it('Shows the return type', function() {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-signature__response_type')
+ .contains('string');
+ });
+ });
+
+ describe ('Shows what a method returns', function () {
+ it('Can have a return values section', function () {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-return-value__heading')
+ .contains('Return values');
+ })
+
+ it('Will show the type and description', function () {
+ getElementWithName('method', 'getName()')
+ .find('.phpdocumentor-return-value__heading')
+ .next()
+ .should('have.class', 'phpdocumentor-signature__response_type')
+ .contains('string')
+ .next('.phpdocumentor-description')
+ .contains('the name of this product')
+ })
+ });
+});
+
+describe('Showing methods for class with parent', function() {
+ beforeEach(function () {
+ cy.visit('build/default/classes/Marios-Pizza-Toppings-Pepperoni.html');
+ });
+
+ describe('Synopsis', function() {
+ it('Show the name', function () {
+ getElementWithName('method', 'publiclyAvailable()')
+ .should('be.visible');
+ });
+
+ it('Show the file name where the method points to parent class', function () {
+ getElementWithName('method', 'availableToAll()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Topping.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/Pizza/Topping.php');
+ });
+
+ it('Links to the file documentation wherein the method points to parrent class', function () {
+ getElementWithName('method', 'availableToAll()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Topping.php')
+ .should('have.attr', 'href', 'files/src-pizza-topping.html');
+ });
+
+ it('Show the file name where the method points to current class', function () {
+ getElementWithName('method', 'publiclyAvailable()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pepperoni.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/Pizza/Toppings/Pepperoni.php');
+ });
+
+ it('Links to the file documentation wherein the method points to current class', function () {
+ getElementWithName('method', 'publiclyAvailable()')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pepperoni.php')
+ .should('have.attr', 'href', 'files/src-pizza-toppings-pepperoni.html');
+ });
+ });
+});
diff --git a/cypress/integration/default/namespaces.spec.js b/cypress/integration/default/namespaces.spec.js
new file mode 100644
index 0000000000..5adf50b97b
--- /dev/null
+++ b/cypress/integration/default/namespaces.spec.js
@@ -0,0 +1,150 @@
+import {shouldVisitPageWithTitle} from "./helpers/pages.lib";
+import sidebar from "./sidebar.inc";
+import search from "./search.inc";
+import {getToc, getTocEntry} from "./helpers/tableOfContents.lib";
+import {getEntryIn, getSummaryEntry} from "./helpers/onThisPage.lib";
+
+describe('Namespaces', function() {
+ beforeEach(function(){
+ cy.visit('build/default/namespaces/marios.html');
+ });
+
+ describe('Search', search);
+ describe('In the sidebar', sidebar);
+ describe('Breadcrumb', function() {
+ it('Child namespace feature a breadcrumb to their parent', function () {
+ cy.visit('build/default/namespaces/marios-pizza.html');
+ cy.get('.phpdocumentor-breadcrumb')
+ .should('have.length', 1)
+ .contains('a', 'Marios')
+ .and('have.attr', 'href', 'namespaces/marios.html');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Has "Marios" as title', function() {
+ cy.get('.phpdocumentor-content__title').contains("Marios");
+ });
+
+ it('Page title includes the fully qualified namespace', function() {
+ cy.title().should('match', /\u00bb \\Marios\s*$/);
+ });
+
+ it('Page title for the root namespace omits the separator', function() {
+ cy.visit('build/default/namespaces/default.html');
+ cy.title().should('not.contain', '\u00bb');
+ });
+ });
+
+ describe('Table of Contents', function() {
+ describe('Child namespaces', function () {
+ it('Has a section "Namespaces" featuring the "Pizza" sub-namespace', function () {
+ cy.get('h4#namespaces').contains("Namespaces")
+ .next('.phpdocumentor-table-of-contents')
+ .find('.phpdocumentor-table-of-contents__entry')
+ .should('contain', 'Pizza');
+ });
+
+ it('Goes to the "Pizza" sub-namespace when you click on it', function () {
+ cy.get('h4#namespaces')
+ .contains('Namespaces')
+ .next('.phpdocumentor-table-of-contents')
+ .find('.phpdocumentor-table-of-contents__entry')
+ .contains('Pizza')
+ .click();
+
+ shouldVisitPageWithTitle('/namespaces/marios-pizza.html', 'Pizza');
+ });
+ });
+
+ it('Features the "Product" interface', function () {
+ getTocEntry(getToc('interfaces', 'Interfaces'), 'Product')
+ .should('have.class', '-interface');
+ });
+
+ it('Features the "Pizzeria" class and its description', function () {
+ const title = 'Pizzeria';
+ const description = 'Entrypoint for this pizza ordering application.';
+
+ getTocEntry(getToc('classes', 'Classes'), title)
+ .should('have.class', '-class')
+ .next('dd')
+ .should('have.text', description)
+ });
+
+ it('Goes to "Pizzeria" its detail page when you click on it', function () {
+ const title = 'Pizzeria';
+
+ getTocEntry(getToc('classes', 'Classes'), title)
+ .find('a').click();
+
+ shouldVisitPageWithTitle('/classes/Marios-Pizzeria.html', title);
+ });
+
+ it('Features the "SharedTrait" trait with its description', function () {
+ const title = 'SharedTrait';
+
+ getTocEntry(getToc('traits', 'Traits'), title)
+ .should('have.class', '-trait')
+ .next('dd')
+ .should('have.text', 'Trait that all pizza\'s could share.');
+ });
+ });
+
+ describe('On This Page', function() {
+ it('renders links to the summary items', function() {
+ getSummaryEntry('Interfaces').should('exist');
+ getSummaryEntry('Classes').should('exist');
+ getSummaryEntry('Traits').should('exist');
+ getSummaryEntry('Enums').should('exist');
+ getSummaryEntry('Constants').should('exist');
+ getSummaryEntry('Functions').should('exist');
+ });
+ it('renders references to constants on this page', function() {
+ getEntryIn('Constants', 'OVEN_TEMPERATURE').should('exist');
+ });
+ it('renders references to functions on this page', function() {
+ getEntryIn('Functions', 'coolOven').should('exist');
+ getEntryIn('Functions', 'heatOven').should('exist');
+ });
+ });
+
+ describe('Shows details on constants', function() {
+ let sectionTitle = 'Constants';
+
+ it('Shows the title "Constants"', function () {
+ cy.get('h3#constants')
+ .contains(sectionTitle);
+ });
+
+ it('Features the "OVEN_TEMPERATURE" constant', function () {
+ let name = 'OVEN_TEMPERATURE';
+
+ cy.get('h3#constants')
+ .contains(sectionTitle)
+ .siblings()
+ .contains('.phpdocumentor-element', name)
+ .should('have.class', '-constant');
+ });
+ });
+
+ describe('Shows details on functions', function() {
+ let sectionTitle = 'Functions';
+
+ it('Shows the title "Functions"', function () {
+ cy.get('h3#functions')
+ .contains(sectionTitle);
+ });
+
+ it('features the "heatOven" function', function () {
+ let title = 'heatOven';
+
+ cy.get('h3#functions')
+ .contains(sectionTitle)
+ .siblings()
+ .contains('.phpdocumentor-element', title)
+ .should('have.class', '-function');
+ });
+ });
+});
+
diff --git a/cypress/integration/default/packages.spec.js b/cypress/integration/default/packages.spec.js
new file mode 100644
index 0000000000..34515cede5
--- /dev/null
+++ b/cypress/integration/default/packages.spec.js
@@ -0,0 +1,116 @@
+import {shouldVisitPageWithTitle} from "./helpers/pages.lib";
+import sidebar from "./sidebar.inc";
+import search from "./search.inc";
+import {getEntryIn, getSummaryEntry} from "./helpers/onThisPage.lib";
+import {getToc, getTocEntry} from "./helpers/tableOfContents.lib";
+
+describe('Packages', function() {
+ beforeEach(function() {
+ cy.visit('build/default/packages/Marios.html');
+ });
+
+ describe('Search', search);
+ describe('In the sidebar', sidebar);
+
+ describe('Synopsis', function() {
+ it('Has a title', function() {
+ cy.get('.phpdocumentor-content__title')
+ .contains("Marios");
+ });
+
+ it('Page title includes the fully qualified package name', function() {
+ cy.title().should('match', /\u00bb \\Marios\s*$/);
+ });
+ });
+
+ describe('Table of Contents', function() {
+ it('Features the "Product" interface', function () {
+ getTocEntry(getToc('interfaces', 'Interfaces'), 'Product')
+ .should('have.class', '-interface');
+ });
+
+ it('Features the "Pizzeria" class and its description', function () {
+ const title = 'Pizzeria';
+ const description = 'Entrypoint for this pizza ordering application.';
+
+ getTocEntry(getToc('classes', 'Classes'), title)
+ .should('have.class', '-class')
+ .next('dd')
+ .should('have.text', description)
+ });
+
+ it('Goes to "Pizzeria" its detail page when you click on it', function () {
+ const title = 'Pizzeria';
+
+ getTocEntry(getToc('classes', 'Classes'), title)
+ .find('a').click();
+
+ shouldVisitPageWithTitle('/classes/Marios-Pizzeria.html', title);
+ });
+
+ it('Features the "SharedTrait" trait with its description', function () {
+ const title = 'SharedTrait';
+
+ getTocEntry(getToc('traits', 'Traits'), title)
+ .should('have.class', '-trait')
+ .next('dd')
+ .should('have.text', 'Trait that all pizza\'s could share.');
+ });
+ });
+
+ describe('On This Page', function() {
+ it('renders links to the summary items', function() {
+ getSummaryEntry('Interfaces').should('exist');
+ getSummaryEntry('Classes').should('exist');
+ getSummaryEntry('Traits').should('exist');
+ getSummaryEntry('Enums').should('exist');
+ getSummaryEntry('Constants').should('exist');
+ getSummaryEntry('Functions').should('exist');
+ });
+ it('renders references to constants on this page', function() {
+ getEntryIn('Constants', 'OVEN_TEMPERATURE').should('exist');
+ });
+ it('renders references to functions on this page', function() {
+ getEntryIn('Functions', 'coolOven').should('exist');
+ getEntryIn('Functions', 'heatOven').should('exist');
+ });
+ });
+
+ describe('Shows details on constants', function() {
+ let sectionTitle = 'Constants';
+
+ it('Shows the title "Constants"', function () {
+ cy.get('h3#constants')
+ .contains(sectionTitle);
+ });
+
+ it('Features the "OVEN_TEMPERATURE" constant', function () {
+ let name = 'OVEN_TEMPERATURE';
+
+ cy.get('h3#constants')
+ .contains(sectionTitle)
+ .siblings()
+ .contains('.phpdocumentor-element', name)
+ .should('have.class', '-constant');
+ });
+ });
+
+ describe('Show details on functions', function() {
+ let sectionTitle = 'Functions';
+
+ it('Shows the title "Functions"', function () {
+ cy.get('h3#functions')
+ .contains(sectionTitle);
+ });
+
+ it('features the "heatOven" function', function () {
+ let title = 'heatOven';
+
+ cy.get('h3#functions')
+ .contains(sectionTitle)
+ .siblings()
+ .contains('.phpdocumentor-element', title)
+ .should('have.class', '-function');
+ });
+ });
+});
diff --git a/cypress/integration/default/properties.spec.js b/cypress/integration/default/properties.spec.js
new file mode 100644
index 0000000000..7a83cd4fc5
--- /dev/null
+++ b/cypress/integration/default/properties.spec.js
@@ -0,0 +1,342 @@
+import {getElementWithName} from "./helpers/elements.lib";
+
+describe('Showing properties for a class', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Pizza.html');
+ });
+
+ describe('Meta-data', function() {
+ it('Can be marked "public" (visibility) to influence styling', function () {
+ getElementWithName('property', '$description')
+ .should('have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "protected" (visibility) to influence styling', function() {
+ getElementWithName('property', '$extra')
+ .should('not.have.class', '-public')
+ .and('have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Can be marked "private" (visibility) to influence styling', function() {
+ getElementWithName('property', '$secretIngredient')
+ .should('not.have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('have.class', '-private');
+ });
+
+ it('Is not marked as static or abstract by default', function () {
+ getElementWithName('property', '$name')
+ .and('not.have.class', '-static')
+ .and('not.have.class', '-abstract');
+ });
+
+ it('Can be marked as static, but not as deprecated or abstract', function() {
+ getElementWithName('property', '$description')
+ .and('have.class', '-static')
+ .and('not.have.class', '-abstract')
+ .and('not.have.class', '-deprecated');
+ });
+
+ it('Can be marked as deprecated, but not as static or abstract', function() {
+ getElementWithName('property', '$extra')
+ .and('not.have.class', '-static')
+ .and('not.have.class', '-abstract')
+ .and('have.class', '-deprecated');
+ });
+
+ it('Can be marked "public private(set)" (visibility) to influence styling', function() {
+ getElementWithName('property', '$asymmetric')
+ .should('have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Show the name', function() {
+ getElementWithName('property', '$name')
+ .should('be.visible');
+ });
+
+ it('Show the file name where the property is located in the project', function() {
+ getElementWithName('property', '$name')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pizza.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/Pizza.php');
+ });
+
+ it('Links to the file documentation wherein the property is', function() {
+ getElementWithName('property', '$name')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'Pizza.php')
+ .should('have.attr', 'href', 'files/src-pizza.html');
+ });
+
+ it('Show the line number where the property is located', function() {
+ getElementWithName('property', '$name')
+ .find('.phpdocumentor-element-found-in__line')
+ .should((element) => {
+ expect(parseInt(element.text())).to.be.at.least(1);
+ });
+ });
+ });
+
+ describe('Signature', function() {
+ it('Can show the "public" visibility specifier', function() {
+ getElementWithName('property', '$name')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public');
+ });
+
+ it('Can show the "protected" visibility specifier', function() {
+ getElementWithName('property', '$extra')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('protected');
+ });
+
+ it('Can show the "private" visibility specifier', function() {
+ getElementWithName('property', '$secretIngredient')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('private');
+ });
+
+ it('Can show the "public private(set)" visibility specifier', function() {
+ getElementWithName('property', '$asymmetric')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public private(set)');
+ });
+
+ it('has the deprecated modifier', function() {
+ getElementWithName('property', '$extra')
+ .find('.phpdocumentor-signature')
+ .should('have.class', '-deprecated');
+ });
+
+ it('Shows the "static" keyword', function() {
+ getElementWithName('property', '$description')
+ .find('.phpdocumentor-signature .phpdocumentor-signature__static')
+ .should('exist')
+ .and('contain', 'static');
+ });
+
+ it('Shows the name of the property', function() {
+ getElementWithName('property', '$name')
+ .find('.phpdocumentor-signature__name')
+ .contains('$name');
+ });
+
+ it('Shows the type', function() {
+ getElementWithName('property', '$name')
+ .find('.phpdocumentor-signature__type')
+ .contains('string');
+ });
+
+ // FIXME: This is a bug in phpDocumentor; the following test should be green
+ it.skip('Var tag overrides the type-hint', function() {
+ getElementWithName('property', '$alwaysTrue')
+ .find('.phpdocumentor-signature__type')
+ .contains('true');
+ });
+
+ it('Var tag description is shown', function() {
+ getElementWithName('property', '$secretIngredient')
+ .find('.phpdocumentor-description')
+ .contains('Even the type of this is secret!');
+ });
+ });
+
+ describe('Property Hooks', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-Pizza.html');
+ });
+
+ describe('Virtual Properties', function() {
+ it('Shows read-only virtual property correctly', function() {
+ getElementWithName('property', '$temperature')
+ .should('have.class', '-property')
+ .and('have.class', '-read-only')
+ .and('have.class', '-virtual')
+ .and('not.have.class', '-write-only');
+ });
+
+ it('Shows "virtual" label for properties with hooks that access other properties', function() {
+ getElementWithName('property', '$temperature')
+ .find('.phpdocumentor-element__modifiers')
+ .contains('small', 'virtual')
+ .should('exist');
+ });
+
+ it('Does not show "virtual" label for properties with hooks that access their own field', function() {
+ getElementWithName('property', '$toppingCount')
+ .find('.phpdocumentor-element__modifiers')
+ .contains('small', 'virtual')
+ .should('not.exist');
+ });
+
+ it('Non-virtual property with hooks should not have virtual class', function() {
+ getElementWithName('property', '$toppingCount')
+ .should('have.class', '-property')
+ .and('not.have.class', '-virtual');
+ });
+
+ it('Shows the property hook get method', function() {
+ // Look for the h5 element with text "Hooks" inside the property element
+ getElementWithName('property', '$temperature')
+ .contains('h5', 'Hooks')
+ .should('exist');
+
+ // Then check for the get method code element
+ getElementWithName('property', '$temperature')
+ .contains('code', 'get')
+ .should('exist');
+ });
+
+ it('Shows accessor with description for moisture property', function() {
+ // First check for the Hooks section
+ getElementWithName('property', '$moisture')
+ .contains('h5', 'Hooks')
+ .should('exist');
+
+ // Then check for the description content
+ getElementWithName('property', '$moisture')
+ .contains('value is calculated during the time in the oven')
+ .should('exist');
+ });
+ });
+
+ describe('Property Hooks with References', function() {
+ it('Shows property with reference parameter in setter', function() {
+ // Look for the hooks section
+ getElementWithName('property', '$pizzeria')
+ .contains('h5', 'Hooks')
+ .should('exist');
+
+ // Then check that the property exists and has a set method
+ getElementWithName('property', '$pizzeria')
+ .contains('code', 'set')
+ .should('exist');
+ });
+ });
+
+ describe('Property Hooks with Arrays', function() {
+ it('Shows property with array type', function() {
+ getElementWithName('property', '$ingredients')
+ .find('.phpdocumentor-signature__type')
+ .should('contain', 'array');
+ });
+
+ it('Shows doc comment type for array items', function() {
+ // Check for the property description
+ getElementWithName('property', '$ingredients')
+ .contains('.phpdocumentor-description', 'arrays')
+ .should('exist');
+ });
+ });
+
+ describe('Property Hooks with Default Values', function() {
+ it('Shows property with default value logic', function() {
+ getElementWithName('property', '$cookingTime')
+ .should('exist');
+ });
+ });
+
+ describe('Asymmetric Property Accessors', function() {
+ it('Shows property with asymmetric visibility correctly', function() {
+ getElementWithName('property', '$moisture')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public private(set)');
+ });
+
+ it('Shows different parameter type for setter than getter return type', function() {
+ // First check for the Hooks section
+ getElementWithName('property', '$moisture')
+ .contains('h5', 'Hooks')
+ .should('exist');
+
+ // Look for set method
+ getElementWithName('property', '$moisture')
+ .contains('code', 'set')
+ .should('exist');
+
+ // Check for the int|float type somewhere in the property
+ getElementWithName('property', '$moisture')
+ .contains('int|float')
+ .should('exist');
+ });
+ });
+
+ describe('Property Hook Signatures', function() {
+ it('Shows return type for get hook', function() {
+ getElementWithName('property', '$temperature')
+ .contains('h5', 'Hooks')
+ .should('exist');
+
+ // Get hook should have return type in signature
+ getElementWithName('property', '$temperature')
+ .contains('code', 'get')
+ .find('.phpdocumentor-signature__type')
+ .should('exist')
+ .contains('float');
+ });
+
+ it('Does not show return type for set hook', function() {
+ getElementWithName('property', '$ingredients')
+ .contains('h5', 'Hooks')
+ .should('exist');
+
+ getElementWithName('property', '$ingredients')
+ .contains('code', 'get')
+ .find('.phpdocumentor-signature__type')
+ .should('exist');
+
+ // Set hook should NOT have return type in signature
+ getElementWithName('property', '$ingredients')
+ .contains('code', 'set')
+ .children('.phpdocumentor-signature__type')
+ .should('not.exist');
+ });
+ });
+
+ describe('Write-Only Properties', function() {
+ it('Shows write-only virtual property correctly', function() {
+ getElementWithName('property', '$instructions')
+ .should('have.class', '-property')
+ .and('have.class', '-write-only')
+ .and('have.class', '-virtual')
+ .and('not.have.class', '-read-only');
+ });
+
+ it('Shows "write-only" label for properties with only set hook', function() {
+ getElementWithName('property', '$instructions')
+ .find('.phpdocumentor-element__modifiers')
+ .contains('small', 'write-only')
+ .should('exist');
+ });
+
+ it('Shows "virtual" label for write-only properties', function() {
+ getElementWithName('property', '$instructions')
+ .find('.phpdocumentor-element__modifiers')
+ .contains('small', 'virtual')
+ .should('exist');
+ });
+
+ it('Shows the property hook set method only', function() {
+ getElementWithName('property', '$instructions')
+ .contains('h5', 'Hooks')
+ .should('exist');
+
+ getElementWithName('property', '$instructions')
+ .contains('code', 'set')
+ .should('exist');
+
+ getElementWithName('property', '$instructions')
+ .contains('code', 'get')
+ .should('not.exist');
+ });
+ });
+ });
+});
diff --git a/cypress/integration/default/search.inc.js b/cypress/integration/default/search.inc.js
new file mode 100644
index 0000000000..778d737a3b
--- /dev/null
+++ b/cypress/integration/default/search.inc.js
@@ -0,0 +1,79 @@
+export default function() {
+ it('Has an active search form', function() {
+ cy.get('.phpdocumentor-header').get('.phpdocumentor-search')
+ .get('input[type="search"]').should('not.be.disabled');
+ });
+
+ it('Search results pane should be invisible and unclickable when not in use', function() {
+ cy.get('.phpdocumentor-search-results')
+ .should('have.css', 'opacity', '0')
+ .should('have.css', 'pointer-events', 'none');
+ });
+
+ it('Opens the results and shows results for "Pizza"', function() {
+ cy.get('.phpdocumentor-header .phpdocumentor-search')
+ .should('not.have.class', 'phpdocumentor-search--has-results')
+ .get('input[type="search"]')
+ .type('pizza');
+ cy.get('.phpdocumentor-header .phpdocumentor-search')
+ .should('have.class', 'phpdocumentor-search--has-results');
+
+ let searchResults = cy.get('.phpdocumentor-search-results');
+ searchResults.get('h2').contains("Search results");
+ searchResults
+ .should('have.css', 'opacity', '1')
+ .should('not.have.css', 'pointer-events', 'none')
+ .get('ul li').should('have.length.gte', 1)
+ .contains('Pizza')
+ ;
+ });
+
+ it('Goes to the detail page for the search result "Pizza"', function() {
+ cy.get('.phpdocumentor-header .phpdocumentor-search input[type="search"]')
+ .type('pizza');
+
+ let searchResults = cy.get('.phpdocumentor-search-results');
+ searchResults
+ .get('ul li').contains('Pizza')
+ .click({force: true});
+
+ cy.url().should('include', '/namespaces/marios-pizza.html');
+ });
+
+ it('Closes the results when clearing the search field', function() {
+ cy.get('.phpdocumentor-header .phpdocumentor-search input[type="search"]')
+ .type('pizza');
+ cy.get('.phpdocumentor-header .phpdocumentor-search')
+ .should('have.class', 'phpdocumentor-search--has-results');
+ cy.get('.phpdocumentor-header .phpdocumentor-search input[type="search"]')
+ .clear({ force: true });
+ cy.get('.phpdocumentor-header .phpdocumentor-search')
+ .should('not.have.class', 'phpdocumentor-search--has-results');
+
+ cy.get('.phpdocumentor-search-results')
+ .should('have.css', 'opacity', '0')
+ .should('have.css', 'pointer-events', 'none')
+ ;
+ });
+
+ // TODO: Disabled test because it fails a lot on the mac runner and needs to be investaged
+ // It is not the most important feature to test, so I am disabling it in favour of
+ // pipeline reliability
+ // it('Closes the results when pressing escape', function() {
+ // cy.get('.phpdocumentor-header .phpdocumentor-search input[type="search"]')
+ // .type('pizza')
+ // .blur(); // Ensure focus is gone
+ //
+ // cy.get('.phpdocumentor-search-results__dialog')
+ // .parents('body')
+ // .type('{esc}');
+ //
+ // cy.get('.phpdocumentor-header .phpdocumentor-search')
+ // .should('not.have.class', 'phpdocumentor-search--has-results');
+ //
+ // cy.get('.phpdocumentor-search-results')
+ // .should('have.css', 'opacity', '0')
+ // .should('have.css', 'pointer-events', 'none')
+ // ;
+ // });
+}
diff --git a/cypress/integration/default/sidebar.inc.js b/cypress/integration/default/sidebar.inc.js
new file mode 100644
index 0000000000..d084e4fae5
--- /dev/null
+++ b/cypress/integration/default/sidebar.inc.js
@@ -0,0 +1,118 @@
+import {getSidebarHeaderByTitle, getSidebarItemByTitle} from "./helpers/sidebar.lib";
+import {shouldVisitPageWithTitle} from "./helpers/pages.lib";
+
+export default function() {
+ it('Has "Documentation" in the menu as title', function() {
+ cy.get('.phpdocumentor-title').contains("Documentation");
+ });
+
+ describe('Namespaces section', function() {
+ it('Shows the Namespaces section', function () {
+ getSidebarHeaderByTitle('Namespaces')
+ .should('be.visible');
+ })
+
+ it('Shows the "Marios" namespace', function () {
+ getSidebarItemByTitle('Namespaces', 'Marios', 'namespace')
+ .should('be.visible');
+ });
+
+ it('Opens the "Marios" namespace', function() {
+ getSidebarItemByTitle('Namespaces', 'Marios', 'namespace')
+ .click();
+
+ shouldVisitPageWithTitle('/namespaces/marios.html', 'Marios');
+ });
+
+ it('Shows the "Pizza" (sub)namespace', function() {
+ cy.get('.phpdocumentor-sidebar .phpdocumentor-list').contains("Pizza");
+ });
+
+ it('Opens the "Pizza" namespace', function() {
+ cy.get('.phpdocumentor-sidebar .phpdocumentor-list').contains("Pizza")
+ .click();
+
+ shouldVisitPageWithTitle('/namespaces/marios-pizza.html', 'Pizza');
+ });
+ });
+
+ describe('Packages section', function() {
+ it('Shows the Packages section', function () {
+ getSidebarHeaderByTitle('Packages')
+ .should('be.visible');
+ })
+
+ it('Shows the "Mario" package', function () {
+ getSidebarItemByTitle('Packages', 'Mario', 'namespace')
+ .should('be.visible');
+ });
+
+ it('Opens the "Marios" package', function() {
+ getSidebarItemByTitle('Packages', 'Marios', 'namespace')
+ .click();
+ shouldVisitPageWithTitle('/packages/Marios.html', 'Marios');
+ });
+ });
+
+ describe('Reports section', function() {
+ it('Shows the Reports section', function () {
+ getSidebarHeaderByTitle('Reports')
+ .should('be.visible');
+ });
+
+ it('Has a report with Deprecated elements', function () {
+ getSidebarItemByTitle('Reports', 'Deprecated')
+ .should('be.visible');
+ });
+
+ it('Has a report with Errors', function () {
+ getSidebarItemByTitle('Reports', 'Errors')
+ .should('be.visible');
+ });
+
+ it('Has a report with Markers', function () {
+ getSidebarItemByTitle('Reports', 'Markers')
+ .should('be.visible')
+ });
+
+ it('Opens the Deprecated elements report', function() {
+ getSidebarItemByTitle('Reports', 'Deprecated')
+ .click();
+
+ shouldVisitPageWithTitle('/reports/deprecated.html', 'Deprecated');
+ });
+
+ it('Opens the Errors report', function() {
+ getSidebarItemByTitle('Reports', 'Errors')
+ .click();
+
+ shouldVisitPageWithTitle('/reports/errors.html', 'Errors');
+ });
+
+ it('Opens the Markers report', function() {
+ getSidebarItemByTitle('Reports', 'Markers')
+ .click();
+
+ shouldVisitPageWithTitle('/reports/markers.html', 'Markers');
+ });
+ });
+
+ describe('Indices section', function() {
+ it('Shows the Indices section', function () {
+ getSidebarHeaderByTitle('Indices')
+ .should('be.visible');
+ });
+
+ it('Has a index with all files in it', function () {
+ getSidebarItemByTitle('Indices', 'Files')
+ .should('be.visible');
+ });
+
+ it('Opens the Files index', function() {
+ getSidebarItemByTitle('Indices', 'Files')
+ .click();
+
+ shouldVisitPageWithTitle('/indices/files.html', 'Files');
+ });
+ });
+};
diff --git a/cypress/integration/default/traits.spec.js b/cypress/integration/default/traits.spec.js
new file mode 100644
index 0000000000..853a77757d
--- /dev/null
+++ b/cypress/integration/default/traits.spec.js
@@ -0,0 +1,210 @@
+import sidebar from './sidebar.inc';
+import search from './search.inc';
+import {getToc, getTocEntry} from './helpers/tableOfContents.lib';
+import {getEntryIn, getSummaryEntry} from './helpers/onThisPage.lib';
+import {getElementWithName} from './helpers/elements.lib';
+
+describe('Traits', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-SharedTrait.html');
+ });
+
+ describe('Search', search);
+ describe('In the sidebar', sidebar);
+
+ describe('Breadcrumb', function() {
+ it('Has a breadcrumb featuring "Marios"', function() {
+ cy.get('.phpdocumentor-breadcrumb').should('have.length', 1);
+ cy.get('.phpdocumentor-breadcrumb').contains('Marios');
+ });
+
+ it('will send you to the namespace page when clicking on "Marios" in the breadcrumb', function() {
+ cy.get('.phpdocumentor-breadcrumb')
+ .contains('Marios')
+ .click();
+ cy.url().should('include', '/namespaces/marios.html');
+ });
+ });
+
+ describe('Synopsis', function() {
+ it('Page title includes the fully qualified trait name', function () {
+ cy.title().should('match', /\u00bb \\Marios\\SharedTrait\s*$/);
+ });
+
+ it('Has "SharedTrait" as title', function () {
+ cy.get('.phpdocumentor-content__title').contains('SharedTrait');
+ });
+
+ it('Has a summary', function () {
+ cy.get('.phpdocumentor-element.-trait > .phpdocumentor-summary')
+ .contains('Trait that all pizza\'s could share.');
+ });
+
+ it('Has a description', function () {
+ cy.get('.phpdocumentor-element.-trait > .phpdocumentor-description')
+ .contains('Okay, so I couldn\'t think of something that fits the theme .. If you have a cool idea: please issue a PR :)');
+ });
+ });
+
+ describe('Table of Contents', function() {
+ it('Shows methods with their return type and visibility', function() {
+ getTocEntry(getToc('methods', 'Methods'), 'sayHello()')
+ .should('have.class', '-method')
+ .and('have.class', '-public')
+ .and('contain', 'Base');
+ });
+ });
+
+ describe('On This Page', function() {
+ it('renders links to the summary items', function() {
+ getSummaryEntry('Methods').should('exist');
+ });
+ it('renders references to methods on this page', function() {
+ getEntryIn('Methods', 'sayHello()').should('exist');
+ });
+ });
+
+ describe('Showing constants', function() {
+ describe('Synopsis', function() {
+ it('Show the name', function() {
+ getElementWithName('constant', 'MY_CONSTANT').should('be.visible');
+ });
+
+ it('Show the file name where the constant is located in the project', function() {
+ getElementWithName('constant', 'MY_CONSTANT')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'SharedTrait.php')
+ .find('abbr')
+ .should('have.attr', 'title', 'src/SharedTrait.php');
+ });
+
+ it('Can be marked "public" (visibility) to influence styling', function () {
+ getElementWithName('constant', 'MY_CONSTANT')
+ .should('have.class', '-public')
+ .and('not.have.class', '-protected')
+ .and('not.have.class', '-private');
+ });
+
+ it('Links to the file documentation wherein the constant is', function() {
+ getElementWithName('constant', 'MY_CONSTANT')
+ .find('.phpdocumentor-element-found-in__file')
+ .contains('a', 'SharedTrait.php')
+ .should('have.attr', 'href', 'files/src-sharedtrait.html');
+ });
+
+ it('Show the line number where the constant is located', function() {
+ getElementWithName('constant', 'MY_CONSTANT')
+ .find('.phpdocumentor-element-found-in__line')
+ .should((element) => {
+ expect(parseInt(element.text())).to.be.at.least(1);
+ });
+ });
+ });
+
+ describe('Signature', function() {
+ it('Can show the "public" visibility specifier', function() {
+ getElementWithName('constant', 'MY_CONSTANT')
+ .find('.phpdocumentor-signature__visibility')
+ .contains('public');
+ });
+
+ it('Shows the name of the constant', function() {
+ getElementWithName('constant', 'MY_CONSTANT')
+ .find('.phpdocumentor-signature__name')
+ .contains('MY_CONSTANT');
+ });
+
+ it('Type defaults to mixed when unable to infer', function() {
+ getElementWithName('constant', 'MY_CONSTANT')
+ .find('.phpdocumentor-signature__type')
+ .contains('mixed');
+ });
+ });
+ });
+
+ describe('Traits using other traits', function() {
+ beforeEach(function(){
+ cy.visit('build/default/classes/Marios-PizzaToppingTrait.html');
+ });
+
+ describe('Methods', function() {
+ it('Shows methods inherited from used trait', function() {
+ // Check that the Table of Contents includes methods from the trait
+ getTocEntry(getToc('methods', 'Methods'), 'getSauceType()')
+ .should('exist')
+ .and('have.class', '-method')
+ .and('have.class', '-public');
+ });
+
+ it.skip('Indicates which trait a method came from', function() {
+ // Ensure the method shows where it was inherited from
+ getTocEntry(getToc('methods', 'Methods'), 'getSauceType()')
+ .find('.phpdocumentor-table-of-contents__entry__trait')
+ .should('contain', 'PizzaSauceTrait');
+ });
+
+ it.skip('Links to the trait from which a method was inherited', function() {
+ // Ensure the trait name links to that trait's documentation
+ getTocEntry(getToc('methods', 'Methods'), 'getSauceType()')
+ .find('.phpdocumentor-table-of-contents__entry__trait a')
+ .should('have.attr', 'href', 'classes/Marios-PizzaSauceTrait.html');
+ });
+ });
+
+ describe('Properties', function() {
+ it('Shows properties inherited from used trait', function() {
+ // Check that the Table of Contents includes properties from the trait
+ getTocEntry(getToc('properties', 'Properties'), 'sauceType')
+ .should('exist')
+ .and('have.class', '-property')
+ .and('have.class', '-protected');
+ });
+
+ it.skip('Indicates which trait a property came from', function() {
+ // Ensure the property shows where it was inherited from
+ getTocEntry(getToc('properties', 'Properties'), 'sauceType')
+ .find('.phpdocumentor-table-of-contents__entry__trait')
+ .should('contain', 'PizzaSauceTrait');
+ });
+
+ it.skip('Links to the trait from which a property was inherited', function() {
+ // Ensure the trait name links to that trait's documentation
+ getTocEntry(getToc('properties', 'Properties'), 'sauceType')
+ .find('.phpdocumentor-table-of-contents__entry__trait a')
+ .should('have.attr', 'href', 'classes/Marios-PizzaSauceTrait.html');
+ });
+ });
+
+ describe('Constants', function() {
+ beforeEach(function(){
+ // First, let's check if we can see a trait's constants in the documentation
+ cy.visit('build/default/classes/Marios-SharedTrait.html');
+ // Then let's create a copy of this test file to check at runtime
+ cy.visit('build/default/classes/Marios-PizzaToppingTrait.html');
+ });
+
+ it('Shows constants inherited from used trait', function() {
+ // Check that the Table of Contents includes constants from the trait
+ getTocEntry(getToc('constants', 'Constants'), 'SAUCE_VERSION')
+ .should('exist')
+ .and('have.class', '-constant')
+ .and('have.class', '-public');
+ });
+
+ it.skip('Indicates which trait a constant came from', function() {
+ // Ensure the constant shows where it was inherited from
+ getTocEntry(getToc('constants', 'Constants'), 'SAUCE_VERSION')
+ .find('.phpdocumentor-table-of-contents__entry__trait')
+ .should('contain', 'PizzaSauceTrait');
+ });
+
+ it.skip('Links to the trait from which a constant was inherited', function() {
+ // Ensure the trait name links to that trait's documentation
+ getTocEntry(getToc('constants', 'Constants'), 'SAUCE_VERSION')
+ .find('.phpdocumentor-table-of-contents__entry__trait a')
+ .should('have.attr', 'href', 'classes/Marios-PizzaSauceTrait.html');
+ });
+ });
+
+ });
+});
diff --git a/data/ajax_search.php b/data/ajax_search.php
deleted file mode 100644
index e81fcf20e8..0000000000
--- a/data/ajax_search.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
-
-// get search term
-$term = strtolower($_GET['term']);
-
-// find term in XML document
-$xml = new DOMDocument();
-$xml->load('search_index.xml');
-$xpath = new DOMXPath($xml);
-
-$qry = $xpath->query(
- "//value[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', "
- . "'abcdefghijklmnopqrstuvwxyz'), '$term')]/.."
-);
-$results = array();
-
-/** @var DOMElement $element */
-foreach ($qry as $element) {
- /** @var DomNodeList $value */
- $value = $element->getElementsByTagName('value');
- $id = $element->getElementsByTagName('id');
- $type = $element->getElementsByTagName('type');
- $results[] = '{ "value": "' . addslashes($value->item(0)->nodeValue)
- . '", "id": "' . addslashes($id->item(0)->nodeValue)
- . '", "type": "' . addslashes($type->item(0)->nodeValue) . '" }';
-}
-
-echo '[' . implode(', ', $results) . ']';
\ No newline at end of file
diff --git a/data/asset-builder/.gitignore b/data/asset-builder/.gitignore
new file mode 100644
index 0000000000..7774c49ea2
--- /dev/null
+++ b/data/asset-builder/.gitignore
@@ -0,0 +1,2 @@
+css
+js
diff --git a/data/asset-builder/package-lock.json b/data/asset-builder/package-lock.json
new file mode 100644
index 0000000000..43e40d91d0
--- /dev/null
+++ b/data/asset-builder/package-lock.json
@@ -0,0 +1,5 @@
+{
+ "name": "@phpdocumentor/template-default-assets",
+ "version": "1.11.0-build.0",
+ "lockfileVersion": 1
+}
diff --git a/data/asset-builder/package.json b/data/asset-builder/package.json
new file mode 100644
index 0000000000..1ac9584654
--- /dev/null
+++ b/data/asset-builder/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "@phpdocumentor/template-default-assets",
+ "repository": {
+ "type": "git",
+ "url": "ssh://git@github.com/phpDocumentor/phpDocumentor.git",
+ "directory": "data/asset-builder"
+ },
+ "version": "1.11.0-build.0",
+ "description": "The base assets used to render the default template",
+ "files": [
+ "css/*.css",
+ "js/*.js"
+ ],
+ "keywords": [
+ "phpdocumentor",
+ "default",
+ "assets",
+ "css",
+ "js"
+ ],
+ "author": "Mike van Riel ",
+ "license": "MIT"
+}
diff --git a/data/base_template/css/template.css b/data/base_template/css/template.css
deleted file mode 100644
index dcc65474b2..0000000000
--- a/data/base_template/css/template.css
+++ /dev/null
@@ -1 +0,0 @@
-@import url('abstract.css');
\ No newline at end of file
diff --git a/data/base_template/index.xsl b/data/base_template/index.xsl
deleted file mode 100644
index 043bb7e889..0000000000
--- a/data/base_template/index.xsl
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/base_template/template.xml b/data/base_template/template.xml
deleted file mode 100644
index 96ea67df85..0000000000
--- a/data/base_template/template.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
- My new template
- {{ author }}
- {{ version }}
-
-
-
-
-
-
-
-
-
-
- false
-
-
-
-
- false
- false
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/examples/MariosPizzeria/phpdoc.xml b/data/examples/MariosPizzeria/phpdoc.xml
new file mode 100644
index 0000000000..9d4cef9b3d
--- /dev/null
+++ b/data/examples/MariosPizzeria/phpdoc.xml
@@ -0,0 +1,18 @@
+
+
+
+ Marios
+ build/api-cache
+
+
+ build/api
+
+
+ .
+ tests/**/*
+ build/**/*
+
+
+
+
+
diff --git a/data/examples/MariosPizzeria/src/Delivery.php b/data/examples/MariosPizzeria/src/Delivery.php
new file mode 100644
index 0000000000..8cd8016f47
--- /dev/null
+++ b/data/examples/MariosPizzeria/src/Delivery.php
@@ -0,0 +1,26 @@
+property1; }
+ }
+
+ /**
+ * Returns the moisture of the pizza.
+ *
+ * This property is used to determine how moist the pizza is, which can affect the overall taste and texture.
+ */
+ public private(set) float $moisture {
+ /**
+ * value is calculated during the time in the oven.
+ *
+ * Description
+ *
+ * @return int<0, 10> pizza's moisture level
+ */
+ get { return $this->property2; }
+ set(int|float $value) { $this->property2 = $value; }
+ }
+
+ /**
+ * Number of toppings on the pizza.
+ *
+ * This is a non-virtual property with hooks. It uses the same name for backing field.
+ */
+ public int $toppingCount = 0 {
+ get { return $this->toppingCount; }
+ set(int $value) {
+ if ($value < 0) {
+ throw new \InvalidArgumentException("Cannot have negative toppings");
+ }
+ $this->toppingCount = $value;
+ }
+ }
+
+ /**
+ * Size of the pizza (small, medium, large).
+ *
+ * This is a non-virtual property with hooks and custom validation.
+ */
+ public string $size = 'medium' {
+ get { return $this->size; }
+ set(string $value) {
+ $value = strtolower($value);
+
+ if (!in_array($value, ['small', 'medium', 'large'])) {
+ throw new \InvalidArgumentException("Size must be small, medium, or large");
+ }
+ $this->size = $value;
+ }
+ }
+
+ /**
+ * Price of the pizza.
+ *
+ * This is a non-virtual property with hooks and formatting.
+ */
+ public float $price = 0.0 {
+ get {
+ return $this->price * 1.09;
+ }
+ set(float $value) {
+ if ($value < 0) {
+ throw new \InvalidArgumentException("Price cannot be negative");
+ }
+ $this->price = $value;
+ }
+ }
+
+ /**
+ * The ingredients array for the pizza.
+ *
+ * This demonstrates property hooks with arrays.
+ *
+ * @var string[]
+ */
+ public array $ingredients {
+ get { return ['cheese', 'tomato', 'dough']; }
+ set(array $value) {}
+ }
+
+ /**
+ * Reference to the pizzeria this pizza belongs to.
+ *
+ * Demonstrates property hooks with references.
+ */
+ public object $pizzeria {
+ get { return $GLOBALS['pizzeria'] ?? new \stdClass(); }
+ set(&$value) { $GLOBALS['pizzeria'] = $value; }
+ }
+
+ /**
+ * Property with default value.
+ *
+ * This property has a default value when accessed for the first time.
+ */
+ public int $cookingTime {
+ get { return $this->property3 ?? 15; }
+ set(int $value) { $this->property3 = $value; }
+ }
+
+ /**
+ * Special instructions for preparing the pizza.
+ *
+ * This is a write-only property that can only be set, not read.
+ * It demonstrates the write-only property hook pattern.
+ */
+ public string $instructions {
+ set(string $value) {
+ error_log("Pizza instructions received: " . $value);
+ }
+ }
+
+ /**
+ * Demonstrates hook inheritance from a parent class.
+ */
+ public string $base {
+ get { return "Thin crust"; }
+ }
+
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ /**
+ * Om nom nom.
+ *
+ * What else do you do with a pizza? Put it in your freezer?
+ *
+ * @return void
+ */
+ #[Route('/very/cool/route/{foo}/{bar}', name: 'very_cool_route',
+ defaults: ['foo' => 'foo', 'bar' => 'bar'])]
+ public function eatIt()
+ {
+ }
+}
diff --git a/data/examples/MariosPizzeria/src/Pizza/Base.php b/data/examples/MariosPizzeria/src/Pizza/Base.php
new file mode 100644
index 0000000000..1d5ec4012d
--- /dev/null
+++ b/data/examples/MariosPizzeria/src/Pizza/Base.php
@@ -0,0 +1,20 @@
+ Unfortunately, life did not pan out as I had expected. I will have to do with
+ * > making examples that don't make sense?
+ *
+ * Just like this one, though I managed to sneak a blockquote in.
+ */
+final class Base
+{
+ public function __construct(?Sauce $sauce = new Sauce())
+ {
+ }
+}
diff --git a/data/examples/MariosPizzeria/src/Pizza/Sauce.php b/data/examples/MariosPizzeria/src/Pizza/Sauce.php
new file mode 100644
index 0000000000..6f639affb1
--- /dev/null
+++ b/data/examples/MariosPizzeria/src/Pizza/Sauce.php
@@ -0,0 +1,10 @@
+sauceType;
+ }
+
+ protected function applySauce(string $sauceAmount): string
+ {
+ return "Applied {$sauceAmount} of {$this->sauceType} sauce to the base";
+ }
+}
diff --git a/data/examples/MariosPizzeria/src/PizzaToppingTrait.php b/data/examples/MariosPizzeria/src/PizzaToppingTrait.php
new file mode 100644
index 0000000000..db000785cd
--- /dev/null
+++ b/data/examples/MariosPizzeria/src/PizzaToppingTrait.php
@@ -0,0 +1,30 @@
+toppings;
+ }
+
+ public function preparePizza(string $size): string
+ {
+ // Using the applySauce method from PizzaSauceTrait
+ $base = $this->applySauce($size);
+ $toppingsStr = implode(', ', $this->toppings);
+
+ return "{$base} and topped with {$toppingsStr}";
+ }
+}
diff --git a/data/examples/MariosPizzeria/src/Pizzeria.php b/data/examples/MariosPizzeria/src/Pizzeria.php
new file mode 100644
index 0000000000..749acd249f
--- /dev/null
+++ b/data/examples/MariosPizzeria/src/Pizzeria.php
@@ -0,0 +1,68 @@
+
+
+ phpDocumentor
+
+
+
+
+ latest
+
+
+ docs
+
+
+
+
+
+
diff --git a/data/images/icons/class.png b/data/images/icons/class.png
deleted file mode 100644
index 0f0d94e0a4..0000000000
Binary files a/data/images/icons/class.png and /dev/null differ
diff --git a/data/images/icons/constant.png b/data/images/icons/constant.png
deleted file mode 100644
index 76e2242459..0000000000
Binary files a/data/images/icons/constant.png and /dev/null differ
diff --git a/data/images/icons/function.png b/data/images/icons/function.png
deleted file mode 100644
index 5dea687050..0000000000
Binary files a/data/images/icons/function.png and /dev/null differ
diff --git a/data/images/icons/interface.png b/data/images/icons/interface.png
deleted file mode 100644
index d6383c00ca..0000000000
Binary files a/data/images/icons/interface.png and /dev/null differ
diff --git a/data/images/icons/method.png b/data/images/icons/method.png
deleted file mode 100644
index 946d0ff494..0000000000
Binary files a/data/images/icons/method.png and /dev/null differ
diff --git a/data/images/icons/property.png b/data/images/icons/property.png
deleted file mode 100644
index 0671c391ed..0000000000
Binary files a/data/images/icons/property.png and /dev/null differ
diff --git a/data/phpdoc.tpl.xml b/data/phpdoc.tpl.xml
deleted file mode 100644
index 714dec102b..0000000000
--- a/data/phpdoc.tpl.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
- Default
- output
-
- TODO
- FIXME
-
-
- php
- php3
- phtml
-
-
-
-
- on
- on
-
-
- output
-
-
- warn
-
- {APP_ROOT}/data/log/{DATE}.log
- {APP_ROOT}/data/log/{DATE}.errors.log
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data/syntax_highlighter/LGPL-LICENSE b/data/syntax_highlighter/LGPL-LICENSE
deleted file mode 100644
index 3f9959fc56..0000000000
--- a/data/syntax_highlighter/LGPL-LICENSE
+++ /dev/null
@@ -1,165 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
- 0. Additional Definitions.
-
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
- 1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
- 2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
- 3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
-
- 4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
-
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
-
- 5. Combined Libraries.
-
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
-
- 6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
\ No newline at end of file
diff --git a/data/syntax_highlighter/MIT-LICENSE b/data/syntax_highlighter/MIT-LICENSE
deleted file mode 100644
index e7c70ba14a..0000000000
--- a/data/syntax_highlighter/MIT-LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2003, 2004 Jim Weirich
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/data/syntax_highlighter/compass/_theme_template.scss b/data/syntax_highlighter/compass/_theme_template.scss
deleted file mode 100644
index 53f4df533b..0000000000
--- a/data/syntax_highlighter/compass/_theme_template.scss
+++ /dev/null
@@ -1,120 +0,0 @@
-$background: white !default;
-
-$line_alt1_background: $background !default;
-$line_alt2_background: $background !default;
-
-$line_highlighted_background: #e0e0e0 !default;
-$line_highlighted_number: black !default;
-
-$gutter_text: #afafaf !default;
-$gutter_border_color: #6ce26c !default;
-$gutter_border: 3px solid $gutter_border_color !default;
-
-$toolbar_collapsed_a: #00f !default;
-$toolbar_collapsed_a_hover: #f00 !default;
-$toolbar_collapsed_background: #fff !default;
-$toolbar_collapsed_border: 1px solid $gutter_border_color !default;
-
-$toolbar_a: #fff !default;
-$toolbar_a_hover: #000 !default;
-$toolbar_background: $gutter_border_color !default;
-$toolbar_border: none !default;
-
-$code_plain: black !default;
-$code_comments: #008200 !default;
-$code_string: blue !default;
-$code_keyword: #006699 !default;
-$code_preprocessor: gray !default;
-$code_variable: #aa7700 !default;
-$code_value: #009900 !default;
-$code_functions: #ff1493 !default;
-$code_constants: #0066cc !default;
-$code_script: $code_keyword !default;
-$code_script_background: none !default;
-$code_color1: gray !default;
-$code_color2: #ff1493 !default;
-$code_color3: red !default;
-
-$caption_color: $code_plain !default;
-
-// Interface elements.
-.syntaxhighlighter {
- background-color: $background !important;
-
- // Highlighed line number
- .line {
- &.alt1 { background-color: $line_alt1_background !important; }
- &.alt2 { background-color: $line_alt2_background !important; }
-
- // Highlighed line
- &.highlighted {
- &.alt1, &.alt2 { background-color: $line_highlighted_background !important; }
- &.number { color: $line_highlighted_number !important; }
- }
- }
-
- table {
- caption {
- color: $caption_color !important;
- }
- }
-
- // Add border to the lines
- .gutter {
- color: $gutter_text !important;
- .line {
- border-right: $gutter_border !important;
-
- &.highlighted {
- background-color: $gutter_border_color !important;
- color: $background !important;
- }
- }
- }
-
- &.printing .line .content { border: none !important; }
-
- &.collapsed {
- overflow: visible !important;
-
- .toolbar {
- color: $toolbar_collapsed_a !important;
- background: $toolbar_collapsed_background !important;
- border: $toolbar_collapsed_border !important;
-
- a {
- color: $toolbar_collapsed_a !important;
- &:hover { color: $toolbar_collapsed_a_hover !important; }
- }
- }
- }
-
- .toolbar {
- color: $toolbar_a !important;
- background: $toolbar_background !important;
- border: $toolbar_border !important;
- a {
- color: $toolbar_a !important;
- &:hover { color: $toolbar_a_hover !important; }
- }
- }
-
- // Actual syntax highlighter colors.
- .plain, .plain a { color: $code_plain !important; }
- .comments, .comments a { color: $code_comments !important; }
- .string, .string a { color: $code_string !important; }
- .keyword { color: $code_keyword !important; }
- .preprocessor { color: $code_preprocessor !important; }
- .variable { color: $code_variable !important; }
- .value { color: $code_value !important; }
- .functions { color: $code_functions !important; }
- .constants { color: $code_constants !important; }
- .script {
- font-weight: bold !important;
- color: $code_script !important;
- background-color: $code_script_background !important;
- }
- .color1, .color1 a { color: $code_color1 !important; }
- .color2, .color2 a { color: $code_color2 !important; }
- .color3, .color3 a { color: $code_color3 !important; }
-}
diff --git a/data/syntax_highlighter/compass/config.rb b/data/syntax_highlighter/compass/config.rb
deleted file mode 100644
index 6f82de12e7..0000000000
--- a/data/syntax_highlighter/compass/config.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-environment = :production
-project_type = :stand_alone
-http_path = "/"
-css_dir = "../styles"
-sass_dir = "."
-images_dir = "images"
-sass_options = {
- :line_numbers => false,
- :debug_info => false
-}
-
-# output_style = :compressed
-# output_style = :compact
-output_style = :expanded
diff --git a/data/syntax_highlighter/compass/shCore.scss b/data/syntax_highlighter/compass/shCore.scss
deleted file mode 100644
index a67e4f908a..0000000000
--- a/data/syntax_highlighter/compass/shCore.scss
+++ /dev/null
@@ -1,216 +0,0 @@
-@mixin round_corners_custom($top, $right, $bottom, $left) {
- -moz-border-radius: $top $right $bottom $left !important;
- -webkit-border-radius: $top $right $bottom $left !important;
-}
-
-@mixin round_corners($radius) {
- @include round_corners_custom($radius, $radius, $radius, $radius);
-}
-
-.syntaxhighlighter {
- a,
- div,
- code,
- table,
- table td,
- table tr,
- table tbody,
- table thead,
- table caption,
- textarea {
- @include round_corners(0);
-
- background: none !important;
- border: 0 !important;
- bottom: auto !important;
- float: none !important;
- height: auto !important;
- left: auto !important;
- line-height: 1.1em !important;
- margin: 0 !important;
- outline: 0 !important;
- overflow: visible !important;
- padding: 0 !important;
- position: static !important;
- right: auto !important;
- text-align: left !important;
- top: auto !important;
- vertical-align: baseline !important;
- width: auto !important;
- box-sizing: content-box !important;
- font: {
- family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
- weight: normal !important;
- style: normal !important;
- size: 1em !important;
- }
- min: {
- // For IE8, FF & WebKit
- height: inherit !important;
- // For IE7
- height: auto !important;
- }
- }
-}
-
-.syntaxhighlighter {
- width: 100% !important;
- margin: 1em 0 1em 0 !important;
-
- position: relative !important;
- overflow: auto !important;
- font-size: 1em !important;
-
- &.source { overflow: hidden !important; }
-
- // set up bold and italic
- .bold { font-weight: bold !important; }
- .italic { font-style: italic !important; }
-
- .line { white-space: pre !important; }
-
- // main table and columns
- table {
- width: 100% !important;
- caption {
- text-align: left !important;
- padding: .5em 0 0.5em 1em !important;
- }
-
- td.code {
- width: 100% !important;
-
- .container {
- position: relative !important;
-
- textarea {
- box-sizing: border-box !important;
- position: absolute !important;
- left: 0 !important;
- top: 0 !important;
- width: 100% !important;
- height: 100% !important;
- border: none !important;
- background: white !important;
- padding-left: 1em !important;
- overflow: hidden !important;
- white-space: pre !important;
- }
- }
- }
-
- // middle spacing between line numbers and lines
- td.gutter .line {
- text-align: right !important;
- padding: 0 0.5em 0 1em !important;
- }
-
- td.code .line {
- padding: 0 1em !important;
- }
- }
-
- &.nogutter {
- td.code {
- .container textarea, .line { padding-left: 0em !important; }
- }
- }
-
- &.show { display: block !important; }
-
- // Adjust some properties when collapsed
- &.collapsed {
- table { display: none !important; }
-
- .toolbar {
- padding: 0.1em 0.8em 0em 0.8em !important;
- font-size: 1em !important;
- position: static !important;
- width: auto !important;
- height: auto !important;
-
- span {
- display: inline !important;
- margin-right: 1em !important;
-
- a {
- padding: 0 !important;
- display: none !important;
- &.expandSource { display: inline !important; }
- }
- }
- }
- }
-
- // Styles for the toolbar
- .toolbar {
- position: absolute !important;
- right: 1px !important;
- top: 1px !important;
- width: 11px !important;
- height: 11px !important;
- font-size: 10px !important;
- z-index: 10 !important;
-
- span.title { display: inline !important; }
-
- a {
- display: block !important;
- text-align: center !important;
- text-decoration: none !important;
- padding-top: 1px !important;
-
- &.expandSource { display: none !important; }
- }
- }
-
- &.ie {
- font-size: .9em !important;
- padding: 1px 0 1px 0 !important;
-
- .toolbar {
- line-height: 8px !important;
- a {
- padding-top: 0px !important;
- }
- }
- }
-
- // Print view.
- // Colors are based on the default theme without background.
- &.printing {
- .line.alt1 .content,
- .line.alt2 .content,
- .line.highlighted .number,
- .line.highlighted.alt1 .content,
- .line.highlighted.alt2 .content { background: none !important; }
-
- // Gutter line numbers
- .line {
- .number { color: #bbbbbb !important; }
- // Add border to the lines
- .content { color: black !important; }
- }
-
- // Toolbar when visible
- .toolbar { display: none !important; }
- a { text-decoration: none !important; }
- .plain, .plain a { color: black !important; }
- .comments, .comments a { color: #008200 !important; }
- .string, .string a { color: blue !important; }
- .keyword {
- color: #006699 !important;
- font-weight: bold !important;
- }
- .preprocessor { color: gray !important; }
- .variable { color: #aa7700 !important; }
- .value { color: #009900 !important; }
- .functions { color: #ff1493 !important; }
- .constants { color: #0066cc !important; }
- .script { font-weight: bold !important; }
- .color1, .color1 a { color: gray !important; }
- .color2, .color2 a { color: #ff1493 !important; }
- .color3, .color3 a { color: red !important; }
- .break, .break a { color: black !important; }
- }
-}
\ No newline at end of file
diff --git a/data/syntax_highlighter/compass/shCoreDefault.scss b/data/syntax_highlighter/compass/shCoreDefault.scss
deleted file mode 100644
index ff80c7ffbb..0000000000
--- a/data/syntax_highlighter/compass/shCoreDefault.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeDefault.scss";
diff --git a/data/syntax_highlighter/compass/shCoreDjango.scss b/data/syntax_highlighter/compass/shCoreDjango.scss
deleted file mode 100644
index ef572e9d69..0000000000
--- a/data/syntax_highlighter/compass/shCoreDjango.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeDjango.scss";
diff --git a/data/syntax_highlighter/compass/shCoreEclipse.scss b/data/syntax_highlighter/compass/shCoreEclipse.scss
deleted file mode 100644
index 9767f5373d..0000000000
--- a/data/syntax_highlighter/compass/shCoreEclipse.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeEclipse.scss";
diff --git a/data/syntax_highlighter/compass/shCoreEmacs.scss b/data/syntax_highlighter/compass/shCoreEmacs.scss
deleted file mode 100644
index 5e466f36b2..0000000000
--- a/data/syntax_highlighter/compass/shCoreEmacs.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeEmacs.scss";
diff --git a/data/syntax_highlighter/compass/shCoreFadeToGrey.scss b/data/syntax_highlighter/compass/shCoreFadeToGrey.scss
deleted file mode 100644
index 46285950fe..0000000000
--- a/data/syntax_highlighter/compass/shCoreFadeToGrey.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeFadeToGrey.scss";
diff --git a/data/syntax_highlighter/compass/shCoreMDUltra.scss b/data/syntax_highlighter/compass/shCoreMDUltra.scss
deleted file mode 100644
index 10ad4c5b03..0000000000
--- a/data/syntax_highlighter/compass/shCoreMDUltra.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeMDUltra.scss";
diff --git a/data/syntax_highlighter/compass/shCoreMidnight.scss b/data/syntax_highlighter/compass/shCoreMidnight.scss
deleted file mode 100644
index e357eb28f9..0000000000
--- a/data/syntax_highlighter/compass/shCoreMidnight.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeMidnight.scss";
diff --git a/data/syntax_highlighter/compass/shCoreRDark.scss b/data/syntax_highlighter/compass/shCoreRDark.scss
deleted file mode 100644
index 5c26da3441..0000000000
--- a/data/syntax_highlighter/compass/shCoreRDark.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "shCore.scss";
-@import "shThemeRDark.scss";
diff --git a/data/syntax_highlighter/compass/shThemeDefault.scss b/data/syntax_highlighter/compass/shThemeDefault.scss
deleted file mode 100644
index 1574dae805..0000000000
--- a/data/syntax_highlighter/compass/shThemeDefault.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// Default Syntax Highlighter theme.
-
-@import "_theme_template.scss";
-
-.syntaxhighlighter {
- .keyword { font-weight: bold !important; }
-}
diff --git a/data/syntax_highlighter/compass/shThemeDjango.scss b/data/syntax_highlighter/compass/shThemeDjango.scss
deleted file mode 100644
index 8e95c567ae..0000000000
--- a/data/syntax_highlighter/compass/shThemeDjango.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-// Django SyntaxHighlighter theme
-
-$background: #0a2b1d !default;
-
-$line_highlighted_background: #233729 !default;
-$line_highlighted_number: white !default;
-
-$gutter_text: #497958 !default;
-$gutter_border_color: #41a83e !default;
-
-$toolbar_collapsed_a: #96dd3b !default;
-$toolbar_collapsed_a_hover: #fff !default;
-$toolbar_collapsed_background: #000 !default;
-
-$toolbar_a: #fff !default;
-$toolbar_a_hover: #ffe862 !default;
-
-$code_plain: #f8f8f8 !default;
-$code_comments: #336442 !default;
-$code_string: #9df39f !default;
-$code_keyword: #96dd3b !default;
-$code_preprocessor: #91bb9e !default;
-$code_variable: #ffaa3e !default;
-$code_value: #f7e741 !default;
-$code_functions: #ffaa3e !default;
-$code_constants: #e0e8ff !default;
-$code_color1: #eb939a !default;
-$code_color2: #91bb9e !default;
-$code_color3: #edef7d !default;
-
-@import "_theme_template.scss";
-
-.syntaxhighlighter {
- .comments { font-style: italic !important; }
- .keyword { font-weight: bold !important; }
-}
diff --git a/data/syntax_highlighter/compass/shThemeEclipse.scss b/data/syntax_highlighter/compass/shThemeEclipse.scss
deleted file mode 100644
index 193fb1d877..0000000000
--- a/data/syntax_highlighter/compass/shThemeEclipse.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-// Eclipse IDE SyntaxHighlighter color theme
-// (C) Code-House
-// :http//blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/
-
-$background: #fff !default;
-
-$line_highlighted_background: #c3defe !default;
-$line_highlighted_number: #fff !default;
-
-$gutter_text: #787878 !default;
-$gutter_border_color: #d4d0c8 !default;
-
-$toolbar_collapsed_a: #3f5fbf !default;
-$toolbar_collapsed_a_hover: #aa7700 !default;
-$toolbar_collapsed_background: #fff !default;
-
-$toolbar_a: #a0a0a0 !default;
-$toolbar_a_hover: red !default;
-
-$code_plain: black !default;
-$code_comments: #3f5fbf !default;
-$code_string: #2a00ff !default;
-$code_keyword: #7f0055 !default;
-$code_preprocessor: #646464 !default;
-$code_variable: #aa7700 !default;
-$code_value: #009900 !default;
-$code_functions: #ff1493 !default;
-$code_constants: #0066cc !default;
-$code_color1: gray !default;
-$code_color2: #ff1493 !default;
-$code_color3: red !default;
-
-@import "_theme_template.scss";
-
-.syntaxhighlighter {
- .keyword { font-weight: bold !important; }
-
- .xml {
- .keyword {
- color: #3f7f7f !important;
- font-weight: normal !important; }
- .color1, .color1 a { color: #7f007f !important; }
- .string {
- font-style: italic !important;
- color: #2a00ff !important;
- }
- }
-}
diff --git a/data/syntax_highlighter/compass/shThemeEmacs.scss b/data/syntax_highlighter/compass/shThemeEmacs.scss
deleted file mode 100644
index 11c9deb4d0..0000000000
--- a/data/syntax_highlighter/compass/shThemeEmacs.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-// Emacs SyntaxHighlighter theme based on theme by Joshua Emmons
-// http://www.skia.net/
-
-$background: black !default;
-
-$line_highlighted_background: #2A3133 !default;
-$line_highlighted_number: white !default;
-
-$gutter_text: #d3d3d3 !default;
-$gutter_border_color: #990000 !default;
-
-$toolbar_collapsed_a: #ebdb8d !default;
-$toolbar_collapsed_a_hover: #ff7d27 !default;
-$toolbar_collapsed_background: black !default;
-
-$toolbar_a: #fff !default;
-$toolbar_a_hover: #9ccff4 !default;
-
-$code_plain: #d3d3d3 !default;
-$code_comments: #ff7d27 !default;
-$code_string: #ff9e7b !default;
-$code_keyword: aqua !default;
-$code_preprocessor: #aec4de !default;
-$code_variable: #ffaa3e !default;
-$code_value: #009900 !default;
-$code_functions: #81cef9 !default;
-$code_constants: #ff9e7b !default;
-$code_color1: #ebdb8d !default;
-$code_color2: #ff7d27 !default;
-$code_color3: #aec4de !default;
-
-@import "_theme_template.scss";
diff --git a/data/syntax_highlighter/compass/shThemeFadeToGrey.scss b/data/syntax_highlighter/compass/shThemeFadeToGrey.scss
deleted file mode 100644
index 7963814952..0000000000
--- a/data/syntax_highlighter/compass/shThemeFadeToGrey.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-// Fade to Grey SyntaxHighlighter theme based on theme by Brasten Sager
-// :http//www.ibrasten.com/
-
-$background: #121212 !default;
-
-$line_highlighted_background: #2C2C29 !default;
-$line_highlighted_number: white !default;
-
-$gutter_text: #afafaf !default;
-$gutter_border_color: #3185b9 !default;
-
-$toolbar_collapsed_a: #3185b9 !default;
-$toolbar_collapsed_a_hover: #d01d33 !default;
-$toolbar_collapsed_background: black !default;
-
-$toolbar_a: #fff !default;
-$toolbar_a_hover: #96daff !default;
-
-$code_plain: white !default;
-$code_comments: #696854 !default;
-$code_string: #e3e658 !default;
-$code_keyword: #d01d33 !default;
-$code_preprocessor: #435a5f !default;
-$code_variable: #898989 !default;
-$code_value: #009900 !default;
-$code_functions: #aaaaaa !default;
-$code_constants: #96daff !default;
-$code_color1: #ffc074 !default;
-$code_color2: #4a8cdb !default;
-$code_color3: #96daff !default;
-
-@import "_theme_template.scss";
-
-.syntaxhighlighter {
- .functions { font-weight: bold !important; }
-}
diff --git a/data/syntax_highlighter/compass/shThemeMDUltra.scss b/data/syntax_highlighter/compass/shThemeMDUltra.scss
deleted file mode 100644
index 0356fa6c93..0000000000
--- a/data/syntax_highlighter/compass/shThemeMDUltra.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-// MDUltra SyntaxHighlighter theme based on Midnight Theme
-// http://www.mddev.co.uk/
-
-$background: #222222 !default;
-
-$line_highlighted_background: #253e5a !default;
-$line_highlighted_number: white !default;
-
-$gutter_text: #38566f !default;
-$gutter_border_color: #435a5f !default;
-
-$toolbar_collapsed_a: #428bdd !default;
-$toolbar_collapsed_a_hover: lime !default;
-$toolbar_collapsed_background: black !default;
-
-$toolbar_a: #aaaaff !default;
-$toolbar_a_hover: #9ccff4 !default;
-
-$code_plain: lime !default;
-$code_comments: #428bdd !default;
-$code_string: lime !default;
-$code_keyword: #aaaaff !default;
-$code_preprocessor: #8aa6c1 !default;
-$code_variable: aqua !default;
-$code_value: #f7e741 !default;
-$code_functions: #ff8000 !default;
-$code_constants: yellow !default;
-$code_color1: red !default;
-$code_color2: yellow !default;
-$code_color3: #ffaa3e !default;
-
-@import "_theme_template.scss";
diff --git a/data/syntax_highlighter/compass/shThemeMidnight.scss b/data/syntax_highlighter/compass/shThemeMidnight.scss
deleted file mode 100644
index a4dae02305..0000000000
--- a/data/syntax_highlighter/compass/shThemeMidnight.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-// Midnight SyntaxHighlighter theme based on theme by J.D. Myers
-// http://webdesign.lsnjd.com/
-
-$background: #0f192a !default;
-
-$line_highlighted_background: #253e5a !default;
-$line_highlighted_number: #38566f !default;
-
-$gutter_text: #afafaf !default;
-$gutter_border_color: #435a5f !default;
-
-$toolbar_collapsed_a: #428bdd !default;
-$toolbar_collapsed_a_hover: #1dc116 !default;
-$toolbar_collapsed_background: #000 !default;
-
-$toolbar_a: #D1EDFF !default;
-$toolbar_a_hover: #8aa6c1 !default;
-
-$code_plain: #d1edff !default;
-$code_comments: #428bdd !default;
-$code_string: #1dc116 !default;
-$code_keyword: #b43d3d !default;
-$code_preprocessor: #8aa6c1 !default;
-$code_variable: #ffaa3e !default;
-$code_value: #f7e741 !default;
-$code_functions: #ffaa3e !default;
-$code_constants: #e0e8ff !default;
-$code_color1: #f8bb00 !default;
-$code_color2: white !default;
-$code_color3: #ffaa3e !default;
-
-@import "_theme_template.scss";
diff --git a/data/syntax_highlighter/compass/shThemeRDark.scss b/data/syntax_highlighter/compass/shThemeRDark.scss
deleted file mode 100644
index 3b67b15372..0000000000
--- a/data/syntax_highlighter/compass/shThemeRDark.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-// RDark SyntaxHighlighter theme based on theme by Radu Dineiu
-// http://www.vim.org/scripts/script.php?script_id=1732
-
-$background: #1b2426 !default;
-
-$line_highlighted_background: #323E41 !default;
-$line_highlighted_number: #b9bdb6 !default;
-
-$gutter_text: #afafaf !default;
-$gutter_border_color: #435a5f !default;
-
-$toolbar_collapsed_a: #5ba1cf !default;
-$toolbar_collapsed_a_hover: #5ce638 !default;
-$toolbar_collapsed_background: #000 !default;
-
-$toolbar_a: #fff !default;
-$toolbar_a_hover: #e0e8ff !default;
-
-$code_plain: #b9bdb6 !default;
-$code_comments: #878a85 !default;
-$code_string: #5ce638 !default;
-$code_keyword: #5ba1cf !default;
-$code_preprocessor: #435a5f !default;
-$code_variable: #ffaa3e !default;
-$code_value: #009900 !default;
-$code_functions: #ffaa3e !default;
-$code_constants: #e0e8ff !default;
-$code_color1: #e0e8ff !default;
-$code_color2: white !default;
-$code_color3: #ffaa3e !default;
-
-@import "_theme_template.scss";
diff --git a/data/syntax_highlighter/index.html b/data/syntax_highlighter/index.html
deleted file mode 100644
index 60908f4ad7..0000000000
--- a/data/syntax_highlighter/index.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
- Hello SyntaxHighlighter
-
-
-
-
-
-
-
-
-
- /**
- * multiline comment
- */
-
- text
-
- // single line comment
-
- text
-
- "string" text 'string' text "string"
- "string with \" escape" text 'string with \' escape' text "string with \" escape"
-
- var code = '\
- function helloWorld()\
- {\
- // this is great!\
- for(var i = 0; i <= 1; i++)\
- alert("yay");\
- }\
- ';
-
-/**
- * Please see <http://www.alexgorbatchev.come/?test=1&y=2>
- */
-var home = "http://www.alexgorbatchev.come/?test=1&y=2;test/1/2/3;";
-// < http://www.gnu.org/licenses/?test=1&y=2 >.
-
-// Test embedded URLs that terminate at a left angle bracket.
-// See bug #28: http://bitbucket.org/alexg/syntaxhighlighter/issue/28/
-"http://www.example.com/song2.mp3";
-
-
-
\ No newline at end of file
diff --git a/data/syntax_highlighter/tests/cases/005_no_gutter.html b/data/syntax_highlighter/tests/cases/005_no_gutter.html
deleted file mode 100644
index 6e6b1be079..0000000000
--- a/data/syntax_highlighter/tests/cases/005_no_gutter.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/**
- * Returns an Image object that can then be painted on the screen.
- * The url argument must specify an absolute {@link URL}. The name
- * argument is a specifier that is relative to the url argument.
- *
- * @param url an absolute URL giving the base location of the image
- * @param name the location of the image, relative to the url argument
- * @return the image at the specified URL
- * @see Image
- */
-
- /**
- * Returns an Image object that can then be painted on the screen.
- * The url argument must specify an absolute {@link URL}. The name
- * argument is a specifier that is relative to the url argument.
- *
- * @param url an absolute URL giving the base location of the image
- * @param name the location of the image, relative to the url argument
- * @return the image at the specified URL
- * @see Image
- */
-
-
-
- /**
- * Returns an Image object that can then be painted on the screen.
- * The url argument must specify an absolute {@link URL}. The name
- * argument is a specifier that is relative to the url argument.
- *
- * @param url an absolute URL giving the base location of the image
- * @param name the location of the image, relative to the url argument
- * @return the image at the specified URL
- * @see Image
- */
-