[4.3] Adding phan static code analyser (#39002)

* Adding phan static code analyser

* Adding phan configuration files

* Codestyle

* Adding php-ast extension

* Trying different way to install php-ast

* Using our own php7.4-ast docker image

* Removing unnecessary line
This commit is contained in:
Hannes Papenberg 2022-10-21 12:19:30 +02:00 committed by GitHub
parent 4dbd41f6c2
commit b4b0f928cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 1966 additions and 3 deletions

View File

@ -53,6 +53,13 @@ steps:
- ./libraries/vendor/bin/phpcs --extensions=php -p --standard=ruleset.xml .
- echo $(date)
- name: phan
image: joomlaprojects/docker-images:php7.4-ast
depends_on: [ phpcs ]
failure: ignore
commands:
- ./libraries/vendor/bin/phan
- name: npm
image: node:16-bullseye-slim
depends_on: [ phpcs ]
@ -517,6 +524,6 @@ trigger:
---
kind: signature
hmac: 05c1f15cfad7564a9479535f7b0727b63056f9b38f66453cbefab877d7db52b9
hmac: f496f213481b3afcec73da651fc838af21f76950954daac599e665ceb382cc2d
...

357
.phan/config.php Normal file
View File

@ -0,0 +1,357 @@
<?php
/**
* This configuration file was automatically generated by 'phan --init --init-level=5'
*
* TODOs (added by 'phan --init'):
*
* - Go through this file and verify that there are no missing/unnecessary files/directories.
* (E.g. this only includes direct composer dependencies - You may have to manually add indirect composer dependencies to 'directory_list')
* - Look at 'plugins' and add or remove plugins if appropriate (see https://github.com/phan/phan/tree/v4/.phan/plugins#plugins)
* - Add global suppressions for pre-existing issues to suppress_issue_types (https://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base)
* - Consider setting up a baseline if there are a large number of pre-existing issues (see `phan --extended-help`)
*
* This configuration will be read and overlaid on top of the
* default configuration. Command line arguments will be applied
* after this file is read.
*
* @see https://github.com/phan/phan/wiki/Phan-Config-Settings for all configurable options
* @see https://github.com/phan/phan/tree/v4/src/Phan/Config.php
*
* A Note About Paths
* ==================
*
* Files referenced from this file should be defined as
*
* ```
* Config::projectPath('relative_path/to/file')
* ```
*
* where the relative path is relative to the root of the
* project which is defined as either the working directory
* of the phan executable or a path passed in via the CLI
* '-d' flag.
*/
use Phan\Issue;
return [
// The PHP version that the codebase will be checked for compatibility against.
// For best results, the PHP binary used to run Phan should have the same PHP version.
// (Phan relies on Reflection for some types, param counts,
// and checks for undefined classes/methods/functions)
//
// Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`, `'7.4'`, `null`.
// If this is set to `null`,
// then Phan assumes the PHP version which is closest to the minor version
// of the php executable used to execute Phan.
//
// Note that the **only** effect of choosing `'5.6'` is to infer that functions removed in php 7.0 exist.
// (See `backward_compatibility_checks` for additional options)
// Automatically inferred from composer.json requirement for "php" of "^7.2.5"
'target_php_version' => '7.2',
// If enabled, missing properties will be created when
// they are first seen. If false, we'll report an
// error message if there is an attempt to write
// to a class property that wasn't explicitly
// defined.
'allow_missing_properties' => true,
// If enabled, null can be cast to any type and any
// type can be cast to null. Setting this to true
// will cut down on false positives.
'null_casts_as_any_type' => true,
// If enabled, allow null to be cast as any array-like type.
//
// This is an incremental step in migrating away from `null_casts_as_any_type`.
// If `null_casts_as_any_type` is true, this has no effect.
'null_casts_as_array' => true,
// If enabled, allow any array-like type to be cast to null.
// This is an incremental step in migrating away from `null_casts_as_any_type`.
// If `null_casts_as_any_type` is true, this has no effect.
'array_casts_as_null' => true,
// If enabled, scalars (int, float, bool, string, null)
// are treated as if they can cast to each other.
// This does not affect checks of array keys. See `scalar_array_key_cast`.
'scalar_implicit_cast' => true,
// If enabled, any scalar array keys (int, string)
// are treated as if they can cast to each other.
// E.g. `array<int,stdClass>` can cast to `array<string,stdClass>` and vice versa.
// Normally, a scalar type such as int could only cast to/from int and mixed.
'scalar_array_key_cast' => true,
// If this has entries, scalars (int, float, bool, string, null)
// are allowed to perform the casts listed.
//
// E.g. `['int' => ['float', 'string'], 'float' => ['int'], 'string' => ['int'], 'null' => ['string']]`
// allows casting null to a string, but not vice versa.
// (subset of `scalar_implicit_cast`)
'scalar_implicit_partial' => [],
// If enabled, Phan will warn if **any** type in a method invocation's object
// is definitely not an object,
// or if **any** type in an invoked expression is not a callable.
// Setting this to true will introduce numerous false positives
// (and reveal some bugs).
'strict_method_checking' => false,
// If enabled, Phan will warn if **any** type of the object expression for a property access
// does not contain that property.
'strict_object_checking' => false,
// If enabled, Phan will warn if **any** type in the argument's union type
// cannot be cast to a type in the parameter's expected union type.
// Setting this to true will introduce numerous false positives
// (and reveal some bugs).
'strict_param_checking' => false,
// If enabled, Phan will warn if **any** type in a property assignment's union type
// cannot be cast to a type in the property's declared union type.
// Setting this to true will introduce numerous false positives
// (and reveal some bugs).
'strict_property_checking' => false,
// If enabled, Phan will warn if **any** type in a returned value's union type
// cannot be cast to the declared return type.
// Setting this to true will introduce numerous false positives
// (and reveal some bugs).
'strict_return_checking' => false,
// If true, seemingly undeclared variables in the global
// scope will be ignored.
//
// This is useful for projects with complicated cross-file
// globals that you have no hope of fixing.
'ignore_undeclared_variables_in_global_scope' => true,
// Set this to false to emit `PhanUndeclaredFunction` issues for internal functions that Phan has signatures for,
// but aren't available in the codebase, or from Reflection.
// (may lead to false positives if an extension isn't loaded)
//
// If this is true(default), then Phan will not warn.
//
// Even when this is false, Phan will still infer return values and check parameters of internal functions
// if Phan has the signatures.
'ignore_undeclared_functions_with_known_signatures' => true,
// Backwards Compatibility Checking. This is slow
// and expensive, but you should consider running
// it before upgrading your version of PHP to a
// new version that has backward compatibility
// breaks.
//
// If you are migrating from PHP 5 to PHP 7,
// you should also look into using
// [php7cc (no longer maintained)](https://github.com/sstalle/php7cc)
// and [php7mar](https://github.com/Alexia/php7mar),
// which have different backwards compatibility checks.
//
// If you are still using versions of php older than 5.6,
// `PHP53CompatibilityPlugin` may be worth looking into if you are not running
// syntax checks for php 5.3 through another method such as
// `InvokePHPNativeSyntaxCheckPlugin` (see .phan/plugins/README.md).
'backward_compatibility_checks' => false,
// If true, check to make sure the return type declared
// in the doc-block (if any) matches the return type
// declared in the method signature.
'check_docblock_signature_return_type_match' => true,
// This setting maps case-insensitive strings to union types.
//
// This is useful if a project uses phpdoc that differs from the phpdoc2 standard.
//
// If the corresponding value is the empty string,
// then Phan will ignore that union type (E.g. can ignore 'the' in `@return the value`)
//
// If the corresponding value is not empty,
// then Phan will act as though it saw the corresponding UnionTypes(s)
// when the keys show up in a UnionType of `@param`, `@return`, `@var`, `@property`, etc.
//
// This matches the **entire string**, not parts of the string.
// (E.g. `@return the|null` will still look for a class with the name `the`, but `@return the` will be ignored with the below setting)
//
// (These are not aliases, this setting is ignored outside of doc comments).
// (Phan does not check if classes with these names exist)
//
// Example setting: `['unknown' => '', 'number' => 'int|float', 'char' => 'string', 'long' => 'int', 'the' => '']`
'phpdoc_type_mapping' => [],
// Set to true in order to attempt to detect dead
// (unreferenced) code. Keep in mind that the
// results will only be a guess given that classes,
// properties, constants and methods can be referenced
// as variables (like `$class->$property` or
// `$class->$method()`) in ways that we're unable
// to make sense of.
//
// To more aggressively detect dead code,
// you may want to set `dead_code_detection_prefer_false_negative` to `false`.
'dead_code_detection' => false,
// Set to true in order to attempt to detect unused variables.
// `dead_code_detection` will also enable unused variable detection.
//
// This has a few known false positives, e.g. for loops or branches.
'unused_variable_detection' => false,
// Set to true in order to attempt to detect redundant and impossible conditions.
//
// This has some false positives involving loops,
// variables set in branches of loops, and global variables.
'redundant_condition_detection' => false,
// If enabled, Phan will act as though it's certain of real return types of a subset of internal functions,
// even if those return types aren't available in reflection (real types were taken from php 7.3 or 8.0-dev, depending on target_php_version).
//
// Note that with php 7 and earlier, php would return null or false for many internal functions if the argument types or counts were incorrect.
// As a result, enabling this setting with target_php_version 8.0 may result in false positives for `--redundant-condition-detection` when codebases also support php 7.x.
'assume_real_types_for_internal_functions' => false,
// If true, this runs a quick version of checks that takes less
// time at the cost of not running as thorough
// of an analysis. You should consider setting this
// to true only when you wish you had more **undiagnosed** issues
// to fix in your code base.
//
// In quick-mode the scanner doesn't rescan a function
// or a method's code block every time a call is seen.
// This means that the problem here won't be detected:
//
// ```php
// <?php
// function test($arg):int {
// return $arg;
// }
// test("abc");
// ```
//
// This would normally generate:
//
// ```
// test.php:3 PhanTypeMismatchReturn Returning type string but test() is declared to return int
// ```
//
// The initial scan of the function's code block has no
// type information for `$arg`. It isn't until we see
// the call and rescan `test()`'s code block that we can
// detect that it is actually returning the passed in
// `string` instead of an `int` as declared.
'quick_mode' => false,
// Override to hardcode existence and types of (non-builtin) globals in the global scope.
// Class names should be prefixed with `\`.
//
// (E.g. `['_FOO' => '\FooClass', 'page' => '\PageClass', 'userId' => 'int']`)
'globals_type_map' => [],
// The minimum severity level to report on. This can be
// set to `Issue::SEVERITY_LOW`, `Issue::SEVERITY_NORMAL` or
// `Issue::SEVERITY_CRITICAL`. Setting it to only
// critical issues is a good place to start on a big
// sloppy mature code base.
'minimum_severity' => Issue::SEVERITY_NORMAL,
// Add any issue types (such as `'PhanUndeclaredMethod'`)
// to this list to inhibit them from being reported.
'suppress_issue_types' => ['PhanDeprecatedClass', 'PhanUndeclaredConstant','PhanDeprecatedFunction'],
// A regular expression to match files to be excluded
// from parsing and analysis and will not be read at all.
//
// This is useful for excluding groups of test or example
// directories/files, unanalyzable files, or files that
// can't be removed for whatever reason.
// (e.g. `'@Test\.php$@'`, or `'@vendor/.*/(tests|Tests)/@'`)
'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@',
// A list of files that will be excluded from parsing and analysis
// and will not be read at all.
//
// This is useful for excluding hopelessly unanalyzable
// files that can't be removed for whatever reason.
'exclude_file_list' => [
'administrator\components\com_joomlaupdate\finalisation.php'
],
// A directory list that defines files that will be excluded
// from static analysis, but whose class and method
// information should be included.
//
// Generally, you'll want to include the directories for
// third-party code (such as "vendor/") in this list.
//
// n.b.: If you'd like to parse but not analyze 3rd
// party code, directories containing that code
// should be added to the `directory_list` as well as
// to `exclude_analysis_directory_list`.
'exclude_analysis_directory_list' => [
'libraries/vendor/',
'libraries/php-encryption',
'libraries/phpass'
],
// Enable this to enable checks of require/include statements referring to valid paths.
// The settings `include_paths` and `warn_about_relative_include_statement` affect the checks.
'enable_include_path_checks' => false,
// The number of processes to fork off during the analysis
// phase.
'processes' => 1,
// List of case-insensitive file extensions supported by Phan.
// (e.g. `['php', 'html', 'htm']`)
'analyzed_file_extensions' => [
'php',
],
// You can put paths to stubs of internal extensions in this config option.
// If the corresponding extension is **not** loaded, then Phan will use the stubs instead.
// Phan will continue using its detailed type annotations,
// but load the constants, classes, functions, and classes (and their Reflection types)
// from these stub files (doubling as valid php files).
// Use a different extension from php to avoid accidentally loading these.
// The `tools/make_stubs` script can be used to generate your own stubs (compatible with php 7.0+ right now)
//
// (e.g. `['xdebug' => '.phan/internal_stubs/xdebug.phan_php']`)
'autoload_internal_extension_signatures' => [
'redis' => '.phan/redis.phan_php',
'memcached' => '.phan/memcached.phan_php',
'dom' => '.phan/dom.phan_php',
],
// A list of plugin files to execute.
//
// Plugins which are bundled with Phan can be added here by providing their name (e.g. `'AlwaysReturnPlugin'`)
//
// Documentation about available bundled plugins can be found [here](https://github.com/phan/phan/tree/v4/.phan/plugins).
//
// Alternately, you can pass in the full path to a PHP file with the plugin's implementation (e.g. `'vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php'`)
'plugins' => [],
// A list of directories that should be parsed for class and
// method information. After excluding the directories
// defined in `exclude_analysis_directory_list`, the remaining
// files will be statically analyzed for errors.
//
// Thus, both first-party and third-party code being used by
// your application should be included in this list.
'directory_list' => [
'libraries',
'libraries/vendor/joomla',
'administrator',
'components',
'plugins'
],
// A list of individual files to include in analysis
// with a path relative to the root directory of the
// project.
'file_list' => [],
];

418
.phan/dom.phan_php Normal file
View File

@ -0,0 +1,418 @@
<?php
// These stubs were generated by the phan stub generator.
// @phan-stub-for-extension dom@20031129
namespace {
class DOMAttr extends \DOMNode {
// properties
public $name;
public $ownerElement;
public $schemaTypeInfo;
public $specified;
public $value;
// methods
public function isId() {}
public function __construct($name, $value = NULL) {}
}
class DOMCdataSection extends \DOMText {
// methods
public function __construct($value) {}
}
class DOMCharacterData extends \DOMNode {
// properties
public $data;
public $length;
// methods
public function substringData($offset, $count) {}
public function appendData($arg) {}
public function insertData($offset, $arg) {}
public function deleteData($offset, $count) {}
public function replaceData($offset, $count, $arg) {}
}
class DOMComment extends \DOMCharacterData {
// methods
public function __construct($value = NULL) {}
}
class DOMConfiguration {
// methods
public function setParameter($name, $value) {}
public function getParameter($name = NULL) {}
public function canSetParameter($name = NULL, $value = NULL) {}
}
class DOMDocument extends \DOMNode {
// properties
public $actualEncoding;
public $config;
public $doctype;
public $documentElement;
public $documentURI;
public $encoding;
public $formatOutput;
public $implementation;
public $preserveWhiteSpace;
public $recover;
public $resolveExternals;
public $standalone;
public $strictErrorChecking;
public $substituteEntities;
public $validateOnParse;
public $version;
public $xmlEncoding;
public $xmlStandalone;
public $xmlVersion;
// methods
public function createElement($tagName, $value = NULL) {}
public function createDocumentFragment() {}
public function createTextNode($data) {}
public function createComment($data) {}
public function createCDATASection($data) {}
public function createProcessingInstruction($target, $data) {}
public function createAttribute($name) {}
public function createEntityReference($name) {}
public function getElementsByTagName($tagName) {}
public function importNode(\DOMNode $importedNode, $deep) {}
public function createElementNS($namespaceURI, $qualifiedName, $value = NULL) {}
public function createAttributeNS($namespaceURI, $qualifiedName) {}
public function getElementsByTagNameNS($namespaceURI, $localName) {}
public function getElementById($elementId) {}
public function adoptNode(\DOMNode $source) {}
public function normalizeDocument() {}
public function renameNode(\DOMNode $node, $namespaceURI, $qualifiedName) {}
public function load($source, $options = NULL) {}
public function save($file) {}
public function loadXML($source, $options = NULL) {}
public function saveXML(\DOMNode $node = NULL, $options = NULL) {}
public function __construct($version = NULL, $encoding = NULL) {}
public function validate() {}
public function xinclude($options = NULL) {}
public function loadHTML($source, $options = NULL) {}
public function loadHTMLFile($source, $options = NULL) {}
public function saveHTML() {}
public function saveHTMLFile($file) {}
public function schemaValidate($filename) {}
public function schemaValidateSource($source) {}
public function relaxNGValidate($filename) {}
public function relaxNGValidateSource($source) {}
public function registerNodeClass($baseClass, $extendedClass) {}
}
class DOMDocumentFragment extends \DOMNode {
// properties
public $name;
// methods
public function __construct() {}
public function appendXML($data) {}
}
class DOMDocumentType extends \DOMNode {
// properties
public $publicId;
public $systemId;
public $name;
public $entities;
public $notations;
public $internalSubset;
}
class DOMDomError {
}
class DOMElement extends \DOMNode {
// properties
public $schemaTypeInfo;
public $tagName;
// methods
public function getAttribute($name) {}
public function setAttribute($name, $value) {}
public function removeAttribute($name) {}
public function getAttributeNode($name) {}
public function setAttributeNode(\DOMAttr $newAttr) {}
public function removeAttributeNode(\DOMAttr $oldAttr) {}
public function getElementsByTagName($name) {}
public function getAttributeNS($namespaceURI, $localName) {}
public function setAttributeNS($namespaceURI, $qualifiedName, $value) {}
public function removeAttributeNS($namespaceURI, $localName) {}
public function getAttributeNodeNS($namespaceURI, $localName) {}
public function setAttributeNodeNS(\DOMAttr $newAttr) {}
public function getElementsByTagNameNS($namespaceURI, $localName) {}
public function hasAttribute($name) {}
public function hasAttributeNS($namespaceURI, $localName) {}
public function setIdAttribute($name, $isId) {}
public function setIdAttributeNS($namespaceURI, $localName, $isId) {}
public function setIdAttributeNode(\DOMAttr $attr, $isId) {}
public function __construct($name, $value = NULL, $uri = NULL) {}
}
class DOMEntity extends \DOMNode {
// properties
public $publicId;
public $systemId;
public $notationName;
public $actualEncoding;
public $encoding;
public $version;
}
class DOMEntityReference extends \DOMNode {
// properties
public $name;
// methods
public function __construct($name) {}
}
class DOMErrorHandler {
// methods
public function handleError(\DOMDomError $error) {}
}
final class DOMException extends \Exception {
// properties
public $code;
public $message;
public $file;
public $line;
}
class DOMImplementation {
// properties
public $name;
// methods
public function getFeature($feature, $version) {}
public function hasFeature() {}
public function createDocumentType($qualifiedName, $publicId, $systemId) {}
public function createDocument($namespaceURI, $qualifiedName, \DOMDocumentType $docType) {}
}
class DOMImplementationList {
// methods
public function item($index) {}
}
class DOMImplementationSource {
// methods
public function getDomimplementation($features) {}
public function getDomimplementations($features) {}
}
class DOMLocator {
}
class DOMNameList {
// methods
public function getName($index) {}
public function getNamespaceURI($index) {}
}
class DOMNameSpaceNode {
}
class DOMNamedNodeMap implements \Traversable {
// properties
public $length;
// methods
public function getNamedItem($name) {}
public function setNamedItem(\DOMNode $arg) {}
public function removeNamedItem($name = NULL) {}
public function item($index = NULL) {}
public function getNamedItemNS($namespaceURI = NULL, $localName = NULL) {}
public function setNamedItemNS(\DOMNode $arg = NULL) {}
public function removeNamedItemNS($namespaceURI = NULL, $localName = NULL) {}
}
class DOMNode {
// properties
public $nodeName;
public $nodeValue;
public $nodeType;
public $parentNode;
public $childNodes;
public $firstChild;
public $lastChild;
public $previousSibling;
public $nextSibling;
public $attributes;
public $ownerDocument;
public $namespaceURI;
public $prefix;
public $localName;
public $baseURI;
public $textContent;
// methods
public function insertBefore(\DOMNode $newChild, \DOMNode $refChild = NULL) {}
public function replaceChild(\DOMNode $newChild, \DOMNode $oldChild) {}
public function removeChild(\DOMNode $oldChild) {}
public function appendChild(\DOMNode $newChild) {}
public function hasChildNodes() {}
public function cloneNode($deep = NULL) {}
public function normalize() {}
public function isSupported($feature, $version) {}
public function hasAttributes() {}
public function compareDocumentPosition(\DOMNode $other) {}
public function isSameNode(\DOMNode $other) {}
public function lookupPrefix($namespaceURI) {}
public function isDefaultNamespace($namespaceURI) {}
public function lookupNamespaceUri($prefix) {}
public function isEqualNode(\DOMNode $arg) {}
public function getFeature($feature, $version) {}
public function setUserData($key, $data, $handler) {}
public function getUserData($key) {}
public function getNodePath() {}
public function getLineNo() {}
public function C14N($exclusive = NULL, $with_comments = NULL, array $xpath = NULL, array $ns_prefixes = NULL) {}
public function C14NFile($uri, $exclusive = NULL, $with_comments = NULL, array $xpath = NULL, array $ns_prefixes = NULL) {}
}
class DOMNodeList implements \Traversable {
// properties
public $length;
// methods
public function item($index) {}
}
class DOMNotation extends \DOMNode {
// properties
public $publicId;
public $systemId;
}
class DOMProcessingInstruction extends \DOMNode {
// properties
public $target;
public $data;
// methods
public function __construct($name, $value = NULL) {}
}
class DOMStringExtend {
// methods
public function findOffset16($offset32) {}
public function findOffset32($offset16) {}
}
class DOMStringList {
// methods
public function item($index) {}
}
class DOMText extends \DOMCharacterData {
// properties
public $wholeText;
// methods
public function splitText($offset) {}
public function isWhitespaceInElementContent() {}
public function isElementContentWhitespace() {}
public function replaceWholeText($content) {}
public function __construct($value = NULL) {}
}
class DOMTypeinfo {
}
class DOMUserDataHandler {
// methods
public function handle() {}
}
class DOMXPath {
// properties
public $document;
// methods
public function __construct(\DOMDocument $doc) {}
public function registerNamespace($prefix, $uri) {}
public function query($expr, \DOMNode $context = NULL, $registerNodeNS = NULL) {}
public function evaluate($expr, \DOMNode $context = NULL, $registerNodeNS = NULL) {}
public function registerPhpFunctions() {}
}
function dom_import_simplexml($node) {}
const DOMSTRING_SIZE_ERR = 2;
const DOM_HIERARCHY_REQUEST_ERR = 3;
const DOM_INDEX_SIZE_ERR = 1;
const DOM_INUSE_ATTRIBUTE_ERR = 10;
const DOM_INVALID_ACCESS_ERR = 15;
const DOM_INVALID_CHARACTER_ERR = 5;
const DOM_INVALID_MODIFICATION_ERR = 13;
const DOM_INVALID_STATE_ERR = 11;
const DOM_NAMESPACE_ERR = 14;
const DOM_NOT_FOUND_ERR = 8;
const DOM_NOT_SUPPORTED_ERR = 9;
const DOM_NO_DATA_ALLOWED_ERR = 6;
const DOM_NO_MODIFICATION_ALLOWED_ERR = 7;
const DOM_PHP_ERR = 0;
const DOM_SYNTAX_ERR = 12;
const DOM_VALIDATION_ERR = 16;
const DOM_WRONG_DOCUMENT_ERR = 4;
const XML_ATTRIBUTE_CDATA = 1;
const XML_ATTRIBUTE_DECL_NODE = 16;
const XML_ATTRIBUTE_ENTITY = 6;
const XML_ATTRIBUTE_ENUMERATION = 9;
const XML_ATTRIBUTE_ID = 2;
const XML_ATTRIBUTE_IDREF = 3;
const XML_ATTRIBUTE_IDREFS = 4;
const XML_ATTRIBUTE_NMTOKEN = 7;
const XML_ATTRIBUTE_NMTOKENS = 8;
const XML_ATTRIBUTE_NODE = 2;
const XML_ATTRIBUTE_NOTATION = 10;
const XML_CDATA_SECTION_NODE = 4;
const XML_COMMENT_NODE = 8;
const XML_DOCUMENT_FRAG_NODE = 11;
const XML_DOCUMENT_NODE = 9;
const XML_DOCUMENT_TYPE_NODE = 10;
const XML_DTD_NODE = 14;
const XML_ELEMENT_DECL_NODE = 15;
const XML_ELEMENT_NODE = 1;
const XML_ENTITY_DECL_NODE = 17;
const XML_ENTITY_NODE = 6;
const XML_ENTITY_REF_NODE = 5;
const XML_HTML_DOCUMENT_NODE = 13;
const XML_LOCAL_NAMESPACE = 18;
const XML_NAMESPACE_DECL_NODE = 18;
const XML_NOTATION_NODE = 12;
const XML_PI_NODE = 7;
const XML_TEXT_NODE = 3;
}

180
.phan/memcached.phan_php Normal file
View File

@ -0,0 +1,180 @@
<?php
// These stubs were generated by the phan stub generator.
// @phan-stub-for-extension memcached@3.0.3
namespace {
class Memcached {
// constants
public const LIBMEMCACHED_VERSION_HEX = 16777240;
public const OPT_COMPRESSION = -1001;
public const OPT_COMPRESSION_TYPE = -1004;
public const OPT_PREFIX_KEY = -1002;
public const OPT_SERIALIZER = -1003;
public const OPT_USER_FLAGS = -1006;
public const OPT_STORE_RETRY_COUNT = -1005;
public const HAVE_IGBINARY = false;
public const HAVE_JSON = false;
public const HAVE_MSGPACK = false;
public const HAVE_SESSION = true;
public const HAVE_SASL = true;
public const OPT_HASH = 2;
public const HASH_DEFAULT = 0;
public const HASH_MD5 = 1;
public const HASH_CRC = 2;
public const HASH_FNV1_64 = 3;
public const HASH_FNV1A_64 = 4;
public const HASH_FNV1_32 = 5;
public const HASH_FNV1A_32 = 6;
public const HASH_HSIEH = 7;
public const HASH_MURMUR = 8;
public const OPT_DISTRIBUTION = 9;
public const DISTRIBUTION_MODULA = 0;
public const DISTRIBUTION_CONSISTENT = 1;
public const DISTRIBUTION_VIRTUAL_BUCKET = 6;
public const OPT_LIBKETAMA_COMPATIBLE = 16;
public const OPT_LIBKETAMA_HASH = 17;
public const OPT_TCP_KEEPALIVE = 32;
public const OPT_BUFFER_WRITES = 10;
public const OPT_BINARY_PROTOCOL = 18;
public const OPT_NO_BLOCK = 0;
public const OPT_TCP_NODELAY = 1;
public const OPT_SOCKET_SEND_SIZE = 4;
public const OPT_SOCKET_RECV_SIZE = 5;
public const OPT_CONNECT_TIMEOUT = 14;
public const OPT_RETRY_TIMEOUT = 15;
public const OPT_DEAD_TIMEOUT = 36;
public const OPT_SEND_TIMEOUT = 19;
public const OPT_RECV_TIMEOUT = 20;
public const OPT_POLL_TIMEOUT = 8;
public const OPT_CACHE_LOOKUPS = 6;
public const OPT_SERVER_FAILURE_LIMIT = 21;
public const OPT_AUTO_EJECT_HOSTS = 28;
public const OPT_HASH_WITH_PREFIX_KEY = 25;
public const OPT_NOREPLY = 26;
public const OPT_SORT_HOSTS = 12;
public const OPT_VERIFY_KEY = 13;
public const OPT_USE_UDP = 27;
public const OPT_NUMBER_OF_REPLICAS = 29;
public const OPT_RANDOMIZE_REPLICA_READ = 30;
public const OPT_REMOVE_FAILED_SERVERS = 35;
public const OPT_SERVER_TIMEOUT_LIMIT = 37;
public const RES_SUCCESS = 0;
public const RES_FAILURE = 1;
public const RES_HOST_LOOKUP_FAILURE = 2;
public const RES_UNKNOWN_READ_FAILURE = 7;
public const RES_PROTOCOL_ERROR = 8;
public const RES_CLIENT_ERROR = 9;
public const RES_SERVER_ERROR = 10;
public const RES_WRITE_FAILURE = 5;
public const RES_DATA_EXISTS = 12;
public const RES_NOTSTORED = 14;
public const RES_NOTFOUND = 16;
public const RES_PARTIAL_READ = 18;
public const RES_SOME_ERRORS = 19;
public const RES_NO_SERVERS = 20;
public const RES_END = 21;
public const RES_ERRNO = 26;
public const RES_BUFFERED = 32;
public const RES_TIMEOUT = 31;
public const RES_BAD_KEY_PROVIDED = 33;
public const RES_STORED = 15;
public const RES_DELETED = 22;
public const RES_STAT = 24;
public const RES_ITEM = 25;
public const RES_NOT_SUPPORTED = 28;
public const RES_FETCH_NOTFINISHED = 30;
public const RES_SERVER_MARKED_DEAD = 35;
public const RES_UNKNOWN_STAT_KEY = 36;
public const RES_INVALID_HOST_PROTOCOL = 34;
public const RES_MEMORY_ALLOCATION_FAILURE = 17;
public const RES_CONNECTION_SOCKET_CREATE_FAILURE = 11;
public const RES_E2BIG = 37;
public const RES_KEY_TOO_BIG = 39;
public const RES_SERVER_TEMPORARILY_DISABLED = 47;
public const RES_SERVER_MEMORY_ALLOCATION_FAILURE = 48;
public const RES_AUTH_PROBLEM = 40;
public const RES_AUTH_FAILURE = 41;
public const RES_AUTH_CONTINUE = 42;
public const RES_PAYLOAD_FAILURE = -1001;
public const SERIALIZER_PHP = 1;
public const SERIALIZER_IGBINARY = 2;
public const SERIALIZER_JSON = 3;
public const SERIALIZER_JSON_ARRAY = 4;
public const SERIALIZER_MSGPACK = 5;
public const COMPRESSION_FASTLZ = 2;
public const COMPRESSION_ZLIB = 1;
public const GET_PRESERVE_ORDER = 1;
public const GET_EXTENDED = 2;
public const GET_ERROR_RETURN_VALUE = false;
// methods
public function __construct($persistent_id = NULL, $callback = NULL) {}
public function getResultCode() {}
public function getResultMessage() {}
public function get($key, $cache_cb = NULL, $get_flags = NULL) {}
public function getByKey($server_key, $key, $cache_cb = NULL, $get_flags = NULL) {}
public function getMulti(array $keys, $get_flags = NULL) {}
public function getMultiByKey($server_key, array $keys, $get_flags = NULL) {}
public function getDelayed(array $keys, $with_cas = NULL, $value_cb = NULL) {}
public function getDelayedByKey($server_key, array $keys, $with_cas = NULL, $value_cb = NULL) {}
public function fetch() {}
public function fetchAll() {}
public function set($key, $value, $expiration = NULL) {}
public function setByKey($server_key, $key, $value, $expiration = NULL) {}
public function touch($key, $expiration) {}
public function touchByKey($server_key, $key, $expiration) {}
public function setMulti(array $items, $expiration = NULL) {}
public function setMultiByKey($server_key, array $items, $expiration = NULL) {}
public function cas($cas_token, $key, $value, $expiration = NULL) {}
public function casByKey($cas_token, $server_key, $key, $value, $expiration = NULL) {}
public function add($key, $value, $expiration = NULL) {}
public function addByKey($server_key, $key, $value, $expiration = NULL) {}
public function append($key, $value, $expiration = NULL) {}
public function appendByKey($server_key, $key, $value, $expiration = NULL) {}
public function prepend($key, $value, $expiration = NULL) {}
public function prependByKey($server_key, $key, $value, $expiration = NULL) {}
public function replace($key, $value, $expiration = NULL) {}
public function replaceByKey($server_key, $key, $value, $expiration = NULL) {}
public function delete($key, $time = NULL) {}
public function deleteMulti($keys, $time = NULL) {}
public function deleteByKey($server_key, $key, $time = NULL) {}
public function deleteMultiByKey($server_key, $keys, $time = NULL) {}
public function increment($key, $offset = NULL, $initial_value = NULL, $expiry = NULL) {}
public function decrement($key, $offset = NULL, $initial_value = NULL, $expiry = NULL) {}
public function incrementByKey($server_key, $key, $offset = NULL, $initial_value = NULL, $expiry = NULL) {}
public function decrementByKey($server_key, $key, $offset = NULL, $initial_value = NULL, $expiry = NULL) {}
public function addServer($host, $port, $weight = NULL) {}
public function addServers(array $servers) {}
public function getServerList() {}
public function getServerByKey($server_key) {}
public function resetServerList() {}
public function quit() {}
public function flushBuffers() {}
public function getLastErrorMessage() {}
public function getLastErrorCode() {}
public function getLastErrorErrno() {}
public function getLastDisconnectedServer() {}
public function getStats($args) {}
public function getVersion() {}
public function getAllKeys() {}
public function flush($delay = NULL) {}
public function getOption($option) {}
public function setOption($option, $value) {}
public function setOptions($options) {}
public function setBucket($host_map, $forward_map, $replicas) {}
public function setSaslAuthData($username, $password) {}
public function isPersistent() {}
public function isPristine() {}
}
class MemcachedException extends \RuntimeException {
// properties
public $message;
public $code;
public $file;
public $line;
}
}

490
.phan/redis.phan_php Normal file
View File

@ -0,0 +1,490 @@
<?php
// These stubs were generated by the phan stub generator.
// @phan-stub-for-extension redis@3.1.4
namespace {
class Redis {
// constants
public const REDIS_NOT_FOUND = 0;
public const REDIS_STRING = 1;
public const REDIS_SET = 2;
public const REDIS_LIST = 3;
public const REDIS_ZSET = 4;
public const REDIS_HASH = 5;
public const PIPELINE = 2;
public const ATOMIC = 0;
public const MULTI = 1;
public const OPT_SERIALIZER = 1;
public const OPT_PREFIX = 2;
public const OPT_READ_TIMEOUT = 3;
public const SERIALIZER_NONE = 0;
public const SERIALIZER_PHP = 1;
public const OPT_SCAN = 4;
public const SCAN_RETRY = 1;
public const SCAN_NORETRY = 0;
public const AFTER = 'after';
public const BEFORE = 'before';
// methods
public function __construct() {}
public function __destruct() {}
public function connect() {}
public function pconnect() {}
public function close() {}
public function ping() {}
public function echo() {}
public function get() {}
public function set() {}
public function setex() {}
public function psetex() {}
public function setnx() {}
public function getSet() {}
public function randomKey() {}
public function renameKey() {}
public function renameNx() {}
public function getMultiple() {}
public function exists() {}
public function delete() {}
public function incr() {}
public function incrBy() {}
public function incrByFloat() {}
public function decr() {}
public function decrBy() {}
public function type() {}
public function append() {}
public function getRange() {}
public function setRange() {}
public function getBit() {}
public function setBit() {}
public function strlen() {}
public function getKeys() {}
public function sort() {}
public function sortAsc() {}
public function sortAscAlpha() {}
public function sortDesc() {}
public function sortDescAlpha() {}
public function lPush() {}
public function rPush() {}
public function lPushx() {}
public function rPushx() {}
public function lPop() {}
public function rPop() {}
public function blPop() {}
public function brPop() {}
public function lSize() {}
public function lRemove() {}
public function listTrim() {}
public function lGet() {}
public function lGetRange() {}
public function lSet() {}
public function lInsert() {}
public function sAdd() {}
public function sAddArray() {}
public function sSize() {}
public function sRemove() {}
public function sMove() {}
public function sPop() {}
public function sRandMember() {}
public function sContains() {}
public function sMembers() {}
public function sInter() {}
public function sInterStore() {}
public function sUnion() {}
public function sUnionStore() {}
public function sDiff() {}
public function sDiffStore() {}
public function setTimeout() {}
public function save() {}
public function bgSave() {}
public function lastSave() {}
public function flushDB() {}
public function flushAll() {}
public function dbSize() {}
public function auth() {}
public function ttl() {}
public function pttl() {}
public function persist() {}
public function info() {}
public function select() {}
public function move() {}
public function bgrewriteaof() {}
public function slaveof() {}
public function object() {}
public function bitop() {}
public function bitcount() {}
public function bitpos() {}
public function mset() {}
public function msetnx() {}
public function rpoplpush() {}
public function brpoplpush() {}
public function zAdd() {}
public function zDelete() {}
public function zRange() {}
public function zRevRange() {}
public function zRangeByScore() {}
public function zRevRangeByScore() {}
public function zRangeByLex() {}
public function zRevRangeByLex() {}
public function zLexCount() {}
public function zRemRangeByLex() {}
public function zCount() {}
public function zDeleteRangeByScore() {}
public function zDeleteRangeByRank() {}
public function zCard() {}
public function zScore() {}
public function zRank() {}
public function zRevRank() {}
public function zInter() {}
public function zUnion() {}
public function zIncrBy() {}
public function expireAt() {}
public function pexpire() {}
public function pexpireAt() {}
public function hGet() {}
public function hSet() {}
public function hSetNx() {}
public function hDel() {}
public function hLen() {}
public function hKeys() {}
public function hVals() {}
public function hGetAll() {}
public function hExists() {}
public function hIncrBy() {}
public function hIncrByFloat() {}
public function hMset() {}
public function hMget() {}
public function hStrLen() {}
public function multi() {}
public function discard() {}
public function exec() {}
public function pipeline() {}
public function watch() {}
public function unwatch() {}
public function publish() {}
public function subscribe() {}
public function psubscribe() {}
public function unsubscribe() {}
public function punsubscribe() {}
public function time() {}
public function role() {}
public function eval() {}
public function evalsha() {}
public function script() {}
public function debug() {}
public function dump() {}
public function restore() {}
public function migrate() {}
public function getLastError() {}
public function clearLastError() {}
public function _prefix() {}
public function _serialize() {}
public function _unserialize() {}
public function client() {}
public function command() {}
public function scan(&$i_iterator, $str_pattern = NULL, $i_count = NULL) {}
public function hscan($str_key, &$i_iterator, $str_pattern = NULL, $i_count = NULL) {}
public function zscan($str_key, &$i_iterator, $str_pattern = NULL, $i_count = NULL) {}
public function sscan($str_key, &$i_iterator, $str_pattern = NULL, $i_count = NULL) {}
public function pfadd() {}
public function pfcount() {}
public function pfmerge() {}
public function getOption() {}
public function setOption() {}
public function config() {}
public function slowlog() {}
public function rawcommand() {}
public function geoadd() {}
public function geohash() {}
public function geopos() {}
public function geodist() {}
public function georadius() {}
public function georadiusbymember() {}
public function getHost() {}
public function getPort() {}
public function getDBNum() {}
public function getTimeout() {}
public function getReadTimeout() {}
public function getPersistentID() {}
public function getAuth() {}
public function isConnected() {}
public function getMode() {}
public function wait() {}
public function pubsub() {}
public function open() {}
public function popen() {}
public function lLen() {}
public function sGetMembers() {}
public function mget() {}
public function expire() {}
public function zunionstore() {}
public function zinterstore() {}
public function zRemove() {}
public function zRem() {}
public function zRemoveRangeByScore() {}
public function zRemRangeByScore() {}
public function zRemRangeByRank() {}
public function zSize() {}
public function substr() {}
public function rename() {}
public function del() {}
public function keys() {}
public function lrem() {}
public function ltrim() {}
public function lindex() {}
public function lrange() {}
public function scard() {}
public function srem() {}
public function sismember() {}
public function zReverseRange() {}
public function sendEcho() {}
public function evaluate() {}
public function evaluateSha() {}
}
class RedisArray {
// methods
public function __construct() {}
public function __call($function_name, $arguments) {}
public function _hosts() {}
public function _target() {}
public function _instance() {}
public function _function() {}
public function _distributor() {}
public function _rehash() {}
public function select() {}
public function info() {}
public function ping() {}
public function flushdb() {}
public function flushall() {}
public function mget() {}
public function mset() {}
public function del() {}
public function getOption() {}
public function setOption() {}
public function keys() {}
public function save() {}
public function bgsave() {}
public function multi() {}
public function exec() {}
public function discard() {}
public function unwatch() {}
public function delete() {}
public function getMultiple() {}
}
class RedisCluster {
// constants
public const REDIS_NOT_FOUND = 0;
public const REDIS_STRING = 1;
public const REDIS_SET = 2;
public const REDIS_LIST = 3;
public const REDIS_ZSET = 4;
public const REDIS_HASH = 5;
public const ATOMIC = 0;
public const MULTI = 1;
public const OPT_SERIALIZER = 1;
public const OPT_PREFIX = 2;
public const OPT_READ_TIMEOUT = 3;
public const SERIALIZER_NONE = 0;
public const SERIALIZER_PHP = 1;
public const OPT_SCAN = 4;
public const SCAN_RETRY = 1;
public const SCAN_NORETRY = 0;
public const OPT_SLAVE_FAILOVER = 5;
public const FAILOVER_NONE = 0;
public const FAILOVER_ERROR = 1;
public const FAILOVER_DISTRIBUTE = 2;
public const FAILOVER_DISTRIBUTE_SLAVES = 3;
public const AFTER = 'after';
public const BEFORE = 'before';
// methods
public function __construct() {}
public function close() {}
public function get() {}
public function set() {}
public function mget() {}
public function mset() {}
public function msetnx() {}
public function del() {}
public function setex() {}
public function psetex() {}
public function setnx() {}
public function getset() {}
public function exists() {}
public function keys() {}
public function type() {}
public function lpop() {}
public function rpop() {}
public function lset() {}
public function spop() {}
public function lpush() {}
public function rpush() {}
public function blpop() {}
public function brpop() {}
public function rpushx() {}
public function lpushx() {}
public function linsert() {}
public function lindex() {}
public function lrem() {}
public function brpoplpush() {}
public function rpoplpush() {}
public function llen() {}
public function scard() {}
public function smembers() {}
public function sismember() {}
public function sadd() {}
public function saddarray() {}
public function srem() {}
public function sunion() {}
public function sunionstore() {}
public function sinter() {}
public function sinterstore() {}
public function sdiff() {}
public function sdiffstore() {}
public function srandmember() {}
public function strlen() {}
public function persist() {}
public function ttl() {}
public function pttl() {}
public function zcard() {}
public function zcount() {}
public function zremrangebyscore() {}
public function zscore() {}
public function zadd() {}
public function zincrby() {}
public function hlen() {}
public function hkeys() {}
public function hvals() {}
public function hget() {}
public function hgetall() {}
public function hexists() {}
public function hincrby() {}
public function hset() {}
public function hsetnx() {}
public function hmget() {}
public function hmset() {}
public function hdel() {}
public function hincrbyfloat() {}
public function hstrlen() {}
public function dump() {}
public function zrank() {}
public function zrevrank() {}
public function incr() {}
public function decr() {}
public function incrby() {}
public function decrby() {}
public function incrbyfloat() {}
public function expire() {}
public function pexpire() {}
public function expireat() {}
public function pexpireat() {}
public function append() {}
public function getbit() {}
public function setbit() {}
public function bitop() {}
public function bitpos() {}
public function bitcount() {}
public function lget() {}
public function getrange() {}
public function ltrim() {}
public function lrange() {}
public function zremrangebyrank() {}
public function publish() {}
public function rename() {}
public function renamenx() {}
public function pfcount() {}
public function pfadd() {}
public function pfmerge() {}
public function setrange() {}
public function restore() {}
public function smove() {}
public function zrange() {}
public function zrevrange() {}
public function zrangebyscore() {}
public function zrevrangebyscore() {}
public function zrangebylex() {}
public function zrevrangebylex() {}
public function zlexcount() {}
public function zremrangebylex() {}
public function zunionstore() {}
public function zinterstore() {}
public function zrem() {}
public function sort() {}
public function object() {}
public function subscribe() {}
public function psubscribe() {}
public function unsubscribe() {}
public function punsubscribe() {}
public function eval() {}
public function evalsha() {}
public function scan(&$i_iterator, $str_node, $str_pattern = NULL, $i_count = NULL) {}
public function sscan($str_key, &$i_iterator, $str_pattern = NULL, $i_count = NULL) {}
public function zscan($str_key, &$i_iterator, $str_pattern = NULL, $i_count = NULL) {}
public function hscan($str_key, &$i_iterator, $str_pattern = NULL, $i_count = NULL) {}
public function getmode() {}
public function getlasterror() {}
public function clearlasterror() {}
public function getoption() {}
public function setoption() {}
public function _prefix() {}
public function _serialize() {}
public function _unserialize() {}
public function _masters() {}
public function _redir() {}
public function multi() {}
public function exec() {}
public function discard() {}
public function watch() {}
public function unwatch() {}
public function save() {}
public function bgsave() {}
public function flushdb() {}
public function flushall() {}
public function dbsize() {}
public function bgrewriteaof() {}
public function lastsave() {}
public function info() {}
public function role() {}
public function time() {}
public function randomkey() {}
public function ping() {}
public function echo() {}
public function command() {}
public function rawcommand() {}
public function cluster() {}
public function client() {}
public function config() {}
public function pubsub() {}
public function script() {}
public function slowlog() {}
public function geoadd() {}
public function geohash() {}
public function geopos() {}
public function geodist() {}
public function georadius() {}
public function georadiusbymember() {}
}
class RedisClusterException extends \Exception {
// properties
public $message;
public $code;
public $file;
public $line;
}
class RedisException extends \Exception {
// properties
public $message;
public $code;
public $file;
public $line;
}
}

View File

@ -61,6 +61,7 @@ function clean_checkout(string $dir)
system('find . -name .github | xargs rm -rf -');
system('find . -name .gitignore | xargs rm -rf -');
system('find . -name .gitmodules | xargs rm -rf -');
system('find . -name .phan | xargs rm -rf -');
system('find . -name .php-cs-fixer.dist.php | xargs rm -rf -');
system('find . -name .scrutinizer.yml | xargs rm -rf -');
system('find . -name .travis.yml | xargs rm -rf -');
@ -386,6 +387,7 @@ $doNotPackage = array(
'.editorconfig',
'.github',
'.gitignore',
'.phan',
'.php-cs-fixer.dist.php',
'acceptance.suite.yml',
// Media Manager Node Assets

View File

@ -114,7 +114,8 @@
"codeception/module-rest": "^1.0",
"codeception/module-webdriver": "^1.0",
"codeception/module-phpbrowser": "^1.0",
"hoa/console": "^3.17"
"hoa/console": "^3.17",
"phan/phan": "^5.4"
},
"replace": {
"paragonie/random_compat": "9.99.99"

510
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d9aeb137af8ceaf60f9d57ed6bf4f2fb",
"content-hash": "c61095e68a47e91539f9638afe58d7e0",
"packages": [
{
"name": "algo26-matthias/idna-convert",
@ -7753,6 +7753,51 @@
],
"time": "2022-02-28T11:07:21+00:00"
},
{
"name": "felixfbecker/advanced-json-rpc",
"version": "v3.2.1",
"source": {
"type": "git",
"url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
"reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
"reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
"shasum": ""
},
"require": {
"netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
"php": "^7.1 || ^8.0",
"phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
},
"require-dev": {
"phpunit/phpunit": "^7.0 || ^8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"AdvancedJsonRpc\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"ISC"
],
"authors": [
{
"name": "Felix Becker",
"email": "felix.b@outlook.com"
}
],
"description": "A more advanced JSONRPC implementation",
"support": {
"issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
"source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
},
"time": "2021-06-11T22:34:44+00:00"
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.4.0",
@ -9062,6 +9107,51 @@
},
"time": "2022-04-13T08:02:27+00:00"
},
{
"name": "microsoft/tolerant-php-parser",
"version": "v0.1.1",
"source": {
"type": "git",
"url": "https://github.com/microsoft/tolerant-php-parser.git",
"reference": "6a965617cf484355048ac6d2d3de7b6ec93abb16"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/6a965617cf484355048ac6d2d3de7b6ec93abb16",
"reference": "6a965617cf484355048ac6d2d3de7b6ec93abb16",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"require-dev": {
"phpunit/phpunit": "^8.5.15"
},
"type": "library",
"autoload": {
"psr-4": {
"Microsoft\\PhpParser\\": [
"src/"
]
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Rob Lourens",
"email": "roblou@microsoft.com"
}
],
"description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios",
"support": {
"issues": "https://github.com/microsoft/tolerant-php-parser/issues",
"source": "https://github.com/microsoft/tolerant-php-parser/tree/v0.1.1"
},
"time": "2021-07-16T21:28:12+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.11.0",
@ -9121,6 +9211,136 @@
],
"time": "2022-03-03T13:19:32+00:00"
},
{
"name": "netresearch/jsonmapper",
"version": "v4.0.0",
"source": {
"type": "git",
"url": "https://github.com/cweiske/jsonmapper.git",
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-pcre": "*",
"ext-reflection": "*",
"ext-spl": "*",
"php": ">=7.1"
},
"require-dev": {
"phpunit/phpunit": "~7.5 || ~8.0 || ~9.0",
"squizlabs/php_codesniffer": "~3.5"
},
"type": "library",
"autoload": {
"psr-0": {
"JsonMapper": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"OSL-3.0"
],
"authors": [
{
"name": "Christian Weiske",
"email": "cweiske@cweiske.de",
"homepage": "http://github.com/cweiske/jsonmapper/",
"role": "Developer"
}
],
"description": "Map nested JSON structures onto PHP classes",
"support": {
"email": "cweiske@cweiske.de",
"issues": "https://github.com/cweiske/jsonmapper/issues",
"source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0"
},
"time": "2020-12-01T19:48:11+00:00"
},
{
"name": "phan/phan",
"version": "5.4.1",
"source": {
"type": "git",
"url": "https://github.com/phan/phan.git",
"reference": "fef40178a952bcfcc3f69b76989dd613c3d5c759"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phan/phan/zipball/fef40178a952bcfcc3f69b76989dd613c3d5c759",
"reference": "fef40178a952bcfcc3f69b76989dd613c3d5c759",
"shasum": ""
},
"require": {
"composer/semver": "^1.4|^2.0|^3.0",
"composer/xdebug-handler": "^2.0|^3.0",
"ext-filter": "*",
"ext-json": "*",
"ext-tokenizer": "*",
"felixfbecker/advanced-json-rpc": "^3.0.4",
"microsoft/tolerant-php-parser": "0.1.1",
"netresearch/jsonmapper": "^1.6.0|^2.0|^3.0|^4.0",
"php": "^7.2.0|^8.0.0",
"sabre/event": "^5.1.3",
"symfony/console": "^3.2|^4.0|^5.0|^6.0",
"symfony/polyfill-mbstring": "^1.11.0",
"symfony/polyfill-php80": "^1.20.0",
"tysonandre/var_representation_polyfill": "^0.0.2|^0.1.0"
},
"require-dev": {
"phpunit/phpunit": "^8.5.0"
},
"suggest": {
"ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is needed, 1.0.16+ is recommended.",
"ext-iconv": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8",
"ext-igbinary": "Improves performance of polyfill when ext-ast is unavailable",
"ext-mbstring": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8",
"ext-tokenizer": "Needed for fallback/polyfill parser support and file/line-based suppressions.",
"ext-var_representation": "Suggested for converting values to strings in issue messages"
},
"bin": [
"phan",
"phan_client",
"tocheckstyle"
],
"type": "project",
"autoload": {
"psr-4": {
"Phan\\": "src/Phan"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tyson Andre"
},
{
"name": "Rasmus Lerdorf"
},
{
"name": "Andrew S. Morrison"
}
],
"description": "A static analyzer for PHP",
"keywords": [
"analyzer",
"php",
"static"
],
"support": {
"issues": "https://github.com/phan/phan/issues",
"source": "https://github.com/phan/phan/tree/5.4.1"
},
"time": "2022-08-26T00:49:07+00:00"
},
{
"name": "phar-io/manifest",
"version": "2.0.3",
@ -9350,6 +9570,166 @@
},
"time": "2022-05-03T12:16:34+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.3.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": ""
},
"require": {
"ext-filter": "*",
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.3",
"webmozart/assert": "^1.9.1"
},
"require-dev": {
"mockery/mockery": "~1.3.2",
"psalm/phar": "^4.8"
},
"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": "account@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.3.0"
},
"time": "2021-10-19T17:43:47+00:00"
},
{
"name": "phpdocumentor/type-resolver",
"version": "1.6.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "77a32518733312af16a44300404e945338981de3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
"reference": "77a32518733312af16a44300404e945338981de3",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
"psalm/phar": "^4.8"
},
"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.6.1"
},
"time": "2022-03-15T21:29:03+00:00"
},
{
"name": "phpunit/php-code-coverage",
"version": "7.0.15",
@ -9887,6 +10267,72 @@
},
"time": "2019-03-08T08:55:37+00:00"
},
{
"name": "sabre/event",
"version": "5.1.4",
"source": {
"type": "git",
"url": "https://github.com/sabre-io/event.git",
"reference": "d7da22897125d34d7eddf7977758191c06a74497"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sabre-io/event/zipball/d7da22897125d34d7eddf7977758191c06a74497",
"reference": "d7da22897125d34d7eddf7977758191c06a74497",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "~2.17.1",
"phpstan/phpstan": "^0.12",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.0"
},
"type": "library",
"autoload": {
"files": [
"lib/coroutine.php",
"lib/Loop/functions.php",
"lib/Promise/functions.php"
],
"psr-4": {
"Sabre\\Event\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Evert Pot",
"email": "me@evertpot.com",
"homepage": "http://evertpot.com/",
"role": "Developer"
}
],
"description": "sabre/event is a library for lightweight event-based programming",
"homepage": "http://sabre.io/event/",
"keywords": [
"EventEmitter",
"async",
"coroutine",
"eventloop",
"events",
"hooks",
"plugin",
"promise",
"reactor",
"signal"
],
"support": {
"forum": "https://groups.google.com/group/sabredav-discuss",
"issues": "https://github.com/sabre-io/event/issues",
"source": "https://github.com/fruux/sabre-event"
},
"time": "2021-11-04T06:51:17+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
"version": "1.0.2",
@ -11497,6 +11943,68 @@
}
],
"time": "2021-07-28T10:34:58+00:00"
},
{
"name": "tysonandre/var_representation_polyfill",
"version": "0.1.3",
"source": {
"type": "git",
"url": "https://github.com/TysonAndre/var_representation_polyfill.git",
"reference": "e9116c2c352bb0835ca428b442dde7767c11ad32"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/e9116c2c352bb0835ca428b442dde7767c11ad32",
"reference": "e9116c2c352bb0835ca428b442dde7767c11ad32",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": "^7.2.0|^8.0.0"
},
"provide": {
"ext-var_representation": "*"
},
"require-dev": {
"phan/phan": "^5.4.1",
"phpunit/phpunit": "^8.5.0"
},
"suggest": {
"ext-var_representation": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "0.1.3-dev"
}
},
"autoload": {
"files": [
"src/var_representation.php"
],
"psr-4": {
"VarRepresentation\\": "src/VarRepresentation"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tyson Andre"
}
],
"description": "Polyfill for var_representation: convert a variable to a string in a way that fixes the shortcomings of var_export",
"keywords": [
"var_export",
"var_representation"
],
"support": {
"issues": "https://github.com/TysonAndre/var_representation_polyfill/issues",
"source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.1.3"
},
"time": "2022-08-31T12:59:22+00:00"
}
],
"aliases": [],