diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d346745b2..58439dd8f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -27,11 +27,14 @@ If you have an idea you're sure would benefit to all of iTop users, you may
[create a corresponding ticket](https://sourceforge.net/p/itop/tickets/new/) to submit it, but be warned that there are lots of good
reasons to refuse such changes.
-### š License
+### š License and copyright
iTop is distributed under the AGPL-3.0 license (see the [license.txt] file),
your code must comply with this license.
-If you want to use another license, you may [create an extension][wiki new ext].
+Combodo has the copyright on each and every source file in the iTop repository: please do not modify the existing file copyrights.
+Anyhow, you are encouraged to signal your contribution by the mean of `@author` annotations.
+
+If you want to use another license or keep the code ownership (copyright), you may [create an extension][wiki new ext].
[license.txt]: https://github.com/Combodo/iTop/blob/develop/license.txt
[wiki new ext]: https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Astart#by_writing_your_own_extension
@@ -141,9 +144,9 @@ Detailed procedure to work on fork and create PR is available [in GitHub help pa
### š We are thankful
-We are thankful for all your contributions to the iTop universe! As a thank you gift, we will send stickers to every iTop (& extensions) contributors!
+We are thankful for all your contributions to the iTop universe! As a thank you gift, we will send stickers to every iTop (& extensions) contributors!
-Stickers' design might change from one year to another. For the first year we wanted to try a "craft beer label" look, see examples below:
+We have one sticker per contribution type. You might get multiple stickers with one contribution though :)
* Bug hunter: Fix a bug
* Translator: Add/update translations
@@ -155,4 +158,6 @@ Stickers' design might change from one year to another. For the first year we wa
* Beta tester: Test and give feedback on beta releases
* Extension developer: Develop and publish an extension
-
+Here is the design of each stickers for year 2022:
+
+
diff --git a/addons/userrights/userrightsmatrix.class.inc.php b/addons/userrights/userrightsmatrix.class.inc.php
index d80af3ed0..da64e17df 100644
--- a/addons/userrights/userrightsmatrix.class.inc.php
+++ b/addons/userrights/userrightsmatrix.class.inc.php
@@ -121,7 +121,6 @@ class UserRightsMatrix extends UserRightsAddOnAPI
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
{
// Maybe we should check that no other user with userid == 0 exists
- CMDBObject::SetTrackInfo('Initialization');
$oUser = new UserLocal();
$oUser->Set('login', $sAdminUser);
$oUser->Set('password', $sAdminPwd);
diff --git a/addons/userrights/userrightsprofile.class.inc.php b/addons/userrights/userrightsprofile.class.inc.php
index f91149843..c6b1ca722 100644
--- a/addons/userrights/userrightsprofile.class.inc.php
+++ b/addons/userrights/userrightsprofile.class.inc.php
@@ -435,20 +435,18 @@ class UserRightsProfile extends UserRightsAddOnAPI
// Installation: create the very first user
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
{
- CMDBObject::SetTrackInfo('Initialization');
+ CMDBObject::SetCurrentChangeFromParams('Initialization create administrator');
$iContactId = 0;
// Support drastic data model changes: no organization class (or not writable)!
- if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization'))
- {
+ if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization')) {
$oOrg = MetaModel::NewObject('Organization');
$oOrg->Set('name', 'My Company/Department');
$oOrg->Set('code', 'SOMECODE');
$iOrgId = $oOrg->DBInsertNoReload();
// Support drastic data model changes: no Person class (or not writable)!
- if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person'))
- {
+ if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person')) {
$oContact = MetaModel::NewObject('Person');
$oContact->Set('name', 'My last name');
$oContact->Set('first_name', 'My first name');
diff --git a/addons/userrights/userrightsprofile.db.class.inc.php b/addons/userrights/userrightsprofile.db.class.inc.php
index ac5b2277b..44b40ab30 100644
--- a/addons/userrights/userrightsprofile.db.class.inc.php
+++ b/addons/userrights/userrightsprofile.db.class.inc.php
@@ -508,24 +508,18 @@ class UserRightsProfile extends UserRightsAddOnAPI
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
{
// Create a change to record the history of the User object
- /** @var \CMDBChange $oChange */
- $oChange = MetaModel::NewObject("CMDBChange");
- $oChange->Set("date", time());
- $oChange->Set("userinfo", "Initialization");
+ CMDBObject::SetCurrentChangeFromParams('Initialization : create first user admin profile');
$iContactId = 0;
// Support drastic data model changes: no organization class (or not writable)!
- if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization'))
- {
+ if (MetaModel::IsValidClass('Organization') && !MetaModel::IsAbstract('Organization')) {
$oOrg = MetaModel::NewObject('Organization');
$oOrg->Set('name', 'My Company/Department');
$oOrg->Set('code', 'SOMECODE');
- $oOrg::SetCurrentChange($oChange);
$iOrgId = $oOrg->DBInsertNoReload();
// Support drastic data model changes: no Person class (or not writable)!
- if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person'))
- {
+ if (MetaModel::IsValidClass('Person') && !MetaModel::IsAbstract('Person')) {
$oContact = MetaModel::NewObject('Person');
$oContact->Set('name', 'My last name');
$oContact->Set('first_name', 'My first name');
@@ -534,7 +528,6 @@ class UserRightsProfile extends UserRightsAddOnAPI
$oContact->Set('org_id', $iOrgId);
}
$oContact->Set('email', 'my.email@foo.org');
- $oContact::SetCurrentChange($oChange);
$iContactId = $oContact->DBInsertNoReload();
}
}
@@ -543,24 +536,22 @@ class UserRightsProfile extends UserRightsAddOnAPI
$oUser = new UserLocal();
$oUser->Set('login', $sAdminUser);
$oUser->Set('password', $sAdminPwd);
- if (MetaModel::IsValidAttCode('UserLocal', 'contactid') && ($iContactId != 0))
- {
+ if (MetaModel::IsValidAttCode('UserLocal', 'contactid') && ($iContactId != 0)) {
$oUser->Set('contactid', $iContactId);
}
$oUser->Set('language', $sLanguage); // Language was chosen during the installation
// Add this user to the very specific 'admin' profile
$oAdminProfile = MetaModel::GetObjectFromOQL("SELECT URP_Profiles WHERE name = :name", array('name' => ADMIN_PROFILE_NAME), true /*all data*/);
- if (is_object($oAdminProfile))
- {
+ if (is_object($oAdminProfile)) {
$oUserProfile = new URP_UserProfile();
$oUserProfile->Set('profileid', $oAdminProfile->GetKey());
$oUserProfile->Set('reason', 'By definition, the administrator must have the administrator profile');
$oSet = DBObjectSet::FromObject($oUserProfile);
$oUser->Set('profile_list', $oSet);
}
- $oUser::SetCurrentChange($oChange);
- $iUserId = $oUser->DBInsertNoReload();
+ $oUser->DBInsertNoReload();
+
return true;
}
diff --git a/addons/userrights/userrightsprojection.class.inc.php b/addons/userrights/userrightsprojection.class.inc.php
index 61fb07fe6..6aa5eefc0 100644
--- a/addons/userrights/userrightsprojection.class.inc.php
+++ b/addons/userrights/userrightsprojection.class.inc.php
@@ -568,14 +568,11 @@ class UserRightsProjection extends UserRightsAddOnAPI
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
{
// Create a change to record the history of the User object
- $oChange = MetaModel::NewObject("CMDBChange");
- $oChange->Set("date", time());
- $oChange->Set("userinfo", "Initialization");
+ CMDBObject::SetCurrentChangeFromParams('Initialization : create first user admin');
$oOrg = new Organization();
$oOrg->Set('name', 'My Company/Department');
$oOrg->Set('code', 'SOMECODE');
- $oOrg::SetCurrentChange($oChange);
$iOrgId = $oOrg->DBInsertNoReload();
$oContact = new Person();
@@ -584,7 +581,6 @@ class UserRightsProjection extends UserRightsAddOnAPI
//$oContact->Set('status', 'available');
$oContact->Set('org_id', $iOrgId);
$oContact->Set('email', 'my.email@foo.org');
- $oContact::SetCurrentChange($oChange);
$iContactId = $oContact->DBInsertNoReload();
$oUser = new UserLocal();
@@ -592,7 +588,6 @@ class UserRightsProjection extends UserRightsAddOnAPI
$oUser->Set('password', $sAdminPwd);
$oUser->Set('contactid', $iContactId);
$oUser->Set('language', $sLanguage); // Language was chosen during the installation
- $oUser::SetCurrentChange($oChange);
$iUserId = $oUser->DBInsertNoReload();
// Add this user to the very specific 'admin' profile
@@ -600,7 +595,6 @@ class UserRightsProjection extends UserRightsAddOnAPI
$oUserProfile->Set('userid', $iUserId);
$oUserProfile->Set('profileid', ADMIN_PROFILE_ID);
$oUserProfile->Set('reason', 'By definition, the administrator must have the administrator profile');
- $oUserProfile::SetCurrentChange($oChange);
$oUserProfile->DBInsertNoReload();
return true;
}
diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php
index 1bd3c3269..4bd293a0a 100644
--- a/application/cmdbabstract.class.inc.php
+++ b/application/cmdbabstract.class.inc.php
@@ -342,13 +342,17 @@ JS
}
/**
- * Important: For compatibility reasons, this function still allows to manipulate the $oPage. In that case, markup will be put above the real header of the panel.
- * To insert something IN the panel, we now need to add UIBlocks in either the "subtitle" or "toolbar" sections of the array that will be returned.
+ * @param \WebPage $oPage warning, since 3.0.0 this parameter was kept for compatibility reason. You shouldn't write directly on the page !
+ * When writing to the page, markup will be put above the real header of the panel.
+ * To insert something IN the panel, we now need to add UIBlocks in either the "subtitle" or "toolbar" sections of the array that will be returned.
+ * @param bool $bEditMode Deprecated parameter in iTop 3.0.0, use {@see GetDisplayMode()} and ENUM_DISPLAY_MODE_* constants instead
*
- * @param \WebPage $oPage
- * @param bool $bEditMode Note that this parameter is no longer used in this method. Use {@see static::$sDisplayMode} instead
- *
- * @return array UIBlocks to be inserted in the "subtitle" and the "toolbar" sections of the ObjectDetails block. eg. ['subtitle' => [, ], 'toolbar' => []]
+ * @return array{
+ * subtitle: \Combodo\iTop\Application\UI\Base\UIBlock[],
+ * toolbar: \Combodo\iTop\Application\UI\Base\UIBlock[]
+ * }
+ * blocks to be inserted in the "subtitle" and the "toolbar" sections of the ObjectDetails block.
+ * eg. ['subtitle' => [, ], 'toolbar' => []]
*
* @throws \ApplicationException
* @throws \ArchivedObjectException
@@ -357,7 +361,10 @@ JS
* @throws \MySQLException
* @throws \OQLException
*
- * @since 3.0.0 $bEditMode is deprecated and no longer used
+ * @since 3.0.0 $bEditMode is deprecated, see param documentation above
+ * @since 3.0.0 changed signature : method must return header content in an array (no more writing directly to the $oPage)
+ *
+ * @noinspection PhpUnusedParameterInspection
*/
public function DisplayBareHeader(WebPage $oPage, $bEditMode = false)
{
diff --git a/application/logintwig.class.inc.php b/application/logintwig.class.inc.php
index b800e2e80..b7d411b1d 100644
--- a/application/logintwig.class.inc.php
+++ b/application/logintwig.class.inc.php
@@ -9,6 +9,9 @@
use Combodo\iTop\Application\Branding;
use Combodo\iTop\Application\TwigBase\Twig\Extension;
+use Twig\Environment;
+use Twig\Loader\ChainLoader;
+use Twig\Loader\FilesystemLoader;
/**
* Twig context for modules extending the login screen
@@ -217,14 +220,14 @@ class LoginTwigRenderer
$sTwigLoaderPath = $oLoginContext->GetTwigLoaderPath();
if ($sTwigLoaderPath != null)
{
- $oExtensionLoader = new Twig_Loader_Filesystem();
+ $oExtensionLoader = new FilesystemLoader();
$oExtensionLoader->setPaths($sTwigLoaderPath);
$aTwigLoaders[] = $oExtensionLoader;
}
$this->aPostedVars = array_merge($this->aPostedVars, $oLoginContext->GetPostedVars());
}
- $oCoreLoader = new Twig_Loader_Filesystem(array(), APPROOT.'templates');
+ $oCoreLoader = new FilesystemLoader(array(), APPROOT.'templates');
$aCoreTemplatesPaths = array('pages/login', 'pages/login/password');
// Having this path declared after the plugins let the plugins replace the core templates
$oCoreLoader->setPaths($aCoreTemplatesPaths);
@@ -232,8 +235,8 @@ class LoginTwigRenderer
$oCoreLoader->setPaths($aCoreTemplatesPaths, 'ItopCore');
$aTwigLoaders[] = $oCoreLoader;
- $oLoader = new Twig_Loader_Chain($aTwigLoaders);
- $this->oTwig = new Twig_Environment($oLoader);
+ $oLoader = new ChainLoader($aTwigLoaders);
+ $this->oTwig = new Environment($oLoader);
Extension::RegisterTwigExtensions($this->oTwig);
}
@@ -306,7 +309,7 @@ class LoginTwigRenderer
}
/**
- * @return \Twig_Environment
+ * @return \Twig\Environment
*/
public function GetTwig()
{
diff --git a/application/twigextension.class.inc.php b/application/twigextension.class.inc.php
index d0a92aab4..5234eb96a 100644
--- a/application/twigextension.class.inc.php
+++ b/application/twigextension.class.inc.php
@@ -8,9 +8,9 @@ use DeprecatedCallsLog;
use Dict;
use Exception;
use MetaModel;
-use Twig_Environment;
-use Twig_SimpleFilter;
-use Twig_SimpleFunction;
+use Twig\Environment;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
use utils;
DeprecatedCallsLog::NotifyDeprecatedFile('instead use sources/Application/TwigBase/Twig/Extension.php, which is loaded by the autoloader');
@@ -28,13 +28,13 @@ class TwigExtension
* Registers Twig extensions such as filters or functions.
* It allows us to access some stuff directly in twig.
*
- * @param \Twig_Environment $oTwigEnv
+ * @param Environment $oTwigEnv
*/
- public static function RegisterTwigExtensions(Twig_Environment &$oTwigEnv)
+ public static function RegisterTwigExtensions(Environment &$oTwigEnv)
{
// Filter to translate a string via the Dict::S function
// Usage in twig: {{ 'String:ToTranslate'|dict_s }}
- $oTwigEnv->addFilter(new Twig_SimpleFilter('dict_s',
+ $oTwigEnv->addFilter(new TwigFilter('dict_s',
function ($sStringCode, $sDefault = null, $bUserLanguageOnly = false) {
return Dict::S($sStringCode, $sDefault, $bUserLanguageOnly);
})
@@ -42,7 +42,7 @@ class TwigExtension
// Filter to format a string via the Dict::Format function
// Usage in twig: {{ 'String:ToTranslate'|dict_format() }}
- $oTwigEnv->addFilter(new Twig_SimpleFilter('dict_format',
+ $oTwigEnv->addFilter(new TwigFilter('dict_format',
function ($sStringCode, $sParam01 = null, $sParam02 = null, $sParam03 = null, $sParam04 = null) {
return Dict::Format($sStringCode, $sParam01, $sParam02, $sParam03, $sParam04);
})
@@ -51,16 +51,13 @@ class TwigExtension
// Filter to format output
// example a DateTime is converted to user format
// Usage in twig: {{ 'String:ToFormat'|output_format }}
- $oTwigEnv->addFilter(new Twig_SimpleFilter('date_format',
+ $oTwigEnv->addFilter(new TwigFilter('date_format',
function ($sDate) {
- try
- {
- if (preg_match('@^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$@', trim($sDate)))
- {
+ try {
+ if (preg_match('@^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$@', trim($sDate))) {
return AttributeDateTime::GetFormat()->Format($sDate);
}
- if (preg_match('@^\d\d\d\d-\d\d-\d\d$@', trim($sDate)))
- {
+ if (preg_match('@^\d\d\d\d-\d\d-\d\d$@', trim($sDate))) {
return AttributeDate::GetFormat()->Format($sDate);
}
}
@@ -75,7 +72,7 @@ class TwigExtension
// Filter to format output
// example a DateTime is converted to user format
// Usage in twig: {{ 'String:ToFormat'|output_format }}
- $oTwigEnv->addFilter(new Twig_SimpleFilter('size_format',
+ $oTwigEnv->addFilter(new TwigFilter('size_format',
function ($sSize) {
return utils::BytesToFriendlyFormat($sSize);
})
@@ -83,24 +80,25 @@ class TwigExtension
// Filter to enable base64 encode/decode
// Usage in twig: {{ 'String to encode'|base64_encode }}
- $oTwigEnv->addFilter(new Twig_SimpleFilter('base64_encode', 'base64_encode'));
- $oTwigEnv->addFilter(new Twig_SimpleFilter('base64_decode', 'base64_decode'));
+ $oTwigEnv->addFilter(new TwigFilter('base64_encode', 'base64_encode'));
+ $oTwigEnv->addFilter(new TwigFilter('base64_decode', 'base64_decode'));
// Filter to enable json decode (encode already exists)
// Usage in twig: {{ aSomeArray|json_decode }}
- $oTwigEnv->addFilter(new Twig_SimpleFilter('json_decode', function ($sJsonString, $bAssoc = false) {
+ $oTwigEnv->addFilter(new TwigFilter('json_decode', function ($sJsonString, $bAssoc = false) {
return json_decode($sJsonString, $bAssoc);
})
);
// Filter to add itopversion to an url
- $oTwigEnv->addFilter(new Twig_SimpleFilter('add_itop_version', function ($sUrl) {
+ $oTwigEnv->addFilter(new TwigFilter('add_itop_version', function ($sUrl) {
$sUrl = utils::AddParameterToUrl($sUrl, 'itopversion', ITOP_VERSION);
+
return $sUrl;
}));
// Filter to add a module's version to an url
- $oTwigEnv->addFilter(new Twig_SimpleFilter('add_module_version', function ($sUrl, $sModuleName) {
+ $oTwigEnv->addFilter(new TwigFilter('add_module_version', function ($sUrl, $sModuleName) {
$sModuleVersion = utils::GetCompiledModuleVersion($sModuleName);
$sUrl = utils::AddParameterToUrl($sUrl, 'moduleversion', $sModuleVersion);
@@ -109,38 +107,36 @@ class TwigExtension
// Function to check our current environment
// Usage in twig: {% if is_development_environment() %}
- $oTwigEnv->addFunction(new Twig_SimpleFunction('is_development_environment', function()
- {
+ $oTwigEnv->addFunction(new TwigFunction('is_development_environment', function () {
return utils::IsDevelopmentEnvironment();
}));
// Function to get configuration parameter
// Usage in twig: {{ get_config_parameter('foo') }}
- $oTwigEnv->addFunction(new Twig_SimpleFunction('get_config_parameter', function($sParamName)
- {
+ $oTwigEnv->addFunction(new TwigFunction('get_config_parameter', function ($sParamName) {
$oConfig = MetaModel::GetConfig();
+
return $oConfig->Get($sParamName);
}));
// Function to get a module setting
// Usage in twig: {{ get_module_setting(, [, ]) }}
// since 3.0.0, but see N°4034 for upcoming evolutions in the 3.1
- $oTwigEnv->addFunction(new Twig_SimpleFunction('get_module_setting', function (string $sModuleCode, string $sPropertyCode, $defaultValue = null) {
+ $oTwigEnv->addFunction(new TwigFunction('get_module_setting', function (string $sModuleCode, string $sPropertyCode, $defaultValue = null) {
$oConfig = MetaModel::GetConfig();
+
return $oConfig->GetModuleSetting($sModuleCode, $sPropertyCode, $defaultValue);
}));
// Function to get the URL of a static page in a module
// Usage in twig: {{ get_static_page_module_url('itop-my-module', 'path-to-my-page') }}
- $oTwigEnv->addFunction(new Twig_SimpleFunction('get_static_page_module_url', function($sModuleName, $sPage)
- {
+ $oTwigEnv->addFunction(new TwigFunction('get_static_page_module_url', function ($sModuleName, $sPage) {
return utils::GetAbsoluteUrlModulesRoot().$sModuleName.'/'.$sPage;
}));
// Function to get the URL of a php page in a module
// Usage in twig: {{ get_page_module_url('itop-my-module', 'path-to-my-my-page.php') }}
- $oTwigEnv->addFunction(new Twig_SimpleFunction('get_page_module_url', function($sModuleName, $sPage)
- {
+ $oTwigEnv->addFunction(new TwigFunction('get_page_module_url', function ($sModuleName, $sPage) {
return utils::GetAbsoluteUrlModulePage($sModuleName, $sPage);
}));
}
diff --git a/application/utils.inc.php b/application/utils.inc.php
index f9f00c199..09f60bb13 100644
--- a/application/utils.inc.php
+++ b/application/utils.inc.php
@@ -21,6 +21,8 @@ use Combodo\iTop\Application\Helper\Session;
use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
use ScssPhp\ScssPhp\Compiler;
+use ScssPhp\ScssPhp\OutputStyle;
+use ScssPhp\ScssPhp\ValueConverter;
/**
@@ -1940,20 +1942,25 @@ class utils
*/
public static function CompileCSSFromSASS($sSassContent, $aImportPaths = array(), $aVariables = array())
{
- $oSass = new Compiler();
- $oSass->setFormatter('ScssPhp\\ScssPhp\\Formatter\\Compressed');
+ $oSass = new Compiler();//['checkImportResolutions'=>true]);
+ $oSass->setOutputStyle(OutputStyle::COMPRESSED);
// Setting our variables
- $oSass->setVariables($aVariables);
+ $aCssVariable = [];
+ foreach ($aVariables as $entry=>$value) {
+ $aCssVariable[$entry] = ValueConverter::parseValue($value);
+ }
+ $oSass->addVariables($aCssVariable);
// Setting our imports paths
$oSass->setImportPaths($aImportPaths);
// Temporary disabling max exec time while compiling
$iCurrentMaxExecTime = (int) ini_get('max_execution_time');
set_time_limit(0);
// Compiling SASS
- $sCss = $oSass->compile($sSassContent);
+ //checkImportResolutions
+ $sCss = $oSass->compileString($sSassContent);
set_time_limit(intval($iCurrentMaxExecTime));
- return $sCss;
+ return $sCss->getCss();
}
/**
diff --git a/composer.json b/composer.json
index b705f215d..6fb9e827e 100644
--- a/composer.json
+++ b/composer.json
@@ -2,7 +2,7 @@
"type": "project",
"license": "AGPLv3",
"require": {
- "php": ">=7.1.3 <8.0.0",
+ "php": ">=7.2.5 <8.0.0",
"ext-ctype": "*",
"ext-dom": "*",
"ext-gd": "*",
@@ -11,25 +11,24 @@
"ext-mysqli": "*",
"ext-soap": "*",
"combodo/tcpdf": "~6.4.4",
- "guzzlehttp/guzzle": "^6.5",
+ "guzzlehttp/guzzle": "^6.5.8",
"laminas/laminas-mail": "^2.11",
"laminas/laminas-servicemanager": "^3.5",
"league/oauth2-google": "^3.0",
"nikic/php-parser": "~4.13.2",
"pear/archive_tar": "~1.4.14",
"pelago/emogrifier": "~3.1.0",
- "scssphp/scssphp": "1.0.6",
- "symfony/console": "~3.4.47",
- "symfony/dotenv": "~3.4.47",
- "symfony/framework-bundle": "~3.4.47",
- "symfony/twig-bundle": "~3.4.47",
- "symfony/yaml": "~3.4.47",
- "thenetworg/oauth2-azure": "^2.0",
- "twig/twig": "~1.42.5"
+ "scssphp/scssphp": "^1.10.3",
+ "symfony/console": "5.4.*",
+ "symfony/dotenv": "5.4.*",
+ "symfony/framework-bundle": "5.4.*",
+ "symfony/twig-bundle": "5.4.*",
+ "symfony/yaml": "5.4.*",
+ "thenetworg/oauth2-azure": "^2.0"
},
"require-dev": {
- "symfony/stopwatch": "~3.4.47",
- "symfony/web-profiler-bundle": "~3.4.47"
+ "symfony/stopwatch": "5.4.*",
+ "symfony/web-profiler-bundle": "5.4.*"
},
"suggest": {
"ext-libsodium": "Required to use the AttributeEncryptedString.",
@@ -41,7 +40,7 @@
},
"config": {
"platform": {
- "php": "7.1.3"
+ "php": "7.2.5"
},
"vendor-dir": "lib",
"preferred-install": {
diff --git a/composer.lock b/composer.lock
index d62b45e1f..9132e4f7f 100644
--- a/composer.lock
+++ b/composer.lock
@@ -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": "ec514b23be219595cb60a167c8da7f27",
+ "content-hash": "3438e44ef160404089e3bfa9719f11dd",
"packages": [
{
"name": "combodo/tcpdf",
@@ -179,24 +179,24 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "6.5.6",
+ "version": "6.5.8",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "f092dd734083473658de3ee4bef093ed77d2689c"
+ "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f092dd734083473658de3ee4bef093ed77d2689c",
- "reference": "f092dd734083473658de3ee4bef093ed77d2689c",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981",
+ "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.6.1",
+ "guzzlehttp/psr7": "^1.9",
"php": ">=5.5",
- "symfony/polyfill-intl-idn": "^1.17.0"
+ "symfony/polyfill-intl-idn": "^1.17"
},
"require-dev": {
"ext-curl": "*",
@@ -274,7 +274,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/6.5.6"
+ "source": "https://github.com/guzzle/guzzle/tree/6.5.8"
},
"funding": [
{
@@ -290,7 +290,7 @@
"type": "tidelift"
}
],
- "time": "2022-05-25T13:19:12+00:00"
+ "time": "2022-06-20T22:16:07+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -378,16 +378,16 @@
},
{
"name": "guzzlehttp/psr7",
- "version": "1.8.5",
+ "version": "1.9.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268"
+ "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/337e3ad8e5716c15f9657bd214d16cc5e69df268",
- "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
+ "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
"shasum": ""
},
"require": {
@@ -408,7 +408,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.7-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
@@ -468,7 +468,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/1.8.5"
+ "source": "https://github.com/guzzle/psr7/tree/1.9.0"
},
"funding": [
{
@@ -484,7 +484,7 @@
"type": "tidelift"
}
],
- "time": "2022-03-20T21:51:18+00:00"
+ "time": "2022-06-20T21:43:03+00:00"
},
{
"name": "laminas/laminas-loader",
@@ -1157,33 +1157,29 @@
},
{
"name": "paragonie/random_compat",
- "version": "v2.0.18",
+ "version": "v9.99.100",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
- "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
- "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": ""
},
"require": {
- "php": ">=5.2.0"
+ "php": ">= 7"
},
"require-dev": {
- "phpunit/phpunit": "4.*|5.*"
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
"type": "library",
- "autoload": {
- "files": [
- "lib/random.php"
- ]
- },
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
@@ -1202,7 +1198,12 @@
"pseudorandom",
"random"
],
- "time": "2019-01-03T20:59:08+00:00"
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/random_compat/issues",
+ "source": "https://github.com/paragonie/random_compat"
+ },
+ "time": "2020-10-15T08:29:30+00:00"
},
{
"name": "pear/archive_tar",
@@ -1337,16 +1338,16 @@
},
{
"name": "pear/pear-core-minimal",
- "version": "v1.10.10",
+ "version": "v1.10.11",
"source": {
"type": "git",
"url": "https://github.com/pear/pear-core-minimal.git",
- "reference": "625a3c429d9b2c1546438679074cac1b089116a7"
+ "reference": "68d0d32ada737153b7e93b8d3c710ebe70ac867d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/625a3c429d9b2c1546438679074cac1b089116a7",
- "reference": "625a3c429d9b2c1546438679074cac1b089116a7",
+ "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/68d0d32ada737153b7e93b8d3c710ebe70ac867d",
+ "reference": "68d0d32ada737153b7e93b8d3c710ebe70ac867d",
"shasum": ""
},
"require": {
@@ -1381,7 +1382,7 @@
"issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR",
"source": "https://github.com/pear/pear-core-minimal"
},
- "time": "2019-11-19T19:00:24+00:00"
+ "time": "2021-08-10T22:31:03+00:00"
},
{
"name": "pear/pear_exception",
@@ -1564,31 +1565,29 @@
"psr",
"psr-6"
],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/master"
+ },
"time": "2016-08-06T20:24:11+00:00"
},
{
"name": "psr/container",
- "version": "1.0.0",
+ "version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=7.2.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
@@ -1601,7 +1600,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common Container Interface (PHP FIG PSR-11)",
@@ -1613,7 +1612,61 @@
"container-interop",
"psr"
],
- "time": "2017-02-14T16:28:37+00:00"
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/1.1.1"
+ },
+ "time": "2021-03-05T17:36:06+00:00"
+ },
+ {
+ "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"
},
{
"name": "psr/http-message",
@@ -1670,16 +1723,16 @@
},
{
"name": "psr/log",
- "version": "1.1.2",
+ "version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
"shasum": ""
},
"require": {
@@ -1703,7 +1756,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
@@ -1713,55 +1766,10 @@
"psr",
"psr-3"
],
- "time": "2019-11-01T11:05:21+00:00"
- },
- {
- "name": "psr/simple-cache",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/simple-cache.git",
- "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
},
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
- "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\SimpleCache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interfaces for simple caching",
- "keywords": [
- "cache",
- "caching",
- "psr",
- "psr-16",
- "simple-cache"
- ],
- "time": "2017-10-23T01:57:42+00:00"
+ "time": "2021-05-03T11:20:27+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -1809,16 +1817,16 @@
},
{
"name": "scssphp/scssphp",
- "version": "1.0.6",
+ "version": "v1.10.3",
"source": {
"type": "git",
"url": "https://github.com/scssphp/scssphp.git",
- "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c"
+ "reference": "0f1e1516ed2412ad43e42a6a319e77624ba1f713"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/scssphp/scssphp/zipball/5b3c9d704950d8f9637f5110c36c281ec47dc13c",
- "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c",
+ "url": "https://api.github.com/repos/scssphp/scssphp/zipball/0f1e1516ed2412ad43e42a6a319e77624ba1f713",
+ "reference": "0f1e1516ed2412ad43e42a6a319e77624ba1f713",
"shasum": ""
},
"require": {
@@ -1827,11 +1835,20 @@
"php": ">=5.6.0"
},
"require-dev": {
- "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
- "squizlabs/php_codesniffer": "~2.5",
- "twbs/bootstrap": "~4.3",
+ "bamarni/composer-bin-plugin": "^1.4",
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4",
+ "sass/sass-spec": "*",
+ "squizlabs/php_codesniffer": "~3.5",
+ "symfony/phpunit-bridge": "^5.1",
+ "thoughtbot/bourbon": "^7.0",
+ "twbs/bootstrap": "~5.0",
+ "twbs/bootstrap4": "4.6.1",
"zurb/foundation": "~6.5"
},
+ "suggest": {
+ "ext-iconv": "Can be used as fallback when ext-mbstring is not available",
+ "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv"
+ },
"bin": [
"bin/pscss"
],
@@ -1868,43 +1885,58 @@
],
"support": {
"issues": "https://github.com/scssphp/scssphp/issues",
- "source": "https://github.com/scssphp/scssphp/tree/master"
+ "source": "https://github.com/scssphp/scssphp/tree/v1.10.3"
},
- "time": "2019-12-12T05:00:52+00:00"
+ "time": "2022-05-16T07:22:18+00:00"
},
{
"name": "symfony/cache",
- "version": "v3.4.47",
+ "version": "v5.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
- "reference": "a7a14c4832760bd1fbd31be2859ffedc9b6ff813"
+ "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/a7a14c4832760bd1fbd31be2859ffedc9b6ff813",
- "reference": "a7a14c4832760bd1fbd31be2859ffedc9b6ff813",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/a50b7249bea81ddd6d3b799ce40c5521c2f72f0b",
+ "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/cache": "~1.0",
- "psr/log": "~1.0",
- "psr/simple-cache": "^1.0",
- "symfony/polyfill-apcu": "~1.1"
+ "php": ">=7.2.5",
+ "psr/cache": "^1.0|^2.0",
+ "psr/log": "^1.1|^2|^3",
+ "symfony/cache-contracts": "^1.1.7|^2",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
},
"conflict": {
- "symfony/var-dumper": "<3.3"
+ "doctrine/dbal": "<2.13.1",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/http-kernel": "<4.4",
+ "symfony/var-dumper": "<4.4"
},
"provide": {
- "psr/cache-implementation": "1.0",
- "psr/simple-cache-implementation": "1.0"
+ "psr/cache-implementation": "1.0|2.0",
+ "psr/simple-cache-implementation": "1.0|2.0",
+ "symfony/cache-implementation": "1.0|2.0"
},
"require-dev": {
"cache/integration-tests": "dev-master",
- "doctrine/cache": "^1.6",
- "doctrine/dbal": "^2.4|^3.0",
- "predis/predis": "^1.0"
+ "doctrine/cache": "^1.6|^2.0",
+ "doctrine/dbal": "^2.13.1|^3.0",
+ "predis/predis": "^1.1",
+ "psr/simple-cache": "^1.0|^2.0",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/messenger": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"type": "library",
"autoload": {
@@ -1929,14 +1961,14 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
+ "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
"homepage": "https://symfony.com",
"keywords": [
"caching",
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v3.4.47"
+ "source": "https://github.com/symfony/cache/tree/v5.4.9"
},
"funding": [
{
@@ -1952,40 +1984,43 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-21T10:24:18+00:00"
},
{
- "name": "symfony/class-loader",
- "version": "v3.4.47",
+ "name": "symfony/cache-contracts",
+ "version": "v2.5.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/class-loader.git",
- "reference": "a22265a9f3511c0212bf79f54910ca5a77c0e92c"
+ "url": "https://github.com/symfony/cache-contracts.git",
+ "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/class-loader/zipball/a22265a9f3511c0212bf79f54910ca5a77c0e92c",
- "reference": "a22265a9f3511c0212bf79f54910ca5a77c0e92c",
+ "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+ "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
- },
- "require-dev": {
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/polyfill-apcu": "~1.1"
+ "php": ">=7.2.5",
+ "psr/cache": "^1.0|^2.0|^3.0"
},
"suggest": {
- "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
+ "symfony/cache-implementation": ""
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
"autoload": {
"psr-4": {
- "Symfony\\Component\\ClassLoader\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Symfony\\Contracts\\Cache\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1993,18 +2028,26 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony ClassLoader Component",
+ "description": "Generic abstractions related to caching",
"homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
"support": {
- "source": "https://github.com/symfony/class-loader/tree/v3.4.47"
+ "source": "https://github.com/symfony/cache-contracts/tree/v2.5.1"
},
"funding": [
{
@@ -2020,36 +2063,39 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-01-02T09:53:40+00:00"
},
{
"name": "symfony/config",
- "version": "v3.4.47",
+ "version": "v5.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f"
+ "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
- "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
+ "url": "https://api.github.com/repos/symfony/config/zipball/8f551fe22672ac7ab2c95fe46d899f960ed4d979",
+ "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/filesystem": "~2.8|~3.0|~4.0",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22"
},
"conflict": {
- "symfony/dependency-injection": "<3.3",
- "symfony/finder": "<3.3"
+ "symfony/finder": "<4.4"
},
"require-dev": {
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/event-dispatcher": "~3.3|~4.0",
- "symfony/finder": "~3.3|~4.0",
- "symfony/yaml": "~3.0|~4.0"
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/messenger": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/yaml": "To use the yaml reference dumper"
@@ -2077,10 +2123,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Config Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/config/tree/v5.4.9"
},
"funding": [
{
@@ -2096,41 +2142,50 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-17T10:39:36+00:00"
},
{
"name": "symfony/console",
- "version": "v3.4.47",
+ "version": "v5.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81"
+ "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81",
- "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81",
+ "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb",
+ "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/debug": "~2.8|~3.0|~4.0",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
},
"conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/process": "<3.3"
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
},
"provide": {
- "psr/log-implementation": "1.0"
+ "psr/log-implementation": "1.0|2.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~3.3|~4.0",
- "symfony/dependency-injection": "~3.4|~4.0",
- "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
- "symfony/lock": "~3.4|~4.0",
- "symfony/process": "~3.3|~4.0"
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/log": "For using the console logger",
@@ -2161,10 +2216,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Console Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/console/tree/v5.4.9"
},
"funding": [
{
@@ -2180,24 +2241,25 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-18T06:17:34+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v3.4.47",
+ "version": "v5.4.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33"
+ "reference": "b0a190285cd95cb019237851205b8140ef6e368e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/da3d9da2ce0026771f5fe64cb332158f1bd2bc33",
- "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0a190285cd95cb019237851205b8140ef6e368e",
+ "reference": "b0a190285cd95cb019237851205b8140ef6e368e",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
"autoload": {
@@ -2226,10 +2288,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony CssSelector Component",
+ "description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v3.4.47"
+ "source": "https://github.com/symfony/css-selector/tree/v5.4.3"
},
"funding": [
{
@@ -2245,107 +2307,45 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
- },
- {
- "name": "symfony/debug",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/debug.git",
- "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/ab42889de57fdfcfcc0759ab102e2fd4ea72dcae",
- "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/log": "~1.0"
- },
- "conflict": {
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
- },
- "require-dev": {
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Debug\\": ""
- },
- "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": "Symfony Debug Component",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/debug/tree/v3.4.47"
- },
- "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": "2020-10-24T10:57:07+00:00"
+ "time": "2022-01-02T09:53:40+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v3.4.47",
+ "version": "v5.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b"
+ "reference": "beecae161577305926ec078c4ed973f2b98880b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
- "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/beecae161577305926ec078c4ed973f2b98880b3",
+ "reference": "beecae161577305926ec078c4ed973f2b98880b3",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/container": "^1.0"
+ "php": ">=7.2.5",
+ "psr/container": "^1.1.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22",
+ "symfony/service-contracts": "^1.1.6|^2"
},
"conflict": {
- "symfony/config": "<3.3.7",
- "symfony/finder": "<3.3",
- "symfony/proxy-manager-bridge": "<3.4",
- "symfony/yaml": "<3.4"
+ "ext-psr": "<1.1|>=2",
+ "symfony/config": "<5.3",
+ "symfony/finder": "<4.4",
+ "symfony/proxy-manager-bridge": "<4.4",
+ "symfony/yaml": "<4.4.26"
},
"provide": {
- "psr/container-implementation": "1.0"
+ "psr/container-implementation": "1.0",
+ "symfony/service-implementation": "1.0|2.0"
},
"require-dev": {
- "symfony/config": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/yaml": "~3.4|~4.0"
+ "symfony/config": "^5.3|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/yaml": "^4.4.26|^5.0|^6.0"
},
"suggest": {
"symfony/config": "",
@@ -2377,10 +2377,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony DependencyInjection Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/dependency-injection/tree/v5.4.9"
},
"funding": [
{
@@ -2396,27 +2396,96 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-27T06:40:03+00:00"
},
{
- "name": "symfony/dotenv",
- "version": "v3.4.47",
+ "name": "symfony/deprecation-contracts",
+ "version": "v2.5.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/dotenv.git",
- "reference": "1022723ac4f56b001d99691d96c6025dbf1404f1"
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dotenv/zipball/1022723ac4f56b001d99691d96c6025dbf1404f1",
- "reference": "1022723ac4f56b001d99691d96c6025dbf1404f1",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+ "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "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 generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1"
+ },
+ "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": "2022-01-02T09:53:40+00:00"
+ },
+ {
+ "name": "symfony/dotenv",
+ "version": "v5.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dotenv.git",
+ "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/83a2310904a4f5d4f42526227b5a578ac82232a9",
+ "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3"
},
"require-dev": {
- "symfony/process": "^3.4.2|^4.0"
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0"
},
"type": "library",
"autoload": {
@@ -2449,7 +2518,7 @@
"environment"
],
"support": {
- "source": "https://github.com/symfony/dotenv/tree/v3.4.47"
+ "source": "https://github.com/symfony/dotenv/tree/v5.4.5"
},
"funding": [
{
@@ -2465,35 +2534,115 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-02-15T17:04:12+00:00"
},
{
- "name": "symfony/event-dispatcher",
- "version": "v3.4.47",
+ "name": "symfony/error-handler",
+ "version": "v5.4.9",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "31fde73757b6bad247c54597beef974919ec6860"
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "c116cda1f51c678782768dce89a45f13c949455d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/31fde73757b6bad247c54597beef974919ec6860",
- "reference": "31fde73757b6bad247c54597beef974919ec6860",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d",
+ "reference": "c116cda1f51c678782768dce89a45f13c949455d",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
- },
- "conflict": {
- "symfony/dependency-injection": "<3.3"
+ "php": ">=7.2.5",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0|~4.0",
- "symfony/debug": "~3.4|~4.4",
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0"
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/serializer": "^4.4|^5.0|^6.0"
+ },
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "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 to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v5.4.9"
+ },
+ "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": "2022-05-21T13:57:48+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
+ "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/event-dispatcher-contracts": "^2|^3",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/dependency-injection": "",
@@ -2522,10 +2671,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony EventDispatcher Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9"
},
"funding": [
{
@@ -2541,25 +2690,106 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-05T16:45:39+00:00"
},
{
- "name": "symfony/filesystem",
- "version": "v3.4.47",
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v2.5.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3"
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e58d7841cddfed6e846829040dca2cca0ebbbbb3",
- "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
+ "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.2.5",
+ "psr/event-dispatcher": "^1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "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": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1"
+ },
+ "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": "2022-01-02T09:53:40+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba",
+ "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8",
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
"autoload": {
@@ -2584,10 +2814,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Filesystem Component",
+ "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v3.4.47"
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.9"
},
"funding": [
{
@@ -2603,24 +2833,26 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-20T13:55:35+00:00"
},
{
"name": "symfony/finder",
- "version": "v3.4.47",
+ "version": "v5.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e"
+ "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/b6b6ad3db3edb1b4b1c1896b1975fb684994de6e",
- "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9",
+ "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"type": "library",
"autoload": {
@@ -2645,10 +2877,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Finder Component",
+ "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v3.4.47"
+ "source": "https://github.com/symfony/finder/tree/v5.4.8"
},
"funding": [
{
@@ -2664,80 +2896,104 @@
"type": "tidelift"
}
],
- "time": "2020-11-16T17:02:08+00:00"
+ "time": "2022-04-15T08:07:45+00:00"
},
{
"name": "symfony/framework-bundle",
- "version": "v3.4.47",
+ "version": "v5.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/framework-bundle.git",
- "reference": "6c95e747b75ddd2af61152ce93bf87299d15710e"
+ "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6c95e747b75ddd2af61152ce93bf87299d15710e",
- "reference": "6c95e747b75ddd2af61152ce93bf87299d15710e",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1cb89cd3e36d5060545d0f223f00a774fa6430ef",
+ "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef",
"shasum": ""
},
"require": {
"ext-xml": "*",
- "php": "^5.5.9|>=7.0.8",
- "symfony/cache": "~3.4.31|^4.3.4",
- "symfony/class-loader": "~3.2",
- "symfony/config": "^3.4.31|^4.3.4",
- "symfony/debug": "~2.8|~3.0|~4.0",
- "symfony/dependency-injection": "^3.4.24|^4.2.5",
- "symfony/event-dispatcher": "~3.4|~4.0",
- "symfony/filesystem": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "^3.4.38|^4.3",
- "symfony/http-kernel": "^3.4.44|^4.3.4",
+ "php": ">=7.2.5",
+ "symfony/cache": "^5.2|^6.0",
+ "symfony/config": "^5.3|^6.0",
+ "symfony/dependency-injection": "^5.4.5|^6.0.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/error-handler": "^4.4.1|^5.0.1|^6.0",
+ "symfony/event-dispatcher": "^5.1|^6.0",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^5.3|^6.0",
+ "symfony/http-kernel": "^5.4|^6.0",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/routing": "^3.4.5|^4.0.5"
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22",
+ "symfony/routing": "^5.3|^6.0"
},
"conflict": {
- "phpdocumentor/reflection-docblock": "<3.0",
- "phpdocumentor/type-resolver": "<0.2.1",
- "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
- "symfony/asset": "<3.3",
- "symfony/console": "<3.4",
- "symfony/form": "<3.4",
- "symfony/property-info": "<3.3",
- "symfony/serializer": "<3.3",
- "symfony/stopwatch": "<3.4",
- "symfony/translation": "<3.4",
- "symfony/validator": "<3.4",
- "symfony/workflow": "<3.3"
+ "doctrine/annotations": "<1.13.1",
+ "doctrine/cache": "<1.11",
+ "doctrine/persistence": "<1.3",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/asset": "<5.3",
+ "symfony/console": "<5.2.5",
+ "symfony/dom-crawler": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/form": "<5.2",
+ "symfony/http-client": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/mailer": "<5.2",
+ "symfony/messenger": "<5.4",
+ "symfony/mime": "<4.4",
+ "symfony/property-access": "<5.3",
+ "symfony/property-info": "<4.4",
+ "symfony/security-csrf": "<5.3",
+ "symfony/serializer": "<5.2",
+ "symfony/service-contracts": ">=3.0",
+ "symfony/stopwatch": "<4.4",
+ "symfony/translation": "<5.3",
+ "symfony/twig-bridge": "<4.4",
+ "symfony/twig-bundle": "<4.4",
+ "symfony/validator": "<5.2",
+ "symfony/web-profiler-bundle": "<4.4",
+ "symfony/workflow": "<5.2"
},
"require-dev": {
- "doctrine/annotations": "~1.7",
- "doctrine/cache": "~1.0",
- "fig/link-util": "^1.0",
- "phpdocumentor/reflection-docblock": "^3.0|^4.0",
- "symfony/asset": "~3.3|~4.0",
- "symfony/browser-kit": "~2.8|~3.0|~4.0",
- "symfony/console": "~3.4.31|^4.3.4",
- "symfony/css-selector": "~2.8|~3.0|~4.0",
- "symfony/dom-crawler": "~2.8|~3.0|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/form": "^3.4.31|^4.3.4",
- "symfony/lock": "~3.4|~4.0",
+ "doctrine/annotations": "^1.13.1",
+ "doctrine/cache": "^1.11|^2.0",
+ "doctrine/persistence": "^1.3|^2|^3",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/asset": "^5.3|^6.0",
+ "symfony/browser-kit": "^5.4|^6.0",
+ "symfony/console": "^5.4.9|^6.0.9",
+ "symfony/css-selector": "^4.4|^5.0|^6.0",
+ "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0",
+ "symfony/dotenv": "^5.1|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/form": "^5.2|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/mailer": "^5.2|^6.0",
+ "symfony/messenger": "^5.4|^6.0",
+ "symfony/mime": "^4.4|^5.0|^6.0",
+ "symfony/notifier": "^5.4|^6.0",
"symfony/polyfill-intl-icu": "~1.0",
- "symfony/process": "~2.8|~3.0|~4.0",
- "symfony/property-info": "~3.3|~4.0",
- "symfony/security-core": "~3.2|~4.0",
- "symfony/security-csrf": "^2.8.31|^3.3.13|~4.0",
- "symfony/serializer": "~3.3|~4.0",
- "symfony/stopwatch": "~3.4|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/translation": "~3.4|~4.0",
- "symfony/validator": "~3.4|~4.0",
- "symfony/var-dumper": "~3.3|~4.0",
- "symfony/web-link": "~3.3|~4.0",
- "symfony/workflow": "~3.3|~4.0",
- "symfony/yaml": "~3.2|~4.0",
- "twig/twig": "~1.34|~2.4"
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/property-info": "^4.4|^5.0|^6.0",
+ "symfony/rate-limiter": "^5.2|^6.0",
+ "symfony/security-bundle": "^5.4|^6.0",
+ "symfony/serializer": "^5.4|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/string": "^5.0|^6.0",
+ "symfony/translation": "^5.3|^6.0",
+ "symfony/twig-bundle": "^4.4|^5.0|^6.0",
+ "symfony/validator": "^5.2|^6.0",
+ "symfony/web-link": "^4.4|^5.0|^6.0",
+ "symfony/workflow": "^5.2|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0",
+ "twig/twig": "^2.10|^3.0"
},
"suggest": {
"ext-apcu": "For best performance of the system caches",
@@ -2772,10 +3028,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony FrameworkBundle",
+ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/framework-bundle/tree/v3.4.47"
+ "source": "https://github.com/symfony/framework-bundle/tree/v5.4.9"
},
"funding": [
{
@@ -2791,29 +3047,36 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-27T06:29:07+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v3.4.47",
+ "version": "v5.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8"
+ "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b9885fcce6fe494201da4f70a9309770e9d13dc8",
- "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522",
+ "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.1",
- "symfony/polyfill-php70": "~1.6"
+ "symfony/polyfill-php80": "^1.16"
},
"require-dev": {
- "symfony/expression-language": "~2.8|~3.0|~4.0"
+ "predis/predis": "~1.0",
+ "symfony/cache": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/mime": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "symfony/mime": "To use the file extension guesser"
},
"type": "library",
"autoload": {
@@ -2838,10 +3101,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpFoundation Component",
+ "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v3.4.47"
+ "source": "https://github.com/symfony/http-foundation/tree/v5.4.9"
},
"funding": [
{
@@ -2857,65 +3120,75 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-17T15:07:29+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v3.4.49",
+ "version": "v5.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "5aa72405f5bd5583c36ed6e756acb17d3f98ac40"
+ "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5aa72405f5bd5583c36ed6e756acb17d3f98ac40",
- "reference": "5aa72405f5bd5583c36ed6e756acb17d3f98ac40",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8",
+ "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/log": "~1.0",
- "symfony/debug": "^3.3.3|~4.0",
- "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-php56": "~1.8"
+ "php": ">=7.2.5",
+ "psr/log": "^1|^2",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^5.0|^6.0",
+ "symfony/http-foundation": "^5.3.7|^6.0",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16"
},
"conflict": {
- "symfony/config": "<2.8",
- "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4",
- "symfony/var-dumper": "<3.3",
- "twig/twig": "<1.34|<2.4,>=2"
+ "symfony/browser-kit": "<5.4",
+ "symfony/cache": "<5.0",
+ "symfony/config": "<5.0",
+ "symfony/console": "<4.4",
+ "symfony/dependency-injection": "<5.3",
+ "symfony/doctrine-bridge": "<5.0",
+ "symfony/form": "<5.0",
+ "symfony/http-client": "<5.0",
+ "symfony/mailer": "<5.0",
+ "symfony/messenger": "<5.0",
+ "symfony/translation": "<5.0",
+ "symfony/twig-bridge": "<5.0",
+ "symfony/validator": "<5.0",
+ "twig/twig": "<2.13"
},
"provide": {
- "psr/log-implementation": "1.0"
+ "psr/log-implementation": "1.0|2.0"
},
"require-dev": {
- "psr/cache": "~1.0",
- "symfony/browser-kit": "~2.8|~3.0|~4.0",
- "symfony/class-loader": "~2.8|~3.0",
- "symfony/config": "~2.8|~3.0|~4.0",
- "symfony/console": "~2.8|~3.0|~4.0",
- "symfony/css-selector": "~2.8|~3.0|~4.0",
- "symfony/dependency-injection": "^3.4.10|^4.0.10",
- "symfony/dom-crawler": "~2.8|~3.0|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/process": "~2.8|~3.0|~4.0",
- "symfony/routing": "~3.4|~4.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/translation": "~2.8|~3.0|~4.0",
- "symfony/var-dumper": "~3.3|~4.0"
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^5.4|^6.0",
+ "symfony/config": "^5.0|^6.0",
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/css-selector": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^5.3|^6.0",
+ "symfony/dom-crawler": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/http-client-contracts": "^1.1|^2|^3",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/translation": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2|^3",
+ "twig/twig": "^2.13|^3.0.4"
},
"suggest": {
"symfony/browser-kit": "",
"symfony/config": "",
"symfony/console": "",
- "symfony/dependency-injection": "",
- "symfony/finder": "",
- "symfony/var-dumper": ""
+ "symfony/dependency-injection": ""
},
"type": "library",
"autoload": {
@@ -2940,10 +3213,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpKernel Component",
+ "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v3.4.49"
+ "source": "https://github.com/symfony/http-kernel/tree/v5.4.9"
},
"funding": [
{
@@ -2959,29 +3232,35 @@
"type": "tidelift"
}
],
- "time": "2021-05-19T12:06:59+00:00"
+ "time": "2022-05-27T07:09:08+00:00"
},
{
- "name": "symfony/polyfill-apcu",
- "version": "v1.19.0",
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.26.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-apcu.git",
- "reference": "b44b51e7814c23bfbd793a16ead5d7ce43ed23c5"
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/b44b51e7814c23bfbd793a16ead5d7ce43ed23c5",
- "reference": "b44b51e7814c23bfbd793a16ead5d7ce43ed23c5",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.19-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -2992,89 +3271,9 @@
"files": [
"bootstrap.php"
],
- "psr-4": {
- "Symfony\\Polyfill\\Apcu\\": ""
- }
- },
- "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 apcu_* functions to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "apcu",
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-apcu/tree/v1.19.0"
- },
- "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": "2020-10-21T09:57:48+00:00"
- },
- {
- "name": "symfony/polyfill-ctype",
- "version": "v1.19.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/aed596913b70fae57be53d86faa2e9ef85a2297b",
- "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3099,7 +3298,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
},
"funding": [
{
@@ -3115,7 +3314,88 @@
"type": "tidelift"
}
],
- "time": "2020-10-23T09:01:57+00:00"
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/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.26.0"
+ },
+ "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": "2022-05-24T11:49:31+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
@@ -3290,20 +3570,23 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.19.0",
+ "version": "v1.26.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce"
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce",
- "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
},
"suggest": {
"ext-mbstring": "For best performance"
@@ -3311,7 +3594,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.19-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -3319,12 +3602,12 @@
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
"files": [
"bootstrap.php"
- ]
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3350,7 +3633,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
},
"funding": [
{
@@ -3366,164 +3649,7 @@
"type": "tidelift"
}
],
- "time": "2020-10-23T09:01:57+00:00"
- },
- {
- "name": "symfony/polyfill-php56",
- "version": "v1.19.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "ea19621731cbd973a6702cfedef3419768bf3372"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/ea19621731cbd973a6702cfedef3419768bf3372",
- "reference": "ea19621731cbd973a6702cfedef3419768bf3372",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3",
- "symfony/polyfill-util": "~1.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php56\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
- },
- "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 5.6+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-php56/tree/v1.19.0"
- },
- "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": "2020-10-23T09:01:57+00:00"
- },
- {
- "name": "symfony/polyfill-php70",
- "version": "v1.19.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php70.git",
- "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3fe414077251a81a1b15b1c709faf5c2fbae3d4e",
- "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e",
- "shasum": ""
- },
- "require": {
- "paragonie/random_compat": "~1.0|~2.0|~9.99",
- "php": ">=5.3.3"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php70\\": ""
- },
- "files": [
- "bootstrap.php"
- ],
- "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 7.0+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-php70/tree/v1.19.0"
- },
- "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": "2020-10-23T09:01:57+00:00"
+ "time": "2022-05-24T11:49:31+00:00"
},
{
"name": "symfony/polyfill-php72",
@@ -3602,26 +3728,26 @@
"time": "2022-05-24T11:49:31+00:00"
},
{
- "name": "symfony/polyfill-util",
- "version": "v1.19.0",
+ "name": "symfony/polyfill-php73",
+ "version": "v1.26.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-util.git",
- "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a"
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a",
- "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85",
+ "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.19-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -3629,9 +3755,15 @@
}
},
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Symfony\\Polyfill\\Util\\": ""
- }
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3647,16 +3779,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony utilities for portability of PHP codes",
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
- "compat",
"compatibility",
"polyfill",
+ "portable",
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-util/tree/v1.19.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0"
},
"funding": [
{
@@ -3672,41 +3804,205 @@
"type": "tidelift"
}
],
- "time": "2020-10-21T09:57:48+00:00"
+ "time": "2022-05-24T11:49:31+00:00"
},
{
- "name": "symfony/routing",
- "version": "v3.4.47",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.26.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/routing.git",
- "reference": "3e522ac69cadffd8131cc2b22157fa7662331a6c"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/3e522ac69cadffd8131cc2b22157fa7662331a6c",
- "reference": "3e522ac69cadffd8131cc2b22157fa7662331a6c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/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.26.0"
+ },
+ "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": "2022-05-10T07:21:04+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+ "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "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.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0"
+ },
+ "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": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v5.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
+ "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"conflict": {
- "symfony/config": "<3.3.1",
- "symfony/dependency-injection": "<3.3",
- "symfony/yaml": "<3.4"
+ "doctrine/annotations": "<1.12",
+ "symfony/config": "<5.3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/yaml": "<4.4"
},
"require-dev": {
- "doctrine/annotations": "~1.0",
- "psr/log": "~1.0",
- "symfony/config": "^3.3.1|~4.0",
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "~2.8|~3.0|~4.0",
- "symfony/yaml": "~3.4|~4.0"
+ "doctrine/annotations": "^1.12",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.3|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
- "doctrine/annotations": "For using the annotation loader",
"symfony/config": "For using the all-in-one router or any loader",
"symfony/expression-language": "For using expression matching",
"symfony/http-foundation": "For using a Symfony Request object",
@@ -3735,7 +4031,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Routing Component",
+ "description": "Maps an HTTP request to a set of configuration variables",
"homepage": "https://symfony.com",
"keywords": [
"router",
@@ -3744,7 +4040,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v3.4.47"
+ "source": "https://github.com/symfony/routing/tree/v5.4.8"
},
"funding": [
{
@@ -3760,51 +4056,315 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-04-18T21:45:37+00:00"
},
{
- "name": "symfony/twig-bridge",
- "version": "v3.4.47",
+ "name": "symfony/service-contracts",
+ "version": "v2.5.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/twig-bridge.git",
- "reference": "090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042"
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042",
- "reference": "090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
+ "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "twig/twig": "^1.41|^2.10"
+ "php": ">=7.2.5",
+ "psr/container": "^1.1",
+ "symfony/deprecation-contracts": "^2.1|^3"
},
"conflict": {
- "symfony/console": "<3.4",
- "symfony/form": "<3.4.31|>=4.0,<4.3.4"
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "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": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v2.5.1"
+ },
+ "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": "2022-03-13T20:07:29+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
+ "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "conflict": {
+ "symfony/translation-contracts": ">=3.0"
},
"require-dev": {
- "fig/link-util": "^1.0",
- "symfony/asset": "~2.8|~3.0|~4.0",
- "symfony/console": "~3.4|~4.0",
- "symfony/dependency-injection": "~2.8|~3.0|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/form": "^3.4.31|^4.3.4",
- "symfony/http-foundation": "^3.3.11|~4.0",
- "symfony/http-kernel": "~3.2|~4.0",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0|^6.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/v5.4.9"
+ },
+ "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": "2022-04-19T10:40:37+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v2.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "1211df0afa701e45a04253110e959d4af4ef0f07"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07",
+ "reference": "1211df0afa701e45a04253110e959d4af4ef0f07",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ }
+ },
+ "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": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v2.5.1"
+ },
+ "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": "2022-01-02T09:53:40+00:00"
+ },
+ {
+ "name": "symfony/twig-bridge",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/twig-bridge.git",
+ "reference": "fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf",
+ "reference": "fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/translation-contracts": "^1.1|^2|^3",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/console": "<5.3",
+ "symfony/form": "<5.3",
+ "symfony/http-foundation": "<5.3",
+ "symfony/http-kernel": "<4.4",
+ "symfony/translation": "<5.2",
+ "symfony/workflow": "<5.2"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.12",
+ "egulias/email-validator": "^2.1.10|^3",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/asset": "^4.4|^5.0|^6.0",
+ "symfony/console": "^5.3|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/form": "^5.3|^6.0",
+ "symfony/http-foundation": "^5.3|^6.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/intl": "^4.4|^5.0|^6.0",
+ "symfony/mime": "^5.2|^6.0",
"symfony/polyfill-intl-icu": "~1.0",
- "symfony/routing": "~2.8|~3.0|~4.0",
- "symfony/security": "^2.8.31|^3.3.13|~4.0",
- "symfony/security-acl": "~2.8|~3.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/translation": "~2.8|~3.0|~4.0",
- "symfony/var-dumper": "~2.8.10|~3.1.4|~3.2|~4.0",
- "symfony/web-link": "~3.3|~4.0",
- "symfony/workflow": "~3.3|~4.0",
- "symfony/yaml": "~2.8|~3.0|~4.0"
+ "symfony/property-info": "^4.4|^5.1|^6.0",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/security-acl": "^2.8|^3.0",
+ "symfony/security-core": "^4.4|^5.0|^6.0",
+ "symfony/security-csrf": "^4.4|^5.0|^6.0",
+ "symfony/security-http": "^4.4|^5.0|^6.0",
+ "symfony/serializer": "^5.2|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/translation": "^5.2|^6.0",
+ "symfony/web-link": "^4.4|^5.0|^6.0",
+ "symfony/workflow": "^5.2|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0",
+ "twig/cssinliner-extra": "^2.12|^3",
+ "twig/inky-extra": "^2.12|^3",
+ "twig/markdown-extra": "^2.12|^3"
},
"suggest": {
"symfony/asset": "For using the AssetExtension",
@@ -3813,9 +4373,10 @@
"symfony/form": "For using the FormExtension",
"symfony/http-kernel": "For using the HttpKernelExtension",
"symfony/routing": "For using the RoutingExtension",
- "symfony/security": "For using the SecurityExtension",
+ "symfony/security-core": "For using the SecurityExtension",
+ "symfony/security-csrf": "For using the CsrfExtension",
+ "symfony/security-http": "For using the LogoutUrlExtension",
"symfony/stopwatch": "For using the StopwatchExtension",
- "symfony/templating": "For using the TwigEngine",
"symfony/translation": "For using the TranslationExtension",
"symfony/var-dumper": "For using the DumpExtension",
"symfony/web-link": "For using the WebLinkExtension",
@@ -3844,10 +4405,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Twig Bridge",
+ "description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/twig-bridge/tree/v3.4.47"
+ "source": "https://github.com/symfony/twig-bridge/tree/v5.4.9"
},
"funding": [
{
@@ -3863,50 +4424,52 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-05-21T10:24:18+00:00"
},
{
"name": "symfony/twig-bundle",
- "version": "v3.4.47",
+ "version": "v5.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bundle.git",
- "reference": "977b3096e2df96bc8a8d2329e83466cfc30c373d"
+ "reference": "c992b4474c3a31f3c40a1ca593d213833f91b818"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/977b3096e2df96bc8a8d2329e83466cfc30c373d",
- "reference": "977b3096e2df96bc8a8d2329e83466cfc30c373d",
+ "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/c992b4474c3a31f3c40a1ca593d213833f91b818",
+ "reference": "c992b4474c3a31f3c40a1ca593d213833f91b818",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/config": "~3.2|~4.0",
- "symfony/debug": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "~2.8|~3.0|~4.0",
- "symfony/http-kernel": "^3.3|~4.0",
+ "php": ">=7.2.5",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/http-kernel": "^5.0|^6.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/twig-bridge": "^3.4.3|^4.0.3",
- "twig/twig": "~1.41|~2.10"
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/twig-bridge": "^5.3|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
},
"conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/event-dispatcher": "<3.3.1"
+ "symfony/dependency-injection": "<5.3",
+ "symfony/framework-bundle": "<5.0",
+ "symfony/service-contracts": ">=3.0",
+ "symfony/translation": "<5.0"
},
"require-dev": {
- "doctrine/annotations": "~1.7",
- "doctrine/cache": "~1.0",
- "symfony/asset": "~2.8|~3.0|~4.0",
- "symfony/dependency-injection": "~3.4.24|^4.2.5",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/form": "~2.8|~3.0|~4.0",
- "symfony/framework-bundle": "^3.3.11|~4.0",
- "symfony/routing": "~2.8|~3.0|~4.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/web-link": "~3.3|~4.0",
- "symfony/yaml": "~2.8|~3.0|~4.0"
+ "doctrine/annotations": "^1.10.4",
+ "doctrine/cache": "^1.0|^2.0",
+ "symfony/asset": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^5.3|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/form": "^4.4|^5.0|^6.0",
+ "symfony/framework-bundle": "^5.0|^6.0",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/translation": "^5.0|^6.0",
+ "symfony/web-link": "^4.4|^5.0|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
},
"type": "symfony-bundle",
"autoload": {
@@ -3931,10 +4494,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony TwigBundle",
+ "description": "Provides a tight integration of Twig into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/twig-bundle/tree/v3.4.47"
+ "source": "https://github.com/symfony/twig-bundle/tree/v5.4.8"
},
"funding": [
{
@@ -3950,35 +4513,201 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-04-03T13:03:10+00:00"
},
{
- "name": "symfony/yaml",
- "version": "v3.4.47",
+ "name": "symfony/var-dumper",
+ "version": "v5.4.9",
"source": {
"type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "88289caa3c166321883f67fe5130188ebbb47094"
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "af52239a330fafd192c773795520dc2dd62b5657"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094",
- "reference": "88289caa3c166321883f67fe5130188ebbb47094",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657",
+ "reference": "af52239a330fafd192c773795520dc2dd62b5657",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.16"
},
"conflict": {
- "symfony/console": "<3.4"
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/console": "<4.4"
},
"require-dev": {
- "symfony/console": "~3.4|~4.0"
+ "ext-iconv": "*",
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/uid": "^5.1|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "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/v5.4.9"
+ },
+ "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": "2022-05-21T10:24:18+00:00"
+ },
+ {
+ "name": "symfony/var-exporter",
+ "version": "v5.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/63249ebfca4e75a357679fa7ba2089cfb898aa67",
+ "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "symfony/var-dumper": "^4.4.9|^5.0.9|^6.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",
+ "serialize"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-exporter/tree/v5.4.9"
+ },
+ "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": "2022-05-21T10:24:18+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v5.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<5.3"
+ },
+ "require-dev": {
+ "symfony/console": "^5.3|^6.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
},
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
"type": "library",
"autoload": {
"psr-4": {
@@ -4002,10 +4731,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Yaml Component",
+ "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v3.4.47"
+ "source": "https://github.com/symfony/yaml/tree/v5.4.3"
},
"funding": [
{
@@ -4021,7 +4750,7 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-01-26T16:32:32+00:00"
},
{
"name": "thenetworg/oauth2-azure",
@@ -4130,36 +4859,34 @@
},
{
"name": "twig/twig",
- "version": "v1.42.5",
+ "version": "v3.4.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e"
+ "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
- "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/e939eae92386b69b49cfa4599dd9bead6bf4a342",
+ "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342",
"shasum": ""
},
"require": {
- "php": ">=5.5.0",
- "symfony/polyfill-ctype": "^1.8"
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-mbstring": "^1.3"
},
"require-dev": {
"psr/container": "^1.0",
- "symfony/phpunit-bridge": "^4.4|^5.0"
+ "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.42-dev"
+ "dev-master": "3.4-dev"
}
},
"autoload": {
- "psr-0": {
- "Twig_": "lib/"
- },
"psr-4": {
"Twig\\": "src/"
}
@@ -4192,28 +4919,39 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/1.x"
+ "source": "https://github.com/twigphp/Twig/tree/v3.4.1"
},
- "time": "2020-02-11T05:59:23+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-17T05:48:52+00:00"
}
],
"packages-dev": [
{
"name": "symfony/stopwatch",
- "version": "v3.4.47",
+ "version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462"
+ "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/298b81faad4ce60e94466226b2abbb8c9bca7462",
- "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30",
+ "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/service-contracts": "^1|^2|^3"
},
"type": "library",
"autoload": {
@@ -4238,10 +4976,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Stopwatch Component",
+ "description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v3.4.47"
+ "source": "https://github.com/symfony/stopwatch/tree/v5.4.5"
},
"funding": [
{
@@ -4257,125 +4995,43 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
- },
- {
- "name": "symfony/var-dumper",
- "version": "v3.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/var-dumper.git",
- "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0719f6cf4633a38b2c1585140998579ce23b4b7d",
- "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "conflict": {
- "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
- },
- "require-dev": {
- "ext-iconv": "*",
- "twig/twig": "~1.34|~2.4"
- },
- "suggest": {
- "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
- "ext-intl": "To show region name in time zone dump",
- "ext-symfony_debug": ""
- },
- "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": "Symfony mechanism for exploring and dumping PHP variables",
- "homepage": "https://symfony.com",
- "keywords": [
- "debug",
- "dump"
- ],
- "support": {
- "source": "https://github.com/symfony/var-dumper/tree/v3.4.47"
- },
- "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": "2020-10-24T10:57:07+00:00"
+ "time": "2022-02-18T16:06:09+00:00"
},
{
"name": "symfony/web-profiler-bundle",
- "version": "v3.4.47",
+ "version": "v5.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/web-profiler-bundle.git",
- "reference": "ccb83b3a508f4a683e44f571f127beebdc315ff9"
+ "reference": "909c6eea7815066a80d0a362ed41abd7924e376a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ccb83b3a508f4a683e44f571f127beebdc315ff9",
- "reference": "ccb83b3a508f4a683e44f571f127beebdc315ff9",
+ "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/909c6eea7815066a80d0a362ed41abd7924e376a",
+ "reference": "909c6eea7815066a80d0a362ed41abd7924e376a",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/config": "~3.4|~4.0",
- "symfony/http-kernel": "~3.4.25|^4.2.6",
- "symfony/polyfill-php70": "~1.0",
- "symfony/routing": "~3.4.7|~4.0",
- "symfony/twig-bundle": "~3.4|~4.0",
- "symfony/var-dumper": "~3.3|~4.0",
- "twig/twig": "~1.34|~2.4"
+ "php": ">=7.2.5",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/framework-bundle": "^5.3|^6.0",
+ "symfony/http-kernel": "^5.3|^6.0",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/twig-bundle": "^4.4|^5.0|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
},
"conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/event-dispatcher": "<3.3.1",
- "symfony/framework-bundle": ">4.3.99",
- "symfony/var-dumper": "<3.3"
+ "symfony/dependency-injection": "<5.2",
+ "symfony/form": "<4.4",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<4.4"
},
"require-dev": {
- "symfony/browser-kit": "~3.4|~4.0",
- "symfony/console": "~3.4|~4.0",
- "symfony/css-selector": "~3.4|~4.0",
- "symfony/framework-bundle": "~3.4|~4.0",
- "symfony/stopwatch": "~3.4|~4.0"
+ "symfony/browser-kit": "^4.4|^5.0|^6.0",
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/css-selector": "^4.4|^5.0|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0"
},
"type": "symfony-bundle",
"autoload": {
@@ -4400,10 +5056,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony WebProfilerBundle",
+ "description": "Provides a development tool that gives detailed information about the execution of any request",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/web-profiler-bundle/tree/v3.4.47"
+ "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.8"
},
"funding": [
{
@@ -4419,7 +5075,7 @@
"type": "tidelift"
}
],
- "time": "2020-10-24T10:57:07+00:00"
+ "time": "2022-04-22T08:14:12+00:00"
}
],
"aliases": [],
@@ -4428,7 +5084,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
- "php": ">=7.1.3 <8.0.0",
+ "php": ">=7.2.5 <8.0.0",
"ext-ctype": "*",
"ext-dom": "*",
"ext-gd": "*",
@@ -4439,7 +5095,7 @@
},
"platform-dev": [],
"platform-overrides": {
- "php": "7.1.3"
+ "php": "7.2.5"
},
- "plugin-api-version": "2.1.0"
+ "plugin-api-version": "2.3.0"
}
diff --git a/core/cmdbobject.class.inc.php b/core/cmdbobject.class.inc.php
index 44a22c865..6d3cac992 100644
--- a/core/cmdbobject.class.inc.php
+++ b/core/cmdbobject.class.inc.php
@@ -614,7 +614,9 @@ abstract class CMDBObject extends DBObject
{
return $this->DBCloneTracked_Internal();
}
-
+ /*
+ * @deprecated 3.1.0 not used N°5232
+ */
public function DBCloneTracked(CMDBChange $oChange, $newKey = null)
{
self::SetCurrentChange($oChange);
diff --git a/core/config.class.inc.php b/core/config.class.inc.php
index 3b1caf24d..405997818 100644
--- a/core/config.class.inc.php
+++ b/core/config.class.inc.php
@@ -592,46 +592,6 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
- 'email_transport_smtp.oauth.provider' => [
- 'type' => 'string',
- 'description' => 'Email OAuth provider',
- 'default' => '',
- 'value' => '',
- 'source_of_value' => '',
- 'show_in_conf_sample' => false,
- ],
- 'email_transport_smtp.oauth.client_id' => [
- 'type' => 'string',
- 'description' => 'Email OAuth client id',
- 'default' => '',
- 'value' => '',
- 'source_of_value' => '',
- 'show_in_conf_sample' => false,
- ],
- 'email_transport_smtp.oauth.client_secret' => [
- 'type' => 'string',
- 'description' => 'Email OAuth client secret',
- 'default' => '',
- 'value' => '',
- 'source_of_value' => '',
- 'show_in_conf_sample' => false,
- ],
- 'email_transport_smtp.oauth.access_token' => [
- 'type' => 'string',
- 'description' => 'Email OAuth access token',
- 'default' => '',
- 'value' => '',
- 'source_of_value' => '',
- 'show_in_conf_sample' => false,
- ],
- 'email_transport_smtp.oauth.refresh_token' => [
- 'type' => 'string',
- 'description' => 'Email OAuth refresh token',
- 'default' => '',
- 'value' => '',
- 'source_of_value' => '',
- 'show_in_conf_sample' => false,
- ],
'email_css' => [
'type' => 'string',
'description' => 'CSS that will override the standard stylesheet used for the notifications',
diff --git a/core/ormcaselog.class.inc.php b/core/ormcaselog.class.inc.php
index 2d024fa31..950ff0627 100644
--- a/core/ormcaselog.class.inc.php
+++ b/core/ormcaselog.class.inc.php
@@ -155,7 +155,7 @@ class ormCaseLog {
break;
case static::ENUM_FORMAT_HTML:
- $sHtmlEntry = $sTextEntry;
+ $sHtmlEntry = InlineImage::FixUrls($sTextEntry);
$sTextEntry = utils::HtmlToText($sHtmlEntry);
break;
}
@@ -723,7 +723,7 @@ class ormCaseLog {
}
else
{
- $sRes = $sRaw;
+ $sRes = InlineImage::FixUrls($sRaw);
}
break;
}
@@ -758,6 +758,6 @@ class ormCaseLog {
}
$iPos += $this->m_aIndex[$index]['separator_length'];
$sText = substr($this->m_sLog, $iPos, $this->m_aIndex[$index]['text_length']);
- return $sText;
+ return InlineImage::FixUrls($sText);
}
}
diff --git a/core/ormstopwatch.class.inc.php b/core/ormstopwatch.class.inc.php
index 7bcd5f3d9..b4dddbb91 100644
--- a/core/ormstopwatch.class.inc.php
+++ b/core/ormstopwatch.class.inc.php
@@ -596,10 +596,9 @@ class CheckStopWatchThresholds implements iBackgroundProcess
$oSW = $oObj->Get($sAttCode);
$oSW->MarkThresholdAsTriggered($iThreshold);
$oObj->Set($sAttCode, $oSW);
-
- if($oObj->IsModified())
- {
- CMDBObject::SetTrackInfo("Automatic - threshold triggered");
+
+ if ($oObj->IsModified()) {
+ CMDBObject::SetCurrentChangeFromParams("Automatic - threshold triggered");
$oObj->DBUpdate();
}
diff --git a/css/backoffice/components/_field.scss b/css/backoffice/components/_field.scss
index f6993b06d..f86e7db85 100644
--- a/css/backoffice/components/_field.scss
+++ b/css/backoffice/components/_field.scss
@@ -94,14 +94,13 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default;
max-width: 145px;
width: 30%;
}
-
.ibo-field--value {
margin-top: $ibo-field--value--margin-top--for-large; /* Mostly used to have a clear separation from elements in .ibo-field--comments */
}
/* N°4318 - Visible scrollbar background for large fields overflowing to ease "limits" visualization by the user */
.ibo-field--value > * {
- --ibo-scrollbar--scrollbar-track-background-color: $ibo-field--value--scrollbar-track-background-color;
+ --ibo-scrollbar--scrollbar-track-background-color: #{$ibo-field--value--scrollbar-track-background-color};
}
/* Fullscreen mode */
diff --git a/css/backoffice/components/_panel.scss b/css/backoffice/components/_panel.scss
index c4afc19a6..92331faa5 100644
--- a/css/backoffice/components/_panel.scss
+++ b/css/backoffice/components/_panel.scss
@@ -89,7 +89,7 @@ $ibo-panel--collapsible-toggler--color: $ibo-color-grey-700 !default;
.ibo-panel {
- --ibo-main-color: map-get($ibo-panel-colors, 'neutral'); /* --ibo-main-color is to allow overload from custom dynamic value from the DM. The overload will be done through an additional CSS class of a particular DM class or DM attribute */
+ --ibo-main-color: #{map-get($ibo-panel-colors, 'neutral')}; /* --ibo-main-color is to allow overload from custom dynamic value from the DM. The overload will be done through an additional CSS class of a particular DM class or DM attribute */
position: relative;
diff --git a/css/backoffice/components/_pill.scss b/css/backoffice/components/_pill.scss
index d45236c5c..71481bc63 100644
--- a/css/backoffice/components/_pill.scss
+++ b/css/backoffice/components/_pill.scss
@@ -79,8 +79,8 @@ $ibo-pill-states-colors: (
/* Rules */
.ibo-pill {
/* --ibo-main-color-xxx is to allow overload from custom dynamic value from the DM. The overload will be done through an additional CSS class of a particular DM class or DM attribute */
- --ibo-main-color--100: map-get(map-get($ibo-pill-states-colors, 'neutral'), 'primary-color');
- --ibo-main-color--900: map-get(map-get($ibo-pill-states-colors, 'neutral'), 'secondary-color');
+ --ibo-main-color--100: #{map-get(map-get($ibo-pill-states-colors, 'neutral'), 'primary-color')};
+ --ibo-main-color--900: #{map-get(map-get($ibo-pill-states-colors, 'neutral'), 'secondary-color')};
@extend %ibo-fully-centered-content;
max-width: $ibo-pill--max-width;
diff --git a/css/backoffice/components/_quick-create.scss b/css/backoffice/components/_quick-create.scss
index 80c81643a..17534e8e2 100644
--- a/css/backoffice/components/_quick-create.scss
+++ b/css/backoffice/components/_quick-create.scss
@@ -235,7 +235,7 @@ $ibo-quick-create--compartment--placeholder-hint--text-color: $ibo-color-grey-70
}
&:hover{
cursor: pointer;
- @extend a:hover;
+ @extend a;
}
.highlight{
diff --git a/css/backoffice/pages/_all.scss b/css/backoffice/pages/_all.scss
index d911ff390..3e6b6b39a 100644
--- a/css/backoffice/pages/_all.scss
+++ b/css/backoffice/pages/_all.scss
@@ -14,4 +14,5 @@
@import "csv-import";
@import "global-search";
@import "run-query";
-@import "welcome-popup";
\ No newline at end of file
+@import "welcome-popup";
+@import "oauth.wizard";
\ No newline at end of file
diff --git a/css/backoffice/pages/_oauth.wizard.scss b/css/backoffice/pages/_oauth.wizard.scss
new file mode 100644
index 000000000..04fb33089
--- /dev/null
+++ b/css/backoffice/pages/_oauth.wizard.scss
@@ -0,0 +1,16 @@
+.ibo-oauth-wizard .ibo-panel--body{
+ .ibo-oauth-wizard--form--container{
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ }
+ .ibo-oauth-wizard--form {
+
+ }
+ .ibo-oauth-wizard--illustration svg{
+ max-height: 400px;
+ }
+}
+#ibo-oauth-wizard--conf--result{
+ white-space: pre-wrap
+}
diff --git a/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php b/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php
index b105e4029..b8b81e265 100644
--- a/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php
+++ b/datamodels/2.x/authent-local/dictionaries/zh_cn.dict.authent-local.php
@@ -40,20 +40,20 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:UserLocal/Attribute:password+' => 'ēØäŗéŖčÆēØę·čŗ«ä»½ēå符串',
'Class:UserLocal/Attribute:expiration' => 'åÆē čæę',
- 'Class:UserLocal/Attribute:expiration+' => 'åÆē čæęē¶ę (éč¦äøäøŖę©å±ęč½ēę)',
+ 'Class:UserLocal/Attribute:expiration+' => 'åÆē čæęē¶ę(éč¦äøäøŖę©å±ęč½ēę)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'å
许čæę',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'ę°øäøčæę',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'å·²čæę',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
- 'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'One-time Password~~',
- 'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
+ 'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'äøę¬”ę§åÆē ',
+ 'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'ēØę·äøå
许修ę¹åÆē .',
'Class:UserLocal/Attribute:password_renewed_date' => 'åÆē ę“ę°',
'Class:UserLocal/Attribute:password_renewed_date+' => 'äøę¬”äæ®ę¹åÆē ēę¶é“',
- 'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'åÆē åæ
é”»č³å°8 äøŖå符,å
å«å¤§å°åćę°ååē¹ę®å符.',
+ 'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'åÆē åæ
é”»č³å°8äøŖå符,å
å«å¤§å°å,ę°ååē¹ę®å符.',
'UserLocal:password:expiration' => 'äøé¢ēåŗåéč¦ęä»¶ę©å±',
- 'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
+ 'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'äøå
许ēØę·äøŗčŖå·±č®¾ē½®"äøę¬”ę§åÆē "ē失ęęé',
));
diff --git a/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss b/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss
index a8b2e550b..690d3af8b 100644
--- a/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss
+++ b/datamodels/2.x/combodo-backoffice-darkmoon-theme/scss/scss-variables.scss
@@ -202,7 +202,7 @@ $ibo-tab-container--tab-header--text-color: $ibo-color-grey-50;
$ibo-vendors-datatables--row-highlight--colors:('red': ($ibo-color-red-700),'danger': ($ibo-color-red-700),'alert': ($ibo-color-red-700),'orange': ($ibo-color-orange-700),'warning': (#d08770),'blue': (#5e81ac),'info': (#5e81ac),);
-$ibo-vendors-jqueryui--ui-dialog--background-color: $ibo-color-grey-800;jquer
+$ibo-vendors-jqueryui--ui-dialog--background-color: $ibo-color-grey-800;
$ibo-vendors-jqueryui--ui-dialog-titlebar--border-bottom: solid 1px $ibo-color-grey-500;
@@ -231,13 +231,16 @@ $ibo-keyboard-shortcut--input--background-color: $ibo-input--background-color;
$ibo-keyboard-shortcut--input--color: $ibo-input--color;
-$ibo-button-colors: ('regular': ('neutral': ('': ($ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-300, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), /* Primary action does not have the colors from the primary brand color, at least not for now */ 'primary': ( '': ( $ibo-color-primary-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':hover': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':active': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-primary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-600, $ibo-color-primary-800, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'secondary': ( '': ( $ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-200, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'danger': ( '': ( $ibo-color-danger-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':hover': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':active': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-danger-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-600, $ibo-color-danger-700, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'success': ( '': ( $ibo-color-success-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':hover': ( $ibo-color-success-800, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':active': ($ibo-color-success-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-success-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-800,$ibo-color-success-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), /* Colors */ 'red': ( '': ($ibo-color-red-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':hover': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':active': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-red-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-600,$ibo-color-red-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'green': ( '': ($ibo-color-green-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':hover': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':active': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-green-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-800,$ibo-color-green-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'cyan': ( '': ($ibo-color-cyan-500,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':hover': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':active': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-cyan-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-700,$ibo-color-cyan-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ) ), 'alternative': ( /* Semantics */ 'neutral': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-top $ibo-color-secondary-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), /* Primary action does not have the colors from the primary brand color, at least not for now */ 'primary': ( '': (transparent,$ibo-color-primary-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-700, ), ':hover': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':active': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-top $ibo-color-primary-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'secondary': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-top $ibo-color-secondary-200 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'danger': ( '': (transparent,$ibo-color-danger-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-danger-600, ), ':hover': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':active': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-top $ibo-color-danger-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'success': ( '': (transparent,$ibo-color-success-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-success-800, ), ':hover': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':active': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-top $ibo-color-success-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), /* Colors */ 'red': ( '': (transparent,$ibo-color-red-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-red-600, ), ':hover': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':active': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-top $ibo-color-red-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'green': ( '': (transparent,$ibo-color-green-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-green-800, ), ':hover': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':active': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-top $ibo-color-green-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'cyan': ( '': (transparent,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-800, ), ':hover': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':active': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-top $ibo-color-cyan-800 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), ));
+$ibo-button-colors: ('regular': ('neutral': ('': ($ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-300, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'primary': ( '': ( $ibo-color-primary-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':hover': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-primary-400, $ibo-color-primary-300, ), ':active': ( $ibo-color-primary-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-primary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-600, $ibo-color-primary-800, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'secondary': ( '': ( $ibo-color-secondary-600, $ibo-color-grey-200, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':hover': ( $ibo-color-secondary-500, $ibo-color-grey-100, $ibo-button--box-shadow-bottom $ibo-color-secondary-400, $ibo-color-secondary-300, ), ':active': ( $ibo-color-secondary-500, $ibo-color-grey-200, $ibo-button--box-shadow-top $ibo-color-secondary-400 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-500, $ibo-color-secondary-200, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'danger': ( '': ( $ibo-color-danger-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':hover': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-danger-500, $ibo-color-danger-700, ), ':active': ( $ibo-color-danger-600, $ibo-color-white-100, $ibo-button--box-shadow-top $ibo-color-danger-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-600, $ibo-color-danger-700, ), ':disabled': ( $ibo-color-grey-300, $ibo-color-grey-700, $ibo-button--box-shadow-top $ibo-color-grey-300, $ibo-color-grey-500, ), ), 'success': ( '': ( $ibo-color-success-700, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':hover': ( $ibo-color-success-800, $ibo-color-white-100, $ibo-button--box-shadow-bottom $ibo-color-success-900, $ibo-color-success-800, ), ':active': ($ibo-color-success-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-success-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-800,$ibo-color-success-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'red': ( '': ($ibo-color-red-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':hover': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-red-500,$ibo-color-red-700, ), ':active': ($ibo-color-red-600,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-red-500 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-600,$ibo-color-red-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'green': ( '': ($ibo-color-green-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':hover': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-green-900,$ibo-color-green-800, ), ':active': ($ibo-color-green-800,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-green-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-800,$ibo-color-green-800, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ), 'cyan': ( '': ($ibo-color-cyan-500,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':hover': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-bottom $ibo-color-cyan-900,$ibo-color-cyan-900, ), ':active': ($ibo-color-cyan-700,$ibo-color-white-100,$ibo-button--box-shadow-top $ibo-color-cyan-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-700,$ibo-color-cyan-700, ), ':disabled': ($ibo-color-grey-300,$ibo-color-grey-700,$ibo-button--box-shadow-top $ibo-color-grey-300,$ibo-color-grey-500, ), ) ), 'alternative': ( 'neutral': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-700,$ibo-color-grey-300,$ibo-button--box-shadow-top $ibo-color-secondary-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-700,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'primary': ( '': (transparent,$ibo-color-primary-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-700, ), ':hover': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':active': ($ibo-color-primary-900,$ibo-color-primary-300,$ibo-button--box-shadow-top $ibo-color-primary-900 #{','} $ibo-button--box-shadow-bottom $ibo-color-primary-900,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'secondary': ( '': (transparent,$ibo-color-grey-300,$ibo-button--box-shadow-bottom transparent,$ibo-color-grey-800, ), ':hover': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':active': ($ibo-color-secondary-100,$ibo-color-grey-900,$ibo-button--box-shadow-top $ibo-color-secondary-200 #{','} $ibo-button--box-shadow-bottom $ibo-color-secondary-100,$ibo-color-grey-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'danger': ( '': (transparent,$ibo-color-danger-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-danger-600, ), ':hover': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':active': ($ibo-color-danger-200,$ibo-color-danger-900,$ibo-button--box-shadow-top $ibo-color-danger-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-danger-200,$ibo-color-danger-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'success': ( '': (transparent,$ibo-color-success-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-success-800, ), ':hover': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':active': ($ibo-color-success-100,$ibo-color-success-900,$ibo-button--box-shadow-top $ibo-color-success-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-success-100,$ibo-color-success-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'red': ( '': (transparent,$ibo-color-red-700,$ibo-button--box-shadow-bottom transparent,$ibo-color-red-600, ), ':hover': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':active': ($ibo-color-red-200,$ibo-color-red-900,$ibo-button--box-shadow-top $ibo-color-red-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-red-200,$ibo-color-red-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'green': ( '': (transparent,$ibo-color-green-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-green-800, ), ':hover': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':active': ($ibo-color-green-100,$ibo-color-green-900,$ibo-button--box-shadow-top $ibo-color-green-700 #{','} $ibo-button--box-shadow-bottom $ibo-color-green-100,$ibo-color-green-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), 'cyan': ( '': (transparent,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom transparent,$ibo-color-cyan-800, ), ':hover': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':active': ($ibo-color-cyan-100,$ibo-color-cyan-900,$ibo-button--box-shadow-top $ibo-color-cyan-800 #{','} $ibo-button--box-shadow-bottom $ibo-color-cyan-100,$ibo-color-cyan-800, ), ':disabled': (transparent,$ibo-color-grey-600,$ibo-button--box-shadow-top transparent,$ibo-color-grey-500, ), ), ));
-$ibo-alert-colors: ('primary': ($ibo-color-primary-900, $ibo-color-primary-700, $ibo-color-primary-200),'secondary': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'neutral': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'information': ($ibo-color-information-900, $ibo-color-information-700, $ibo-color-information-200),'success': ($ibo-color-success-900, $ibo-color-success-700, $ibo-color-success-100),'failure': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'warning': ($ibo-color-warning-900, $ibo-color-warning-700, $ibo-color-warning-200),'danger': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'grey' : ($ibo-color-grey-900, $ibo-color-grey-700, $ibo-color-grey-200),'blue-grey': ($ibo-color-blue-grey-900, $ibo-color-blue-grey-700, $ibo-color-blue-grey-200),'blue': ($ibo-color-blue-900, $ibo-color-blue-700, $ibo-color-blue-200),'cyan': ($ibo-color-cyan-900, $ibo-color-blue-700, $ibo-color-cyan-100),'green': ($ibo-color-green-900, $ibo-color-green-700, $ibo-color-green-100),'orange' : ($ibo-color-orange-900, $ibo-color-orange-700, $ibo-color-orange-200),'red': ($ibo-color-red-900, $ibo-color-red-700, $ibo-color-red-200),'pink': ($ibo-color-pink-900, $ibo-color-pink-700, $ibo-color-pink-200),);
+$ibo-alert-colors: ('primary': ($ibo-color-primary-900, $ibo-color-primary-700, $ibo-color-primary-200), 'secondary': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'neutral': ($ibo-color-secondary-900, $ibo-color-secondary-700, $ibo-color-secondary-200),'information': ($ibo-color-information-900, $ibo-color-information-700, $ibo-color-information-200),'success': ($ibo-color-success-900, $ibo-color-success-700, $ibo-color-success-100),'failure': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'warning': ($ibo-color-warning-900, $ibo-color-warning-700, $ibo-color-warning-200),'danger': ($ibo-color-danger-900, $ibo-color-danger-700, $ibo-color-danger-200),'grey' : ($ibo-color-grey-900, $ibo-color-grey-700, $ibo-color-grey-200),'blue-grey': ($ibo-color-blue-grey-900, $ibo-color-blue-grey-700, $ibo-color-blue-grey-200),'blue': ($ibo-color-blue-900, $ibo-color-blue-700, $ibo-color-blue-200),'cyan': ($ibo-color-cyan-900, $ibo-color-blue-700, $ibo-color-cyan-100),'green': ($ibo-color-green-900, $ibo-color-green-700, $ibo-color-green-100),'orange' : ($ibo-color-orange-900, $ibo-color-orange-700, $ibo-color-orange-200),'red': ($ibo-color-red-900, $ibo-color-red-700, $ibo-color-red-200),'pink': ($ibo-color-pink-900, $ibo-color-pink-700, $ibo-color-pink-200),);
$ibo-color-base-lightness-100: 23%;
$ibo-color-base-lightness-900: 93%;
+$ibo-color-base-opacity-for-lightness-100: 1;
+$ibo-color-base-opacity-for-lightness-900: 1;
+
$ibo-vendors-c3--path--color: $ibo-color-grey-300;
$ibo-vendors-c3--tooltip--background-color: $ibo-color-grey-600;
$ibo-vendors-c3--tooltip-th--background-color: $ibo-color-grey-600;
diff --git a/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php
index 58223d2bd..0c58b402e 100644
--- a/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php
+++ b/datamodels/2.x/combodo-db-tools/dictionaries/zh_cn.dict.combodo-db-tools.php
@@ -23,23 +23,23 @@
// Database inconsistencies
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
// Dictionary entries go here
- 'Menu:DBToolsMenu' => 'DB å·„å
·',
- 'DBTools:Class' => 'Class~~',
+ 'Menu:DBToolsMenu' => 'ę°ę®åŗå·„å
·',
+ 'DBTools:Class' => 'ē±»',
'DBTools:Title' => 'ę°ę®åŗē»“ę¤å·„å
·',
'DBTools:ErrorsFound' => 'åē°é误',
- 'DBTools:Indication' => 'Important: after fixing errors in the database you\'ll have to run the analysis again as new inconsistencies will be generated~~',
- 'DBTools:Disclaimer' => 'DISCLAIMER: BACKUP YOUR DATABASE BEFORE RUNNING THE FIXES~~',
+ 'DBTools:Indication' => 'éč¦: äæ®å¤ę°ę®åŗé误å,åÆč½ä¼åŗē°ę°ēäøäøč“,ęØåæ
é”»éę°čæč”äøę¬”åę.',
+ 'DBTools:Disclaimer' => 'å
č“£ē³ę: åØåŗēØäæ®å¤ä¹å,åŗå
å¤ä»½ę°ę®åŗ',
'DBTools:Error' => 'é误',
'DBTools:Count' => 'äøŖę°',
'DBTools:SQLquery' => 'SQL ę„询',
'DBTools:FixitSQLquery' => 'SQL query To Fix it (indication)~~',
'DBTools:SQLresult' => 'SQL ē»ę',
- 'DBTools:NoError' => 'ę°ę®åŗOK ',
+ 'DBTools:NoError' => 'ę°ę®åŗę£ē”®',
'DBTools:HideIds' => 'é误å蔨',
'DBTools:ShowIds' => '详ē»č§å¾',
'DBTools:ShowReport' => 'ę„å',
'DBTools:IntegrityCheck' => 'å®ę“ę§ę£ę„',
- 'DBTools:FetchCheck' => 'Fetch Check (long)~~',
+ 'DBTools:FetchCheck' => 'ęåę£ę„(čę¶éæ)',
'DBTools:SelectAnalysisType' => '请éę©åęē±»å',
'DBTools:Analyze' => 'åę',
@@ -47,17 +47,17 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'DBTools:ShowAll' => 'ę¾ē¤ŗęęé误',
'DBTools:Inconsistencies' => 'ę°ę®åŗäøäøč“',
- 'DBTools:DetailedErrorTitle' => '%2$s error(s) in class %1$s: %3$s~~',
+ 'DBTools:DetailedErrorTitle' => '%2$s äøŖé误åØē±» %1$s: %3$s',
'DBAnalyzer-Integrity-OrphanRecord' => 'Orphan record in `%1$s`, it should have its counterpart in table `%2$s`~~',
'DBAnalyzer-Integrity-InvalidExtKey' => 'ę ęēå¤é® %1$s (å: `%2$s.%3$s`)',
'DBAnalyzer-Integrity-MissingExtKey' => 'å¤é®äø¢å¤± %1$s (å: `%2$s.%3$s`)',
'DBAnalyzer-Integrity-InvalidValue' => 'ę ęēå¼ %1$s (å: `%2$s.%3$s`)',
- 'DBAnalyzer-Integrity-UsersWithoutProfile' => 'Some user accounts have no profile at all~~',
- 'DBAnalyzer-Integrity-HKInvalid' => 'Broken hierarchical key `%1$s`~~',
+ 'DBAnalyzer-Integrity-UsersWithoutProfile' => 'äøäŗēØę·č“¦å·ę²”ęč§č²',
+ 'DBAnalyzer-Integrity-HKInvalid' => 'ęåēå±ēŗ§é¾ `%1$s`',
'DBAnalyzer-Fetch-Count-Error' => 'Fetch count error in `%1$s`, %2$d entries fetched / %3$d counted~~',
- 'DBAnalyzer-Integrity-FinalClass' => 'Field `%2$s`.`%1$s` must have the same value than `%3$s`.`%1$s`~~',
- 'DBAnalyzer-Integrity-RootFinalClass' => 'Field `%2$s`.`%1$s` must contains a valid class~~',
+ 'DBAnalyzer-Integrity-FinalClass' => 'åꮵ `%2$s`.`%1$s` åæ
é”»ęÆēøåēå¼,čäøęÆ `%3$s`.`%1$s`',
+ 'DBAnalyzer-Integrity-RootFinalClass' => 'åꮵ `%2$s`.`%1$s` åæ
é”»å
å«äøäøŖęęēē±»',
));
// Database Info
@@ -70,11 +70,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
// Lost attachments
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'DBTools:LostAttachments' => '缺失éä»¶',
- 'DBTools:LostAttachments:Disclaimer' => 'Here you can search your database for lost or misplaced attachments. This is NOT a data recovery tool, is does not retrieve deleted data.~~',
+ 'DBTools:LostAttachments:Disclaimer' => 'åÆä»„åØę¤ęē“¢ę°ę®åŗäøäø¢å¤±ęéę¾ēéä»¶.čæäøęÆę°ę®ę¢å¤å·„å
·,å
¶ę ę³ę¢å¤å·²å é¤ēę°ę®.',
'DBTools:LostAttachments:Button:Analyze' => 'åę',
'DBTools:LostAttachments:Button:Restore' => 'čæå',
- 'DBTools:LostAttachments:Button:Restore:Confirm' => '评ęä½ę ę³åé, 请甮认ęÆå¦ē»§ē»čæå.',
+ 'DBTools:LostAttachments:Button:Restore:Confirm' => 'ę¤ęä½ę ę³åé, 请甮认ęÆå¦ē»§ē»čæå.',
'DBTools:LostAttachments:Button:Busy' => '请ēØå...',
'DBTools:LostAttachments:Step:Analyze' => 'é¦å
, éčæåęę°ę®åŗę„ę瓢丢失ę误ęŖåØēéä»¶.',
@@ -89,6 +89,6 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'DBTools:LostAttachments:Step:RestoreResults' => 'čæåē»ę:',
'DBTools:LostAttachments:Step:RestoreResults:Results' => '%1$d/%2$d ēé件被čæå.',
- 'DBTools:LostAttachments:StoredAsInlineImage' => 'Stored as inline image~~',
- 'DBTools:LostAttachments:History' => 'éä»¶ "%1$s" restored with DB å·„å
·~~'
+ 'DBTools:LostAttachments:StoredAsInlineImage' => 'ååØäøŗå
åµå¾å',
+ 'DBTools:LostAttachments:History' => 'éä»¶ "%1$s" 已使ēØę°ę®åŗå·„å
·čæå'
));
diff --git a/datamodels/2.x/installation.xml b/datamodels/2.x/installation.xml
index 330736741..1812f6a94 100755
--- a/datamodels/2.x/installation.xml
+++ b/datamodels/2.x/installation.xml
@@ -21,6 +21,7 @@
combodo-db-tools
itop-core-update
itop-hub-connector
+ itop-oauth-client
combodo-backoffice-darkmoon-theme
itop-themes-compat
diff --git a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php
index 7dffe2b81..484816092 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php
@@ -29,9 +29,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Attachment:Max_Mo' => '(ę大ę件尺寸: %1$s MB)',
'Attachment:Max_Ko' => '(ę大ę件尺寸: %1$s KB)',
'Attachments:NoAttachment' => 'ę²”ęéä»¶. ',
- 'Attachments:PreviewNotAvailable' => '评éä»¶ē±»åäøęÆęé¢č§.',
+ 'Attachments:PreviewNotAvailable' => 'ę¤éä»¶ē±»åäøęÆęé¢č§.',
'Attachments:Error:FileTooLarge' => 'äøä¼ ēęä»¶čæå¤§. %1$s',
- 'Attachments:Error:UploadedFileEmpty' => 'ę¶å°ēę件为空ļ¼ę ę³ę·»å . åÆč½ęÆå äøŗęØåéēęÆē©ŗęä»¶,ęč
åØčÆ¢ '.ITOP_APPLICATION_SHORT.' ē®”ēåęå”åØē£ēęÆå¦å·²ę»”. ',
+ 'Attachments:Error:UploadedFileEmpty' => 'ę¶å°ēę件为空,ę ę³ę·»å . åÆč½ęÆå äøŗęØåéēęÆē©ŗęä»¶,ęč
åØčÆ¢ '.ITOP_APPLICATION_SHORT.' ē®”ēåęå”åØē£ēęÆå¦å·²ę»”. ',
'Attachments:Render:Icons' => 'ę¾ē¤ŗäøŗå¾ę ',
'Attachments:Render:Table' => 'ę¾ē¤ŗäøŗå蔨',
'UI:Attachments:DropYourFileHint' => 'å°ęä»¶ęę¾å°ę¤åŗåēä»»ęä½ē½®',
@@ -48,11 +48,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Attachment/Attribute:expire+' => '~~',
'Class:Attachment/Attribute:temp_id' => 'äø“ę¶id',
'Class:Attachment/Attribute:temp_id+' => '~~',
- 'Class:Attachment/Attribute:item_class' => 'Item class~~',
+ 'Class:Attachment/Attribute:item_class' => '锹ē®ē±»',
'Class:Attachment/Attribute:item_class+' => '~~',
'Class:Attachment/Attribute:item_id' => '锹ē®',
'Class:Attachment/Attribute:item_id+' => '~~',
- 'Class:Attachment/Attribute:item_org_id' => 'Item ē»ē»~~',
+ 'Class:Attachment/Attribute:item_org_id' => '锹ē®ē»ē»',
'Class:Attachment/Attribute:item_org_id+' => '',
'Class:Attachment/Attribute:contents' => 'å
容',
'Class:Attachment/Attribute:contents+' => '',
@@ -74,8 +74,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Attachment/Attribute:creation_date' => 'å建ę„ę',
'Class:Attachment/Attribute:creation_date+' => '~~',
- 'Class:Attachment/Attribute:user_id' => 'ēØę· id',
+ 'Class:Attachment/Attribute:user_id' => 'ēØę·id',
'Class:Attachment/Attribute:user_id+' => '~~',
- 'Class:Attachment/Attribute:contact_id' => 'č系人 id',
+ 'Class:Attachment/Attribute:contact_id' => 'č系人id',
'Class:Attachment/Attribute:contact_id+' => '~~',
));
diff --git a/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php b/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php
index 44a4ffcfa..fa126492e 100644
--- a/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php
+++ b/datamodels/2.x/itop-backup/dictionaries/zh_cn.dict.itop-backup.php
@@ -28,14 +28,14 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Menu:BackupStatus' => 'å®ę¶å¤ä»½',
'bkp-status-title' => 'å®ę¶å¤ä»½',
'bkp-status-checks' => '设置äøę£ę„',
- 'bkp-mysqldump-ok' => 'å·²ę¾å° mysqldump : %1$s',
+ 'bkp-mysqldump-ok' => 'å·²ę¾å°mysqldump : %1$s',
'bkp-mysqldump-notfound' => 'mysqldump ę¾äøå°: %1$s - 请甮认å®å®č£
åØę£ē”®ēč·Æå¾, ęč
č°ę“'.ITOP_APPLICATION_SHORT.' é
ē½®ęä»¶ēé锹mysql_bindir.',
'bkp-mysqldump-issue' => 'mysqldump ę ę³čæč” (retcode=%1$d): 请甮认å®å®č£
åØę£ē”®ēč·Æå¾, ęč
č°ę“'.ITOP_APPLICATION_SHORT.' é
ē½®ęä»¶ēé锹mysql_bindir',
'bkp-missing-dir' => 'ē®ę ē®å½ %1$s ę¾äøå°',
- 'bkp-free-disk-space' => '%1$s ē©ŗé² åØ %2$s',
+ 'bkp-free-disk-space' => '%1$s åÆēØē©ŗé“ ä½äŗ %2$s',
'bkp-dir-not-writeable' => '%1$s ę²”ęåå
„ęé',
'bkp-wrong-format-spec' => 'å½åęä»¶åę ¼å¼é误 (%1$s). é»č®¤ę ¼å¼åŗčÆ„ęÆ: %2$s',
- 'bkp-name-sample' => 'å¤ä»½ęä»¶å°ä»„ę°ę®åŗåćę„ęåę¶é“čæč”å½å. ä¾å¦: %1$s',
+ 'bkp-name-sample' => 'å¤ä»½ęä»¶å°ä»„ę°ę®åŗå,ę„ęåę¶é“čæč”å½å. ä¾å¦: %1$s',
'bkp-week-days' => 'åØęÆäøŖ %1$s ē %2$s čæč”å¤ä»½',
'bkp-retention' => 'ęå¤ %1$d 份å¤ä»½ęä»¶ åØē®ę ē®å½.',
'bkp-next-to-delete' => 'å½äøäøę¬”å¤ä»½ę¶å°č¢«å é¤ (see the setting "retention_count")',
@@ -49,7 +49,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'bkp-status-backups-manual' => 'ęåØå¤ä»½',
'bkp-status-backups-none' => 'å°ęŖå¼å§å¤ä»½',
'bkp-next-backup' => 'äøäøę¬”å¤ä»½å°åēåØ %1$s (%2$s) ē %3$s',
- 'bkp-next-backup-unknown' => 'The next backup is not scheduled yet.~~',
+ 'bkp-next-backup-unknown' => 'äøäøę¬”å¤ä»½å°ęŖč¢«č®”å .',
'bkp-button-backup-now' => 'ē«å³å¤ä»½!',
'bkp-button-restore-now' => 'čæå!',
'bkp-confirm-backup' => '请甮认ęÆå¦ē«å³å¼å§å¤ä»½.',
diff --git a/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php b/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php
index b76026964..365ea8d30 100644
--- a/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php
+++ b/datamodels/2.x/itop-bridge-cmdb-ticket/dictionaries/zh_cn.dict.itop-bridge-cmdb-ticket.php
@@ -91,9 +91,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:FunctionalCI/Attribute:providercontracts_list' => 'ä¾åŗååå',
- 'Class:FunctionalCI/Attribute:providercontracts_list+' => '评é
置锹ēęęä¾åŗååå',
+ 'Class:FunctionalCI/Attribute:providercontracts_list+' => 'ę¤é
置锹ēęęä¾åŗååå',
'Class:FunctionalCI/Attribute:services_list' => 'ęå”',
- 'Class:FunctionalCI/Attribute:services_list+' => '评é
置锹影åēęęęå”',
+ 'Class:FunctionalCI/Attribute:services_list+' => 'ę¤é
置锹影åēęęęå”',
'Class:FunctionalCI/Attribute:tickets_list' => 'å·„å',
- 'Class:FunctionalCI/Attribute:tickets_list+' => '评é
置锹å
å«ēęęå·„å',
+ 'Class:FunctionalCI/Attribute:tickets_list+' => 'ę¤é
置锹å
å«ēęęå·„å',
));
diff --git a/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php b/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php
index c674a35d5..226cd808c 100644
--- a/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php
+++ b/datamodels/2.x/itop-change-mgmt-itil/dictionaries/zh_cn.dict.itop-change-mgmt-itil.php
@@ -125,13 +125,13 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Change/Attribute:parent_name' => 'åę“ē¼å·',
'Class:Change/Attribute:parent_name+' => '',
'Class:Change/Attribute:related_request_list' => 'ēøå
³éę±',
- 'Class:Change/Attribute:related_request_list+' => '评åę“ēøå
³ēęęēØę·éę±',
+ 'Class:Change/Attribute:related_request_list+' => 'ę¤åę“ēøå
³ēęęēØę·éę±',
'Class:Change/Attribute:related_problems_list' => 'ēøå
³é®é¢',
- 'Class:Change/Attribute:related_problems_list+' => '评åę“ēøå
³ēęęé®é¢',
+ 'Class:Change/Attribute:related_problems_list+' => 'ę¤åę“ēøå
³ēęęé®é¢',
'Class:Change/Attribute:related_incident_list' => 'ēøå
³äŗä»¶',
- 'Class:Change/Attribute:related_incident_list+' => '评åę“ēøå
³ēęęäŗä»¶',
+ 'Class:Change/Attribute:related_incident_list+' => 'ę¤åę“ēøå
³ēęęäŗä»¶',
'Class:Change/Attribute:child_changes_list' => 'ååę“',
- 'Class:Change/Attribute:child_changes_list+' => '评åę“ēøå
³ēååę“',
+ 'Class:Change/Attribute:child_changes_list+' => 'ę¤åę“ēøå
³ēååę“',
'Class:Change/Attribute:parent_id_friendlyname' => 'ē¶ēŗ§åę“ęµē§°',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
'Class:Change/Attribute:parent_id_finalclass_recall' => 'åę“ē±»å',
diff --git a/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php b/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php
index 09c552bf2..dfc38f83b 100644
--- a/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php
+++ b/datamodels/2.x/itop-change-mgmt/dictionaries/zh_cn.dict.itop-change-mgmt.php
@@ -109,13 +109,13 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Change/Attribute:fallback_plan' => 'åę»č®”å',
'Class:Change/Attribute:fallback_plan+' => '',
'Class:Change/Attribute:related_request_list' => 'ēøå
³éę±',
- 'Class:Change/Attribute:related_request_list+' => '评åę“ēøå
³ēęęēØę·éę±',
+ 'Class:Change/Attribute:related_request_list+' => 'ę¤åę“ēøå
³ēęęēØę·éę±',
'Class:Change/Attribute:related_incident_list' => 'ēøå
³äŗä»¶',
- 'Class:Change/Attribute:related_incident_list+' => '评åę“ēøå
³ēęęäŗä»¶',
+ 'Class:Change/Attribute:related_incident_list+' => 'ę¤åę“ēøå
³ēęęäŗä»¶',
'Class:Change/Attribute:related_problems_list' => 'ēøå
³é®é¢',
- 'Class:Change/Attribute:related_problems_list+' => '评åę“ēøå
³ēęęé®é¢',
+ 'Class:Change/Attribute:related_problems_list+' => 'ę¤åę“ēøå
³ēęęé®é¢',
'Class:Change/Attribute:child_changes_list' => 'ååę“',
- 'Class:Change/Attribute:child_changes_list+' => '评åę“ēøå
³ēęęååę“',
+ 'Class:Change/Attribute:child_changes_list+' => 'ę¤åę“ēøå
³ēęęååę“',
'Class:Change/Attribute:parent_id_friendlyname' => 'ē¶ēŗ§åę“ęµē§°',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
'Class:Change/Stimulus:ev_assign' => 'åé
',
diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php
index eb9177d51..b9b97c278 100644
--- a/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php
+++ b/datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php
@@ -29,12 +29,12 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Relation:impacts/DownStream' => 'å½±å...',
'Relation:impacts/DownStream+' => '被影åēå
ē“ ',
'Relation:impacts/UpStream' => 'ä¾čµäŗ...',
- 'Relation:impacts/UpStream+' => '评å
ē“ ä¾čµēå
ē“ ...',
+ 'Relation:impacts/UpStream+' => 'ę¤å
ē“ ä¾čµēå
ē“ ...',
// Legacy entries
- 'Relation:depends on/Description' => '评å
ē“ ä¾čµēå
ē“ ...',
+ 'Relation:depends on/Description' => 'ę¤å
ē“ ä¾čµēå
ē“ ...',
'Relation:depends on/DownStream' => 'ä¾čµäŗ...',
'Relation:depends on/UpStream' => 'å½±å...',
- 'Relation:impacts/LoadData' => 'Load data~~',
+ 'Relation:impacts/LoadData' => 'å č½½ę°ę®',
'Relation:impacts/NoFilteredData' => 'please select objects in Graphical view tag~~',
));
@@ -81,7 +81,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkContactToFunctionalCI' => 'é¾ę„ č系人 / åč½é”¹',
+ 'Class:lnkContactToFunctionalCI' => 'å
³č č系人/åč½é”¹',
'Class:lnkContactToFunctionalCI+' => '',
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id' => 'åč½é”¹',
'Class:lnkContactToFunctionalCI/Attribute:functionalci_id+' => '',
@@ -119,13 +119,13 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:FunctionalCI/Attribute:move2production' => 'ęäŗ§ę„ę',
'Class:FunctionalCI/Attribute:move2production+' => '',
'Class:FunctionalCI/Attribute:contacts_list' => 'č系人',
- 'Class:FunctionalCI/Attribute:contacts_list+' => '评é
置锹ēęęč系人',
+ 'Class:FunctionalCI/Attribute:contacts_list+' => 'ę¤é
置锹ēęęč系人',
'Class:FunctionalCI/Attribute:documents_list' => 'ę攣',
- 'Class:FunctionalCI/Attribute:documents_list+' => '评é
置锹å
³čēęęę攣',
+ 'Class:FunctionalCI/Attribute:documents_list+' => 'ę¤é
置锹å
³čēęęę攣',
'Class:FunctionalCI/Attribute:applicationsolution_list' => 'åŗēØę¹ę”',
- 'Class:FunctionalCI/Attribute:applicationsolution_list+' => '评é
置锹ä¾čµēęęåŗēØę¹ę”',
+ 'Class:FunctionalCI/Attribute:applicationsolution_list+' => 'ę¤é
置锹ä¾čµēęęåŗēØę¹ę”',
'Class:FunctionalCI/Attribute:softwares_list' => '软件',
- 'Class:FunctionalCI/Attribute:softwares_list+' => '评é
置锹äøå·²å®č£
ēęę软件',
+ 'Class:FunctionalCI/Attribute:softwares_list+' => 'ę¤é
置锹äøå·²å®č£
ēęę软件',
'Class:FunctionalCI/Attribute:finalclass' => 'äŗēŗ§é
置锹',
'Class:FunctionalCI/Attribute:finalclass+' => 'Name of the final class',
'Class:FunctionalCI/Tab:OpenedTickets' => 'ę“»č·ēå·„å',
@@ -180,9 +180,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Rack/Attribute:nb_u' => 'ęŗęé«åŗ¦',
'Class:Rack/Attribute:nb_u+' => '',
'Class:Rack/Attribute:device_list' => '设å¤',
- 'Class:Rack/Attribute:device_list+' => '评ęŗęęē®”ēęęē©ē设å¤',
+ 'Class:Rack/Attribute:device_list+' => 'ę¤ęŗęęē®”ēęęē©ē设å¤',
'Class:Rack/Attribute:enclosure_list' => 'ęŗä½',
- 'Class:Rack/Attribute:enclosure_list+' => '评ęŗęäøēęęęŗä½',
+ 'Class:Rack/Attribute:enclosure_list+' => 'ę¤ęŗęäøēęęęŗä½',
));
//
@@ -190,7 +190,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:TelephonyCI' => 'Telephony CI',
+ 'Class:TelephonyCI' => 'ēµč®Æé
置锹',
'Class:TelephonyCI+' => '',
'Class:TelephonyCI/Attribute:phonenumber' => 'ēµčÆå·ē ',
'Class:TelephonyCI/Attribute:phonenumber+' => '',
@@ -270,20 +270,20 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:DatacenterDevice/Attribute:managementip+' => '',
'Class:DatacenterDevice/Attribute:powerA_id' => 'ēµęŗA',
'Class:DatacenterDevice/Attribute:powerA_id+' => '',
- 'Class:DatacenterDevice/Attribute:powerA_name' => 'PowerA source name',
+ 'Class:DatacenterDevice/Attribute:powerA_name' => 'ēµęŗAåē§°',
'Class:DatacenterDevice/Attribute:powerA_name+' => '',
'Class:DatacenterDevice/Attribute:powerB_id' => 'ēµęŗB',
'Class:DatacenterDevice/Attribute:powerB_id+' => '',
- 'Class:DatacenterDevice/Attribute:powerB_name' => 'PowerB source name',
+ 'Class:DatacenterDevice/Attribute:powerB_name' => 'ēµęŗBåē§°',
'Class:DatacenterDevice/Attribute:powerB_name+' => '',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list' => 'å
纤端å£',
- 'Class:DatacenterDevice/Attribute:fiberinterfacelist_list+' => '评设å¤ēęęå
纤端å£',
+ 'Class:DatacenterDevice/Attribute:fiberinterfacelist_list+' => 'ę¤č®¾å¤ēęęå
纤端å£',
'Class:DatacenterDevice/Attribute:san_list' => 'SANs',
- 'Class:DatacenterDevice/Attribute:san_list+' => 'ęęčæę„å°čæå°č®¾å¤ēSAN äŗ¤ę¢ęŗ',
+ 'Class:DatacenterDevice/Attribute:san_list+' => 'ęęčæę„å°čæå°č®¾å¤ēSANäŗ¤ę¢ęŗ',
'Class:DatacenterDevice/Attribute:redundancy' => 'åä½',
- 'Class:DatacenterDevice/Attribute:redundancy/count' => '评设å¤čæč”ę£åøøč³å°éč¦äøč·Æēµęŗ (A ę B)',
+ 'Class:DatacenterDevice/Attribute:redundancy/count' => 'ę¤č®¾å¤čæč”ę£åøøč³å°éč¦äøč·Æēµęŗ (A ę B)',
// Unused yet
- 'Class:DatacenterDevice/Attribute:redundancy/disabled' => 'ęęēµęŗę£åøø,评设å¤ęę£åøø',
+ 'Class:DatacenterDevice/Attribute:redundancy/disabled' => 'ęęēµęŗę£åøø,ę¤č®¾å¤ęę£åøø',
'Class:DatacenterDevice/Attribute:redundancy/percent' => 'č³å° %1$s %% č·Æēµęŗę£åøø,设å¤ęę£åøø',
));
@@ -299,10 +299,10 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:NetworkDevice/Attribute:networkdevicetype_name' => 'ē½ē»č®¾å¤ē±»ååē§°',
'Class:NetworkDevice/Attribute:networkdevicetype_name+' => '',
'Class:NetworkDevice/Attribute:connectablecis_list' => '设å¤',
- 'Class:NetworkDevice/Attribute:connectablecis_list+' => 'čæę„å°čÆ„ē½ē»č®¾å¤ēęę设å¤',
- 'Class:NetworkDevice/Attribute:iosversion_id' => 'IOS ēę¬',
+ 'Class:NetworkDevice/Attribute:connectablecis_list+' => 'čæę„å°ę¤ē½ē»č®¾å¤ēęę设å¤',
+ 'Class:NetworkDevice/Attribute:iosversion_id' => 'IOSēę¬',
'Class:NetworkDevice/Attribute:iosversion_id+' => '',
- 'Class:NetworkDevice/Attribute:iosversion_name' => 'IOS ēę¬åē§°',
+ 'Class:NetworkDevice/Attribute:iosversion_name' => 'IOSēę¬åē§°',
'Class:NetworkDevice/Attribute:iosversion_name+' => '',
'Class:NetworkDevice/Attribute:ram' => 'å
å',
'Class:NetworkDevice/Attribute:ram+' => '',
@@ -332,7 +332,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Server/Attribute:ram' => 'å
å',
'Class:Server/Attribute:ram+' => '',
'Class:Server/Attribute:logicalvolumes_list' => 'é»č¾å·',
- 'Class:Server/Attribute:logicalvolumes_list+' => 'čæę„å°čÆ„ęå”åØēęęé»č¾å·',
+ 'Class:Server/Attribute:logicalvolumes_list+' => 'čæę„å°ę¤ęå”åØēęęé»č¾å·',
));
//
@@ -343,7 +343,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:StorageSystem' => 'ååØē³»ē»',
'Class:StorageSystem+' => '',
'Class:StorageSystem/Attribute:logicalvolume_list' => 'é»č¾å·',
- 'Class:StorageSystem/Attribute:logicalvolume_list+' => '评ååØē³»ē»å
å«ēęęé»č¾å·',
+ 'Class:StorageSystem/Attribute:logicalvolume_list+' => 'ę¤ååØē³»ē»å
å«ēęęé»č¾å·',
));
//
@@ -351,10 +351,10 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:SANSwitch' => 'SAN äŗ¤ę¢ęŗ',
+ 'Class:SANSwitch' => 'SANäŗ¤ę¢ęŗ',
'Class:SANSwitch+' => '',
'Class:SANSwitch/Attribute:datacenterdevice_list' => '设å¤',
- 'Class:SANSwitch/Attribute:datacenterdevice_list+' => 'čæę„å°čÆ„SAN äŗ¤ę¢ęŗēęę设å¤',
+ 'Class:SANSwitch/Attribute:datacenterdevice_list+' => 'čæę„å°ę¤SANäŗ¤ę¢ęŗēęę设å¤',
));
//
@@ -365,7 +365,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:TapeLibrary' => 'ē£åø¦åŗ',
'Class:TapeLibrary+' => '',
'Class:TapeLibrary/Attribute:tapes_list' => 'ē£åø¦',
- 'Class:TapeLibrary/Attribute:tapes_list+' => '评ē£åø¦åŗéēęęē£åø¦',
+ 'Class:TapeLibrary/Attribute:tapes_list+' => 'ę¤ē£åø¦åŗéēęęē£åø¦',
));
//
@@ -376,7 +376,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:NAS' => 'NAS',
'Class:NAS+' => '',
'Class:NAS/Attribute:nasfilesystem_list' => 'ęä»¶ē³»ē»',
- 'Class:NAS/Attribute:nasfilesystem_list+' => '评NAS éēęęęä»¶ē³»ē»',
+ 'Class:NAS/Attribute:nasfilesystem_list+' => 'ę¤NASéēęęęä»¶ē³»ē»',
));
//
@@ -432,7 +432,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:PowerSource' => 'ēµęŗ',
'Class:PowerSource+' => '',
'Class:PowerSource/Attribute:pdus_list' => 'PDU',
- 'Class:PowerSource/Attribute:pdus_list+' => '使ēØčÆ„ēµęŗēęęPDU',
+ 'Class:PowerSource/Attribute:pdus_list+' => '使ēØę¤ēµęŗēęęPDU',
));
//
@@ -475,7 +475,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Enclosure/Attribute:nb_u' => 'é«åŗ¦',
'Class:Enclosure/Attribute:nb_u+' => '',
'Class:Enclosure/Attribute:device_list' => '设å¤',
- 'Class:Enclosure/Attribute:device_list+' => '评ęŗä½ēęę设å¤',
+ 'Class:Enclosure/Attribute:device_list+' => 'ę¤ęŗä½ēęę设å¤',
));
//
@@ -486,9 +486,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:ApplicationSolution' => 'åŗēØę¹ę”',
'Class:ApplicationSolution+' => '',
'Class:ApplicationSolution/Attribute:functionalcis_list' => 'é
置锹',
- 'Class:ApplicationSolution/Attribute:functionalcis_list+' => '评åŗēØę¹ę”å
å«ēęęé
置锹',
+ 'Class:ApplicationSolution/Attribute:functionalcis_list+' => 'ę¤åŗēØę¹ę”å
å«ēęęé
置锹',
'Class:ApplicationSolution/Attribute:businessprocess_list' => 'äøå”ęµēØ',
- 'Class:ApplicationSolution/Attribute:businessprocess_list+' => 'ęęä¾čµčÆ„åŗēØę¹ę”ēäøå”ęµēØ',
+ 'Class:ApplicationSolution/Attribute:businessprocess_list+' => 'ęęä¾čµę¤åŗēØę¹ę”ēäøå”ęµēØ',
'Class:ApplicationSolution/Attribute:status' => 'ē¶ę',
'Class:ApplicationSolution/Attribute:status+' => '',
'Class:ApplicationSolution/Attribute:status/Value:active' => 'åÆēØ',
@@ -496,9 +496,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:ApplicationSolution/Attribute:status/Value:inactive' => 'åēØ',
'Class:ApplicationSolution/Attribute:status/Value:inactive+' => 'åēØ',
'Class:ApplicationSolution/Attribute:redundancy' => 'å½±ååę: åä½é
ē½®',
- 'Class:ApplicationSolution/Attribute:redundancy/disabled' => 'The solution is up if all CIs are up',
- 'Class:ApplicationSolution/Attribute:redundancy/count' => 'The solution is up if at least %1$s CI(s) is(are) up',
- 'Class:ApplicationSolution/Attribute:redundancy/percent' => 'The solution is up if at least %1$s %% of the CIs are up',
+ 'Class:ApplicationSolution/Attribute:redundancy/disabled' => 'ęęé
置锹ę£åøø,ę¤åŗēØę¹ę”ęę£åøø',
+ 'Class:ApplicationSolution/Attribute:redundancy/count' => 'č³å° %1$s äøŖé
置锹ę£åøøę¶ę¤åŗēØę¹ę”ęę£åøø',
+ 'Class:ApplicationSolution/Attribute:redundancy/percent' => 'č³å° %1$s %% ēé
置锹ę£åøø,ę¤åŗēØę¹ę”ęę£åøø',
));
//
@@ -509,7 +509,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:BusinessProcess' => 'äøå”ęµēØ',
'Class:BusinessProcess+' => '',
'Class:BusinessProcess/Attribute:applicationsolutions_list' => 'åŗēØę¹ę”',
- 'Class:BusinessProcess/Attribute:applicationsolutions_list+' => 'ęęå½±å评äøå”ęµēØēåŗēØę¹ę”',
+ 'Class:BusinessProcess/Attribute:applicationsolutions_list+' => 'ęęå½±åę¤äøå”ęµēØēåŗēØę¹ę”',
'Class:BusinessProcess/Attribute:status' => 'ē¶ę',
'Class:BusinessProcess/Attribute:status+' => '',
'Class:BusinessProcess/Attribute:status/Value:active' => 'åÆēØ',
@@ -555,7 +555,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Middleware' => 'äøé“ä»¶',
'Class:Middleware+' => '',
'Class:Middleware/Attribute:middlewareinstance_list' => 'äøé“ä»¶å®ä¾',
- 'Class:Middleware/Attribute:middlewareinstance_list+' => '评äøé“ä»¶ēęęå®ä¾',
+ 'Class:Middleware/Attribute:middlewareinstance_list+' => 'ę¤äøé“ä»¶ēęęå®ä¾',
));
//
@@ -566,7 +566,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:DBServer' => 'ę°ę®åŗęå”åØ',
'Class:DBServer+' => '',
'Class:DBServer/Attribute:dbschema_list' => 'ę°ę®åŗ',
- 'Class:DBServer/Attribute:dbschema_list+' => '评ę°ę®åŗęå”åØäøēęęę°ę®åŗę¶ę',
+ 'Class:DBServer/Attribute:dbschema_list+' => 'ę¤ę°ę®åŗęå”åØäøēęęę°ę®åŗę¶ę',
));
//
@@ -577,7 +577,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:WebServer' => 'Web ęå”åØ',
'Class:WebServer+' => '',
'Class:WebServer/Attribute:webapp_list' => 'Web åŗēØ',
- 'Class:WebServer/Attribute:webapp_list+' => '评web ęå”åØäøēęęweb åŗēØ',
+ 'Class:WebServer/Attribute:webapp_list+' => 'ę¤web ęå”åØäøēęęweb åŗēØ',
));
//
@@ -658,7 +658,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:VirtualDevice/Attribute:status/Value:stock' => 'åŗå',
'Class:VirtualDevice/Attribute:status/Value:stock+' => 'åŗå',
'Class:VirtualDevice/Attribute:logicalvolumes_list' => 'é»č¾å·',
- 'Class:VirtualDevice/Attribute:logicalvolumes_list+' => '评设å¤ä½æēØēęęé»č¾å·',
+ 'Class:VirtualDevice/Attribute:logicalvolumes_list+' => 'ę¤č®¾å¤ä½æēØēęęé»č¾å·',
));
//
@@ -669,7 +669,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:VirtualHost' => '宿主ęŗ',
'Class:VirtualHost+' => '',
'Class:VirtualHost/Attribute:virtualmachine_list' => 'čęęŗ',
- 'Class:VirtualHost/Attribute:virtualmachine_list+' => '评宿主ęŗęē®”ēęęčęęŗ',
+ 'Class:VirtualHost/Attribute:virtualmachine_list+' => 'ę¤å®æäø»ęŗęē®”ēęęčęęŗ',
));
//
@@ -759,9 +759,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:LogicalVolume/Attribute:storagesystem_name' => 'åē§°',
'Class:LogicalVolume/Attribute:storagesystem_name+' => '',
'Class:LogicalVolume/Attribute:servers_list' => 'ęå”åØ',
- 'Class:LogicalVolume/Attribute:servers_list+' => '使ēØčÆ„é»č¾å·ēęå”åØ',
+ 'Class:LogicalVolume/Attribute:servers_list+' => '使ēØę¤é»č¾å·ēęå”åØ',
'Class:LogicalVolume/Attribute:virtualdevices_list' => 'čę设å¤',
- 'Class:LogicalVolume/Attribute:virtualdevices_list+' => '使ēØčÆ„é»č¾å·ēęęčę设å¤',
+ 'Class:LogicalVolume/Attribute:virtualdevices_list+' => '使ēØę¤é»č¾å·ēęęčę设å¤',
));
//
@@ -769,7 +769,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkServerToVolume' => 'é¾ę„ ęå”åØ / é»č¾å·',
+ 'Class:lnkServerToVolume' => 'å
³č ęå”åØ/é»č¾å·',
'Class:lnkServerToVolume+' => '',
'Class:lnkServerToVolume/Attribute:volume_id' => 'é»č¾å·',
'Class:lnkServerToVolume/Attribute:volume_id+' => '',
@@ -788,7 +788,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkVirtualDeviceToVolume' => 'é¾ę„ čęč®¾å¤ / é»č¾å·',
+ 'Class:lnkVirtualDeviceToVolume' => 'å
³č čę设å¤/é»č¾å·',
'Class:lnkVirtualDeviceToVolume+' => '',
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id' => 'é»č¾å·',
'Class:lnkVirtualDeviceToVolume/Attribute:volume_id+' => '',
@@ -807,7 +807,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkSanToDatacenterDevice' => 'é¾ę„ SAN / ę°ę®äøåæč®¾å¤',
+ 'Class:lnkSanToDatacenterDevice' => 'å
³č SAN/ę°ę®äøåæč®¾å¤',
'Class:lnkSanToDatacenterDevice+' => '',
'Class:lnkSanToDatacenterDevice/Attribute:san_id' => 'SAN äŗ¤ę¢ęŗ',
'Class:lnkSanToDatacenterDevice/Attribute:san_id+' => '',
@@ -877,7 +877,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Software/Attribute:version' => 'ēę¬',
'Class:Software/Attribute:version+' => '',
'Class:Software/Attribute:documents_list' => 'ę攣',
- 'Class:Software/Attribute:documents_list+' => '评软件ēęęę攣',
+ 'Class:Software/Attribute:documents_list+' => 'ę¤č½Æä»¶ēęęę攣',
'Class:Software/Attribute:type' => 'ē±»å',
'Class:Software/Attribute:type+' => '',
'Class:Software/Attribute:type/Value:DBServer' => 'ę°ę®åŗęå”åØ',
@@ -891,11 +891,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Software/Attribute:type/Value:WebServer' => 'Web ęå”åØ',
'Class:Software/Attribute:type/Value:WebServer+' => 'Web ęå”åØ',
'Class:Software/Attribute:softwareinstance_list' => '软件å®ä¾',
- 'Class:Software/Attribute:softwareinstance_list+' => '评软件ēęęå®ä¾',
+ 'Class:Software/Attribute:softwareinstance_list+' => 'ę¤č½Æä»¶ēęęå®ä¾',
'Class:Software/Attribute:softwarepatch_list' => '软件蔄äø',
- 'Class:Software/Attribute:softwarepatch_list+' => '评软件ēęę蔄äø',
+ 'Class:Software/Attribute:softwarepatch_list+' => 'ę¤č½Æä»¶ēęę蔄äø',
'Class:Software/Attribute:softwarelicence_list' => '软件许åÆčÆ',
- 'Class:Software/Attribute:softwarelicence_list+' => '评软件ēęę许åÆčÆ',
+ 'Class:Software/Attribute:softwarelicence_list+' => 'ę¤č½Æä»¶ēęę许åÆčÆ',
));
//
@@ -908,7 +908,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Patch/Attribute:name' => 'åē§°',
'Class:Patch/Attribute:name+' => '',
'Class:Patch/Attribute:documents_list' => 'ę攣',
- 'Class:Patch/Attribute:documents_list+' => '评蔄äøå
³čēęęę攣',
+ 'Class:Patch/Attribute:documents_list+' => 'ę¤č”„äøå
³čēęęę攣',
'Class:Patch/Attribute:description' => 'ęčæ°',
'Class:Patch/Attribute:description+' => '',
'Class:Patch/Attribute:finalclass' => '蔄äøåē±»å«',
@@ -923,7 +923,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:OSPatch' => 'ęä½ē³»ē»č”„äø',
'Class:OSPatch+' => '',
'Class:OSPatch/Attribute:functionalcis_list' => '设å¤',
- 'Class:OSPatch/Attribute:functionalcis_list+' => 'å·²å®č£
评蔄äøēęęē³»ē»',
+ 'Class:OSPatch/Attribute:functionalcis_list+' => 'å·²å®č£
ę¤č”„äøēęęē³»ē»',
'Class:OSPatch/Attribute:osversion_id' => 'ęä½ē³»ē»ēę¬',
'Class:OSPatch/Attribute:osversion_id+' => '',
'Class:OSPatch/Attribute:osversion_name' => 'åē§°',
@@ -942,7 +942,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:SoftwarePatch/Attribute:software_name' => 'åē§°',
'Class:SoftwarePatch/Attribute:software_name+' => '',
'Class:SoftwarePatch/Attribute:softwareinstances_list' => '软件å®ä¾',
- 'Class:SoftwarePatch/Attribute:softwareinstances_list+' => 'å·²å®č£
评软件蔄äøēęęē³»ē»',
+ 'Class:SoftwarePatch/Attribute:softwareinstances_list+' => 'å·²å®č£
ę¤č½Æä»¶č”„äøēęęē³»ē»',
));
//
@@ -955,7 +955,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Licence/Attribute:name' => 'åē§°',
'Class:Licence/Attribute:name+' => '',
'Class:Licence/Attribute:documents_list' => 'ę攣',
- 'Class:Licence/Attribute:documents_list+' => '评许åÆčÆå
³čēęęę攣',
+ 'Class:Licence/Attribute:documents_list+' => 'ę¤č®øåÆčÆå
³čēęęę攣',
'Class:Licence/Attribute:org_id' => 'ē»ē»',
'Class:Licence/Attribute:org_id+' => '',
'Class:Licence/Attribute:organization_name' => 'ē»ē»åē§°',
@@ -992,9 +992,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:OSLicence/Attribute:osversion_name' => 'åē§°',
'Class:OSLicence/Attribute:osversion_name+' => '',
'Class:OSLicence/Attribute:virtualmachines_list' => 'čęęŗ',
- 'Class:OSLicence/Attribute:virtualmachines_list+' => '使ēØčÆ„č®øåÆčÆēęęčęęŗ',
+ 'Class:OSLicence/Attribute:virtualmachines_list+' => '使ēØę¤č®øåÆčÆēęęčęęŗ',
'Class:OSLicence/Attribute:servers_list' => 'ęå”åØ',
- 'Class:OSLicence/Attribute:servers_list+' => '使ēØčÆ„č®øåÆčÆēęęęå”åØ',
+ 'Class:OSLicence/Attribute:servers_list+' => '使ēØę¤č®øåÆčÆēęęęå”åØ',
));
//
@@ -1009,7 +1009,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:SoftwareLicence/Attribute:software_name' => 'åē§°',
'Class:SoftwareLicence/Attribute:software_name+' => '',
'Class:SoftwareLicence/Attribute:softwareinstance_list' => '软件å®ä¾',
- 'Class:SoftwareLicence/Attribute:softwareinstance_list+' => '使ēØčÆ„č®øåÆčÆēęęē³»ē»',
+ 'Class:SoftwareLicence/Attribute:softwareinstance_list+' => '使ēØę¤č®øåÆčÆēęęē³»ē»',
));
//
@@ -1017,7 +1017,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkDocumentToLicence' => 'é¾ę„ ę攣 / 许åÆčÆ',
+ 'Class:lnkDocumentToLicence' => 'å
³č ę攣/许åÆčÆ',
'Class:lnkDocumentToLicence+' => '',
'Class:lnkDocumentToLicence/Attribute:licence_id' => '许åÆčÆ',
'Class:lnkDocumentToLicence/Attribute:licence_id+' => '',
@@ -1059,9 +1059,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Brand' => 'åē',
'Class:Brand+' => '',
'Class:Brand/Attribute:physicaldevices_list' => 'ē©ē设å¤',
- 'Class:Brand/Attribute:physicaldevices_list+' => '评åēēęęē©ē设å¤',
+ 'Class:Brand/Attribute:physicaldevices_list+' => 'ę¤åēēęęē©ē设å¤',
'Class:Brand/UniquenessRule:name+' => 'åē§°åæ
é”»åÆäø',
- 'Class:Brand/UniquenessRule:name' => '评åēå·²ååØ',
+ 'Class:Brand/UniquenessRule:name' => 'ę¤åēå·²ååØ',
));
//
@@ -1083,8 +1083,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Model/Attribute:type/Value:DiskArray+' => 'ē£ēéµå',
'Class:Model/Attribute:type/Value:Enclosure' => 'ęŗä½',
'Class:Model/Attribute:type/Value:Enclosure+' => 'ęŗä½',
- 'Class:Model/Attribute:type/Value:IPPhone' => 'IP ēµčÆ',
- 'Class:Model/Attribute:type/Value:IPPhone+' => 'IP ēµčÆ',
+ 'Class:Model/Attribute:type/Value:IPPhone' => 'IPēµčÆ',
+ 'Class:Model/Attribute:type/Value:IPPhone+' => 'IPēµčÆ',
'Class:Model/Attribute:type/Value:MobilePhone' => 'ē§»åØēµčÆ',
'Class:Model/Attribute:type/Value:MobilePhone+' => 'ē§»åØēµčÆ',
'Class:Model/Attribute:type/Value:NAS' => 'NAS',
@@ -1101,10 +1101,10 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Model/Attribute:type/Value:Printer+' => 'ęå°ęŗ',
'Class:Model/Attribute:type/Value:Rack' => 'ęŗę',
'Class:Model/Attribute:type/Value:Rack+' => 'ęŗę',
- 'Class:Model/Attribute:type/Value:SANSwitch' => 'SAN äŗ¤ę¢ęŗ',
- 'Class:Model/Attribute:type/Value:SANSwitch+' => 'SAN äŗ¤ę¢ęŗ',
+ 'Class:Model/Attribute:type/Value:SANSwitch' => 'SANäŗ¤ę¢ęŗ',
+ 'Class:Model/Attribute:type/Value:SANSwitch+' => 'SANäŗ¤ę¢ęŗ',
'Class:Model/Attribute:type/Value:Server' => 'ęå”åØ',
- 'Class:Model/Attribute:type/Value:Server+' => 'Server',
+ 'Class:Model/Attribute:type/Value:Server+' => 'ęå”åØ',
'Class:Model/Attribute:type/Value:StorageSystem' => 'ååØē³»ē»',
'Class:Model/Attribute:type/Value:StorageSystem+' => 'ååØē³»ē»',
'Class:Model/Attribute:type/Value:Tablet' => 'å¹³ęæ',
@@ -1114,9 +1114,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Model/Attribute:type/Value:Phone' => 'ēµčÆ',
'Class:Model/Attribute:type/Value:Phone+' => 'ēµčÆ',
'Class:Model/Attribute:physicaldevices_list' => 'ē©ē设å¤',
- 'Class:Model/Attribute:physicaldevices_list+' => '评åå·ēęęē©ē设å¤',
+ 'Class:Model/Attribute:physicaldevices_list+' => 'ę¤åå·ēęęē©ē设å¤',
'Class:Model/UniquenessRule:name_brand+' => 'åē§°åæ
é”»åÆäø',
- 'Class:Model/UniquenessRule:name_brand' => '评åå·å·²ååØ',
+ 'Class:Model/UniquenessRule:name_brand' => 'ę¤åå·å·²ååØ',
));
//
@@ -1127,7 +1127,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:NetworkDeviceType' => 'ē½ē»č®¾å¤ē±»å',
'Class:NetworkDeviceType+' => '',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'ē½ē»č®¾å¤',
- 'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => '评类åēęęē½ē»č®¾å¤',
+ 'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'ę¤ē±»åēęęē½ē»č®¾å¤',
));
//
@@ -1135,7 +1135,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:IOSVersion' => 'IOS ēę¬',
+ 'Class:IOSVersion' => 'IOSēę¬',
'Class:IOSVersion+' => '',
'Class:IOSVersion/Attribute:brand_id' => 'åē',
'Class:IOSVersion/Attribute:brand_id+' => '',
@@ -1148,7 +1148,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkDocumentToPatch' => 'é¾ę„ ę攣 / 蔄äø',
+ 'Class:lnkDocumentToPatch' => 'å
³č ę攣/蔄äø',
'Class:lnkDocumentToPatch+' => '',
'Class:lnkDocumentToPatch/Attribute:patch_id' => '蔄äø',
'Class:lnkDocumentToPatch/Attribute:patch_id+' => '',
@@ -1165,7 +1165,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkSoftwareInstanceToSoftwarePatch' => 'é¾ę„ 软件å®ä¾ / 软件蔄äø',
+ 'Class:lnkSoftwareInstanceToSoftwarePatch' => ' å
³č 软件å®ä¾/软件蔄äø',
'Class:lnkSoftwareInstanceToSoftwarePatch+' => '',
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id' => '软件蔄äø',
'Class:lnkSoftwareInstanceToSoftwarePatch/Attribute:softwarepatch_id+' => '',
@@ -1182,7 +1182,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkFunctionalCIToOSPatch' => 'é¾ę„ åč½é”¹ / ęä½ē³»ē»č”„äø',
+ 'Class:lnkFunctionalCIToOSPatch' => 'å
³č åč½é”¹/ęä½ē³»ē»č”„äø',
'Class:lnkFunctionalCIToOSPatch+' => '',
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id' => 'ęä½ē³»ē»č”„äø',
'Class:lnkFunctionalCIToOSPatch/Attribute:ospatch_id+' => '',
@@ -1199,7 +1199,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkDocumentToSoftware' => 'é¾ę„ ę攣 / 软件',
+ 'Class:lnkDocumentToSoftware' => 'å
³č ę攣/软件',
'Class:lnkDocumentToSoftware+' => '',
'Class:lnkDocumentToSoftware/Attribute:software_id' => '软件',
'Class:lnkDocumentToSoftware/Attribute:software_id+' => '',
@@ -1241,7 +1241,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:VLAN' => 'VLAN',
'Class:VLAN+' => '',
- 'Class:VLAN/Attribute:vlan_tag' => 'VLAN ę č®°',
+ 'Class:VLAN/Attribute:vlan_tag' => 'VLANę č®°',
'Class:VLAN/Attribute:vlan_tag+' => '',
'Class:VLAN/Attribute:description' => 'ęčæ°',
'Class:VLAN/Attribute:description+' => '',
@@ -1260,7 +1260,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkSubnetToVLAN' => 'é¾ę„ åē½ / VLAN',
+ 'Class:lnkSubnetToVLAN' => 'å
³č åē½/VLAN',
'Class:lnkSubnetToVLAN+' => '',
'Class:lnkSubnetToVLAN/Attribute:subnet_id' => 'åē½',
'Class:lnkSubnetToVLAN/Attribute:subnet_id+' => '',
@@ -1292,13 +1292,13 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:IPInterface' => 'IP Interface',
+ 'Class:IPInterface' => 'IPę„å£',
'Class:IPInterface+' => '',
- 'Class:IPInterface/Attribute:ipaddress' => 'IP å°å',
+ 'Class:IPInterface/Attribute:ipaddress' => 'IPå°å',
'Class:IPInterface/Attribute:ipaddress+' => '',
- 'Class:IPInterface/Attribute:macaddress' => 'MAC å°å',
+ 'Class:IPInterface/Attribute:macaddress' => 'MACå°å',
'Class:IPInterface/Attribute:macaddress+' => '',
'Class:IPInterface/Attribute:comment' => '注é',
'Class:IPInterface/Attribute:coment+' => '',
@@ -1330,7 +1330,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkPhysicalInterfaceToVLAN' => 'é¾ę„ ē©ēē½å” / VLAN',
+ 'Class:lnkPhysicalInterfaceToVLAN' => 'å
³č ē©ēē½å”/VLAN',
'Class:lnkPhysicalInterfaceToVLAN+' => '',
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id' => 'ē©ēē½å”',
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_id+' => '',
@@ -1342,7 +1342,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:lnkPhysicalInterfaceToVLAN/Attribute:physicalinterface_device_name+' => '',
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id' => 'VLAN',
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_id+' => '',
- 'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag' => 'VLAN ę č®°',
+ 'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag' => 'VLANę č®°',
'Class:lnkPhysicalInterfaceToVLAN/Attribute:vlan_tag+' => '',
));
@@ -1384,7 +1384,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkConnectableCIToNetworkDevice' => 'é¾ę„ åÆčæę„锹 / ē½ē»č®¾å¤',
+ 'Class:lnkConnectableCIToNetworkDevice' => 'å
³č åÆčæę„锹/ē½ē»č®¾å¤',
'Class:lnkConnectableCIToNetworkDevice+' => '',
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id' => 'ē½ē»č®¾å¤',
'Class:lnkConnectableCIToNetworkDevice/Attribute:networkdevice_id+' => '',
@@ -1411,7 +1411,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkApplicationSolutionToFunctionalCI' => 'é¾ę„ åŗēØę¹ę” / åč½é”¹',
+ 'Class:lnkApplicationSolutionToFunctionalCI' => 'å
³č åŗēØę¹ę”/åč½é”¹',
'Class:lnkApplicationSolutionToFunctionalCI+' => '',
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id' => 'åŗēØę¹ę”',
'Class:lnkApplicationSolutionToFunctionalCI/Attribute:applicationsolution_id+' => '',
@@ -1428,7 +1428,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkApplicationSolutionToBusinessProcess' => 'é¾ę„ åŗēØę¹ę” / äøå”ęµēØ',
+ 'Class:lnkApplicationSolutionToBusinessProcess' => 'å
³č åŗēØę¹ę”/äøå”ęµēØ',
'Class:lnkApplicationSolutionToBusinessProcess+' => '',
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_id' => 'äøå”ęµēØ',
'Class:lnkApplicationSolutionToBusinessProcess/Attribute:businessprocess_id+' => '',
@@ -1470,8 +1470,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Group/Attribute:parent_id+' => '',
'Class:Group/Attribute:parent_name' => 'åē§°',
'Class:Group/Attribute:parent_name+' => '',
- 'Class:Group/Attribute:ci_list' => 'é¾ę„ēé
置锹',
- 'Class:Group/Attribute:ci_list+' => '评ē»å
³čēęęé
置锹',
+ 'Class:Group/Attribute:ci_list' => 'å
³čēé
置锹',
+ 'Class:Group/Attribute:ci_list+' => 'ę¤ē»å
³čēęęé
置锹',
'Class:Group/Attribute:parent_id_friendlyname' => 'äøēŗ§é
ē½®ē»',
'Class:Group/Attribute:parent_id_friendlyname+' => '',
));
@@ -1481,7 +1481,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkGroupToCI' => 'é¾ę„ é
ē½®ē» / é
置锹',
+ 'Class:lnkGroupToCI' => 'å
³č é
ē½®ē»/é
置锹',
'Class:lnkGroupToCI+' => '',
'Class:lnkGroupToCI/Attribute:group_id' => 'ē»',
'Class:lnkGroupToCI/Attribute:group_id+' => '',
@@ -1505,8 +1505,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Server:power' => 'ēµåä¾åŗ',
'Class:Subnet/Tab:IPUsage' => 'IP 使ēØē',
'Class:Subnet/Tab:IPUsage-explain' => 'ē½å”IPčå“: %1$s å° %2$s ',
- 'Class:Subnet/Tab:FreeIPs' => 'ē©ŗé² IP',
- 'Class:Subnet/Tab:FreeIPs-count' => 'ē©ŗé² IP: %1$s',
+ 'Class:Subnet/Tab:FreeIPs' => '空é²IP',
+ 'Class:Subnet/Tab:FreeIPs-count' => '空é²IP: %1$s',
'Class:Subnet/Tab:FreeIPs-explain' => '仄äøęÆę½åē10个空é²IP',
'Class:Document:PreviewTab' => 'é¢č§',
));
@@ -1517,7 +1517,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:lnkDocumentToFunctionalCI' => 'é¾ę„ ę攣 / åč½é”¹',
+ 'Class:lnkDocumentToFunctionalCI' => 'å
³č ę攣/åč½é”¹',
'Class:lnkDocumentToFunctionalCI+' => '',
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id' => 'åč½é”¹',
'Class:lnkDocumentToFunctionalCI/Attribute:functionalci_id+' => '',
@@ -1574,7 +1574,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Menu:ConfigManagement:Misc' => 'ę锹',
'Menu:Group' => 'é
ē½®ē»',
'Menu:Group+' => 'é
ē½®ē»',
- 'Menu:OSVersion' => 'OS ēę¬',
+ 'Menu:OSVersion' => 'OSēę¬',
'Menu:OSVersion+' => '',
'Menu:Software' => '软件ęø
å',
'Menu:Software+' => '软件ęø
å',
diff --git a/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php b/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php
index 050bf7996..20d3e9c04 100644
--- a/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php
+++ b/datamodels/2.x/itop-core-update/dictionaries/zh_cn.dict.itop-core-update.php
@@ -25,7 +25,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'itop-core-update:UI:SelectUpdateFile' => 'åŗēØåēŗ§',
'itop-core-update:UI:ConfirmUpdate' => ' åēŗ§',
'itop-core-update:UI:UpdateCoreFiles' => 'åŗēØåēŗ§',
- 'iTopUpdate:UI:MaintenanceModeActive' => 'The application is currently under maintenance, no user can access the application. You have to run a setup or restore the application archive to return in normal mode.~~',
+ 'iTopUpdate:UI:MaintenanceModeActive' => 'ę¤åŗēØå½å结ę¤äø,äøå
许任ä½ēØę·č®æé®.åæ
é”»čæč”å®č£
ęę¢å¤å½ę”£ę„使å
¶å¤äŗę£åøøęØ”å¼.',
'itop-core-update:UI:UpdateDone' => 'åŗēØåēŗ§',
'itop-core-update/Operation:SelectUpdateFile/Title' => 'åŗēØåēŗ§',
@@ -94,15 +94,15 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'iTopUpdate:Error:MissingFunction' => 'ę ę³å¼å§åēŗ§, åč½ē¼ŗå¤±',
'iTopUpdate:Error:MissingFile' => 'ē¼ŗå°ęä»¶: %1$s',
'iTopUpdate:Error:CorruptedFile' => 'ęä»¶ %1$s å·²ęå',
- 'iTopUpdate:Error:BadFileFormat' => 'äøä¼ ēäøęÆzip ęä»¶',
+ 'iTopUpdate:Error:BadFileFormat' => 'äøä¼ ēäøęÆzipę ¼å¼ēęä»¶',
'iTopUpdate:Error:BadFileContent' => 'åēŗ§ęä»¶äøęÆēØåŗåēŗ§å
',
'iTopUpdate:Error:BadItopProduct' => 'åēŗ§ęä»¶äøęØēē³»ē»äøå
¼å®¹',
'iTopUpdate:Error:Copy' => 'é误, ę ę³å¤å¶ \'%1$s\' å° \'%2$s\'',
'iTopUpdate:Error:FileNotFound' => 'ęä»¶ę¾äøå°',
'iTopUpdate:Error:NoFile' => 'ę²”ęęä¾ęä»¶',
- 'iTopUpdate:Error:InvalidToken' => 'ę ęē token',
+ 'iTopUpdate:Error:InvalidToken' => 'ę ęētoken',
'iTopUpdate:Error:UpdateFailed' => 'å级失蓄',
- 'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => 'äøä¼ äøé太å°. 请č°ę“ PHP é
ē½®.',
+ 'iTopUpdate:Error:FileUploadMaxSizeTooSmall' => 'äøä¼ äøé太å°. 请č°ę“PHPé
ē½®.',
'iTopUpdate:UI:RestoreArchive' => 'ęØåÆä»„ä»å½ę”£ęä»¶ \'%1$s\' čæååŗēØēØåŗ',
'iTopUpdate:UI:RestoreBackup' => 'ęØåÆä»„ä» \'%1$s\' čæåę°ę®åŗ',
diff --git a/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php b/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php
index 0fdf768c3..fb23d2945 100644
--- a/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php
+++ b/datamodels/2.x/itop-faq-light/dictionaries/zh_cn.dict.itop-faq-light.php
@@ -62,7 +62,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:FAQ/Attribute:error_code+' => '',
'Class:FAQ/Attribute:key_words' => 'å
³é®å',
'Class:FAQ/Attribute:key_words+' => '',
- 'Class:FAQ/Attribute:domains' => 'é¢å~~',
+ 'Class:FAQ/Attribute:domains' => 'čå“',
));
//
@@ -70,19 +70,19 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:FAQCategory' => 'FAQ ē±»å«',
- 'Class:FAQCategory+' => 'FAQ ē±»å«',
+ 'Class:FAQCategory' => 'FAQē±»å«',
+ 'Class:FAQCategory+' => 'FAQē±»å«',
'Class:FAQCategory/Attribute:name' => 'åē§°',
'Class:FAQCategory/Attribute:name+' => '',
'Class:FAQCategory/Attribute:faq_list' => 'FAQ',
- 'Class:FAQCategory/Attribute:faq_list+' => '评类å«FAQ ēøå
³ēęęåøøč§é®é¢',
+ 'Class:FAQCategory/Attribute:faq_list+' => 'ę¤ē±»å«FAQ ēøå
³ēęęåøøč§é®é¢',
));
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Menu:ProblemManagement' => 'é®é¢ē®”ē',
'Menu:ProblemManagement+' => 'é®é¢ē®”ē',
'Menu:Problem:Shortcuts' => 'åæ«ę·ę¹å¼',
'Menu:FAQCategory' => 'FAQ ē±»å«',
- 'Menu:FAQCategory+' => 'ęęFAQ ē±»å«',
+ 'Menu:FAQCategory+' => 'ęęFAQē±»å«',
'Menu:FAQ' => 'FAQ',
'Menu:FAQ+' => 'ęęFAQ',
'Brick:Portal:FAQ:Menu' => 'FAQ',
diff --git a/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php b/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php
index 3693ede2d..d751da9f0 100644
--- a/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php
+++ b/datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php
@@ -24,7 +24,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
// Errors
'FilesInformation:Error:MissingFile' => 'ę件丢失: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'ęä»¶ %1$s å·²ęå',
- 'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
+ 'FilesInformation:Error:ListCorruptedFile' => 'å·²ęåēęä»¶: %1$s',
'FilesInformation:Error:CantWriteToFile' => 'ęä»¶ %1$s ę ę³åå
„',
));
diff --git a/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml b/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml
index b28f107b7..65b2cbb12 100644
--- a/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml
+++ b/datamodels/2.x/itop-hub-connector/datamodel.itop-hub-connector.xml
@@ -15,12 +15,13 @@
https://www.itophub.io
- /my-instances/landing-from-remote
- /stateless-remote-itop/landing-from-remote-stateless
- /api/messages
- /api/messages/mark-all-as-read
- /messages
+ /my-instances/landing-from-remote
+ /stateless-remote-itop/landing-from-remote-stateless
+ /api/messages
+ /api/messages/mark-all-as-read
+ /messages
../pages/exec.php?exec_module=itop-hub-connector&exec_page=launch.php&target=inform_after_setup
+ https://www.itophub.io/page/data-privacy
diff --git a/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php b/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php
index 1bbab2eaa..47b79401b 100644
--- a/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php
+++ b/datamodels/2.x/itop-hub-connector/dictionaries/zh_cn.dict.itop-hub-connector.php
@@ -23,46 +23,46 @@
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
// Dictionary entries go here
'Menu:iTopHub' => 'iTop Hub',
- 'Menu:iTopHub:Register' => 'čæå
„ iTop Hub ',
- 'Menu:iTopHub:Register+' => 'čæå
„ iTop Hub ę“ę°ęØēē»ä»¶',
- 'Menu:iTopHub:Register:Description' => 'čæå
„ iTop Hub 社åŗå¹³å°!寻ę¾ęØę³č¦ēå
容åäæ”ęÆ, ē®”ēę¬ęŗę©å±ęå®č£
ę°ēę©å±. éčæčæäøŖé”µé¢čæę„å°iTop Hub, ę¬ęŗēäæ”ęÆä¹ä¼č¢«ęØéå° iTop Hub äø.
',
+ 'Menu:iTopHub:Register' => 'čæå
„iTop Hub',
+ 'Menu:iTopHub:Register+' => 'čæå
„iTop Hubę“ę°ęØēē»ä»¶',
+ 'Menu:iTopHub:Register:Description' => 'čæå
„iTop Hub社åŗå¹³å°!寻ę¾ęØę³č¦ēå
容åäæ”ęÆ, ē®”ēę¬ęŗę©å±ęå®č£
ę°ēę©å±. éčæčæäøŖé”µé¢čæę„å°iTop Hub, ę¬ęŗēäæ”ęÆä¹ä¼č¢«ęØéå° iTop Hub äø.
',
'Menu:iTopHub:MyExtensions' => 'å·²å®č£
ēę©å±',
'Menu:iTopHub:MyExtensions+' => 'ę„ēę¬ęŗå·²å®č£
ēę©å±',
- 'Menu:iTopHub:BrowseExtensions' => 'ä» iTop Hub č·åę©å±',
- 'Menu:iTopHub:BrowseExtensions+' => 'å» iTop Hub ęµč§ę“å¤ēę©å±',
- 'Menu:iTopHub:BrowseExtensions:Description' => 'čæå
„ iTop Hub ååŗ, äøē«å¼ę„ę¾åē§iTop ę©å±ēå°ę¹ !寻ę¾ē¬¦åęØč¦ę±ēę©å±. éčæčæäøŖé”µé¢čæę„å°iTop Hub, ę¬ęŗēäæ”ęÆä¹ä¼č¢«ęØéå° iTop Hub äø.
',
+ 'Menu:iTopHub:BrowseExtensions' => 'ä»iTop Hubč·åę©å±',
+ 'Menu:iTopHub:BrowseExtensions+' => 'å»iTop Hubęµč§ę“å¤ēę©å±',
+ 'Menu:iTopHub:BrowseExtensions:Description' => 'čæå
„iTop Hubååŗ, äøē«å¼ę„ę¾åē§iTopę©å±ēå°ę¹ !寻ę¾ē¬¦åęØč¦ę±ēę©å±. éčæčæäøŖé”µé¢čæę„å°iTop Hub, ę¬ęŗēäæ”ęÆä¹ä¼č¢«ęØéå° iTop Hub äø.
',
'iTopHub:GoBtn' => 'čæå
„iTop Hub',
'iTopHub:CloseBtn' => 'å
³é',
'iTopHub:GoBtn:Tooltip' => 'č·³å° www.itophub.io',
- 'iTopHub:OpenInNewWindow' => 'ä»ę°ēŖå£ęå¼ iTop Hub',
- 'iTopHub:AutoSubmit' => 'äøå询é®. äøę¬”čŖåØčæå
„ iTop Hub .',
+ 'iTopHub:OpenInNewWindow' => 'ä»ę°ēŖå£ęå¼iTop Hub',
+ 'iTopHub:AutoSubmit' => 'äøå询é®. äøę¬”čŖåØčæå
„iTop Hub .',
'UI:About:RemoteExtensionSource' => 'iTop Hub',
- 'iTopHub:Explanation' => 'ē¹å»čæäøŖęé®ęØå°č¢«å¼åÆ¼č³ iTop Hub.',
+ 'iTopHub:Explanation' => 'ē¹å»čæäøŖęé®ęØå°č¢«å¼åƼč³iTop Hub.',
- 'iTopHub:BackupFreeDiskSpaceIn' => '%1$s free disk space in %2$s.',
- 'iTopHub:FailedToCheckFreeDiskSpace' => 'ę£ę„空é²ēē£ē空é“失蓄.',
+ 'iTopHub:BackupFreeDiskSpaceIn' => '%1$s åÆēØē£ē空é“ä½äŗ %2$s.',
+ 'iTopHub:FailedToCheckFreeDiskSpace' => 'ę£ę„åÆēØē£ē空é“失蓄.',
'iTopHub:BackupOk' => 'å¤ä»½ęå.',
'iTopHub:BackupFailed' => 'å¤ä»½å¤±č“„!',
'iTopHub:Landing:Status' => 'å®č£
ē¶ę',
'iTopHub:Landing:Install' => 'ę©å±å®č£
čæč”äø...',
'iTopHub:CompiledOK' => 'ē¼čÆęå.',
- 'iTopHub:ConfigurationSafelyReverted' => 'å®č£
ę¶åēé误! iTop é
ē½®å°äøä¼ę¹å.',
+ 'iTopHub:ConfigurationSafelyReverted' => 'å®č£
ę¶åēé误! iTopé
ē½®å°äøä¼ę¹å.',
'iTopHub:FailAuthent' => '认čÆå¤±č“„.',
'iTopHub:InstalledExtensions' => 'ę¬ęŗå·²å®č£
ēę©å±',
'iTopHub:ExtensionCategory:Manual' => 'ęåØå®č£
ēę©å±',
'iTopHub:ExtensionCategory:Manual+' => 'äøåå·²å®č£
ēę©å±ęÆęåØå°ęä»¶ę¾ē½®å° %1$s ē®å½ē:',
- 'iTopHub:ExtensionCategory:Remote' => 'ä» iTop Hub å®č£
ēę©å±',
- 'iTopHub:ExtensionCategory:Remote+' => 'äøåå·²å®č£
ēę©å±ęÆę„čŖ iTop Hub:',
+ 'iTopHub:ExtensionCategory:Remote' => 'ä»iTop Hub å®č£
ēę©å±',
+ 'iTopHub:ExtensionCategory:Remote+' => 'äøåå·²å®č£
ēę©å±ęÆę„čŖiTop Hub:',
'iTopHub:NoExtensionInThisCategory' => 'å°ęŖå®č£
ę©å±',
- 'iTopHub:NoExtensionInThisCategory+' => 'ęµč§ iTop Hub ,å»åÆ»ę¾ē¬¦åęØå欢ēę©å±å§.',
+ 'iTopHub:NoExtensionInThisCategory+' => 'ęµč§iTop Hub,å»åÆ»ę¾ē¬¦åęØå欢ēę©å±å§.',
'iTopHub:ExtensionNotInstalled' => 'ęŖå®č£
',
- 'iTopHub:GetMoreExtensions' => 'ä» iTop Hub č·åę©å±...',
+ 'iTopHub:GetMoreExtensions' => 'ä»iTop Hubč·åę©å±...',
- 'iTopHub:LandingWelcome' => 'ęå! äøåę„čŖ iTop Hub ēę©å±å·²č¢«äøč½½å¹¶å®č£
å°ę¬ęŗ.',
+ 'iTopHub:LandingWelcome' => 'ęå! äøåę„čŖiTop Hubēę©å±å·²č¢«äøč½½å¹¶å®č£
å°ę¬ęŗ.',
'iTopHub:GoBackToITopBtn' => 'čæå'.ITOP_APPLICATION_SHORT,
'iTopHub:Uncompressing' => 'ę©å±č§£åäø...',
- 'iTopHub:InstallationWelcome' => 'å®č£
ę„čŖ iTop Hub ēę©å±',
+ 'iTopHub:InstallationWelcome' => 'å®č£
ę„čŖiTop Hubēę©å±',
'iTopHub:DBBackupLabel' => 'ę¬ęŗå¤ä»½',
'iTopHub:DBBackupSentence' => 'åØåēŗ§ä¹å,å¤ä»½ę°ę®åŗå '.ITOP_APPLICATION_SHORT.' é
ē½®ęä»¶',
'iTopHub:DeployBtn' => 'å®č£
!',
@@ -75,7 +75,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'iTopHub:InstallationProgress:DatabaseBackup' => ITOP_APPLICATION_SHORT.' ę¬ęŗå¤ä»½...',
'iTopHub:InstallationProgress:ExtensionsInstallation' => 'å®č£
ę©å±',
'iTopHub:InstallationEffect:MissingDependencies' => 'ę©å±ę ę³å®č£
,å äøŗęŖē„ēä¾čµ.',
- 'iTopHub:InstallationEffect:MissingDependencies_Details' => '评ę©å±ä¾čµęØ”å: %1$s',
+ 'iTopHub:InstallationEffect:MissingDependencies_Details' => 'ę¤ę©å±ä¾čµęØ”å: %1$s',
'iTopHub:InstallationProgress:InstallationSuccessful' => 'å®č£
ęå!',
'iTopHub:InstallationStatus:Installed_Version' => '%1$s ēę¬: %2$s.',
diff --git a/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php b/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php
index 432c10d96..575bbd61e 100644
--- a/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php
+++ b/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/zh_cn.dict.itop-incident-mgmt-itil.php
@@ -116,8 +116,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Incident/Attribute:origin/Value:monitoring+' => 'ēę§',
'Class:Incident/Attribute:origin/Value:phone' => 'ēµčÆ',
'Class:Incident/Attribute:origin/Value:phone+' => 'ēµčÆ',
- 'Class:Incident/Attribute:origin/Value:portal' => 'portal',
- 'Class:Incident/Attribute:origin/Value:portal+' => 'portal',
+ 'Class:Incident/Attribute:origin/Value:portal' => 'éØę·',
+ 'Class:Incident/Attribute:origin/Value:portal+' => 'éØę·',
'Class:Incident/Attribute:service_id' => 'ęå”',
'Class:Incident/Attribute:service_id+' => '',
'Class:Incident/Attribute:service_name' => 'ęå”åē§°',
@@ -164,8 +164,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Incident/Attribute:resolution_code+' => '',
'Class:Incident/Attribute:resolution_code/Value:assistance' => 'å¤éØęÆę',
'Class:Incident/Attribute:resolution_code/Value:assistance+' => 'å¤éØęÆę',
- 'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'bug äæ®å¤',
- 'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => 'bug äæ®å¤',
+ 'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'ē¼ŗé·äæ®å¤',
+ 'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => 'ē¼ŗé·äæ®å¤',
'Class:Incident/Attribute:resolution_code/Value:hardware repair' => '甬件结修',
'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => '甬件结修',
'Class:Incident/Attribute:resolution_code/Value:other' => 'å
¶å®',
@@ -188,14 +188,14 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Incident/Attribute:parent_change_id+' => '',
'Class:Incident/Attribute:parent_change_ref' => 'åę“ē¼å·',
'Class:Incident/Attribute:parent_change_ref+' => '',
- 'Class:Incident/Attribute:parent_problem_id' => 'Parent problem id~~',
+ 'Class:Incident/Attribute:parent_problem_id' => 'ē¶ēŗ§é®é¢',
'Class:Incident/Attribute:parent_problem_id+' => '~~',
- 'Class:Incident/Attribute:parent_problem_ref' => 'Parent problem ref~~',
+ 'Class:Incident/Attribute:parent_problem_ref' => 'ē¶ēŗ§é®é¢ē¼å·',
'Class:Incident/Attribute:parent_problem_ref+' => '~~',
'Class:Incident/Attribute:related_request_list' => 'ēøå
³éę±',
- 'Class:Incident/Attribute:related_request_list+' => '评äŗä»¶ēøå
³ēęęéę±',
+ 'Class:Incident/Attribute:related_request_list+' => 'ę¤äŗä»¶ēøå
³ēęęéę±',
'Class:Incident/Attribute:child_incidents_list' => 'č”ēäŗä»¶',
- 'Class:Incident/Attribute:child_incidents_list+' => '评äŗä»¶ēøå
³ēęęåäŗä»¶',
+ 'Class:Incident/Attribute:child_incidents_list+' => 'ę¤äŗä»¶ēøå
³ēęęåäŗä»¶',
'Class:Incident/Attribute:public_log' => 'čÆč®ŗ',
'Class:Incident/Attribute:public_log+' => '',
'Class:Incident/Attribute:user_satisfaction' => 'ēØę·ę»”ęåŗ¦',
@@ -210,7 +210,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Incident/Attribute:user_satisfaction/Value:4+' => 'éåøøäøę»”ę',
'Class:Incident/Attribute:user_comment' => 'ēØę·čÆč®ŗ',
'Class:Incident/Attribute:user_comment+' => '',
- 'Class:Incident/Attribute:parent_incident_id_friendlyname' => '儽记ēē¶ēŗ§äŗä»¶IDåē§°',
+ 'Class:Incident/Attribute:parent_incident_id_friendlyname' => 'ē¶ēŗ§äŗä»¶åē§°',
'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '',
'Class:Incident/Stimulus:ev_assign' => 'åé
',
'Class:Incident/Stimulus:ev_assign+' => '',
diff --git a/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php b/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php
index 133cb62cb..ee1ec3a1c 100644
--- a/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php
+++ b/datamodels/2.x/itop-knownerror-mgmt/dictionaries/zh_cn.dict.itop-knownerror-mgmt.php
@@ -85,9 +85,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:KnownError/Attribute:version' => 'ēę¬',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => 'é
置锹',
- 'Class:KnownError/Attribute:ci_list+' => '评已ē„é误ēøå
³ēęęé
置锹',
+ 'Class:KnownError/Attribute:ci_list+' => 'ę¤å·²ē„é误ēøå
³ēęęé
置锹',
'Class:KnownError/Attribute:document_list' => 'ę攣',
- 'Class:KnownError/Attribute:document_list+' => '评已ē„é误ēøå
³ēęęę攣',
+ 'Class:KnownError/Attribute:document_list+' => 'ę¤å·²ē„é误ēøå
³ēęęę攣',
));
//
diff --git a/datamodels/2.x/itop-oauth-client/README.md b/datamodels/2.x/itop-oauth-client/README.md
new file mode 100644
index 000000000..a520ac75c
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/README.md
@@ -0,0 +1,2 @@
+# Extension OAuth 2.0 client
+
diff --git a/datamodels/2.x/itop-oauth-client/ajax.php b/datamodels/2.x/itop-oauth-client/ajax.php
new file mode 100644
index 000000000..1b81b0829
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/ajax.php
@@ -0,0 +1,24 @@
+= 0) {
+ $sTemplates = MODULESROOT.'itop-oauth-client/templates';
+} else {
+ $sTemplates = MODULESROOT.'itop-oauth-client/templates/legacy';
+}
+
+$oUpdateController = new AjaxOauthClientController($sTemplates, 'itop-oauth-client');
+$oUpdateController->AllowOnlyAdmin();
+$oUpdateController->SetDefaultOperation('CreateMailbox');
+$oUpdateController->HandleOperation();
+
+
diff --git a/images/icons/icons8-azure.svg b/datamodels/2.x/itop-oauth-client/assets/img/icons8-azure.svg
similarity index 100%
rename from images/icons/icons8-azure.svg
rename to datamodels/2.x/itop-oauth-client/assets/img/icons8-azure.svg
diff --git a/images/icons/icons8-google.svg b/datamodels/2.x/itop-oauth-client/assets/img/icons8-google.svg
similarity index 100%
rename from images/icons/icons8-google.svg
rename to datamodels/2.x/itop-oauth-client/assets/img/icons8-google.svg
diff --git a/datamodels/2.x/itop-oauth-client/assets/js/oauth_connect.js b/datamodels/2.x/itop-oauth-client/assets/js/oauth_connect.js
new file mode 100644
index 000000000..1ce571112
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/assets/js/oauth_connect.js
@@ -0,0 +1,99 @@
+/**
+ * @copyright Copyright (C) 2010-2022 Combodo SARL
+ * @license http://opensource.org/licenses/AGPL-3.0
+ */
+
+// Function used to open OAuth popup
+var oWindowObjectReference = null;
+var sPreviousUrl = null;
+var oListener = null;
+var sOAuthAjaxURI = null;
+var sOAuthObjClass = null;
+var sOAuthObjKey = null;
+var sOAuthReturnURI = null;
+
+
+const oOnOauthSuccess = function (event) {
+ if (oListener !== null) {
+ clearInterval(oListener);
+ }
+
+ $.post(
+ sOAuthAjaxURI,
+ {
+ operation: 'GetDisplayAuthenticationResults',
+ class: sOAuthObjClass,
+ id: sOAuthObjKey,
+ redirect_url: event.data
+ },
+ function (oData) {
+ window.location = oData.data;
+ }
+ );
+}
+const oOpenSignInWindow = function (url, name) {
+ // Remove any existing event listener
+ window.removeEventListener('message', oOnOauthSuccess);
+ if (oListener !== null) {
+ clearInterval(oListener);
+ }
+
+ // Window features
+ const sWindowFeatures = 'toolbar=no, menubar=no, width=600, height=700, top=100, left=100';
+
+ if (oWindowObjectReference === null || oWindowObjectReference.closed) {
+ /* If the pointer to the window object in memory does not exist
+ or if such pointer exists but the window was closed */
+ oWindowObjectReference = window.open(url, name, sWindowFeatures);
+ } else if (sPreviousUrl !== url) {
+ /* If the resource to load is different,
+ then we load it in the already opened secondary window, and then
+ we bring such window back on top/in front of its parent window. */
+ oWindowObjectReference = window.open(url, name, sWindowFeatures);
+ oWindowObjectReference.focus();
+ } else {
+ /* Else the window reference must exist and the window
+ is not closed; therefore, we can bring it back on top of any other
+ window with the focus() method. There would be no need to re-create
+ the window or to reload the referenced resource. */
+ oWindowObjectReference.focus();
+ }
+ /* Let know every second our child window that we're waiting for it to complete,
+ once we reach our landing page, it'll send us a reply
+ */
+ oListener = window.setInterval(function () {
+ if (oWindowObjectReference.closed) {
+ clearInterval(oListener);
+ }
+ oWindowObjectReference.postMessage('anyone', sOAuthReturnURI);
+ }, 1000);
+
+ /* Once we receive a response, transmit it to the server to get authenticate and display
+ results
+ */
+ window.addEventListener('message', oOnOauthSuccess, false);
+ // Assign the previous URL
+ sPreviousUrl = url;
+};
+
+
+const OAuthConnect = function(sClass, sId, sAjaxUri, sReturnUri) {
+ sOAuthAjaxURI = sAjaxUri;
+ sOAuthObjClass = sClass;
+ sOAuthObjKey = sId;
+ sOAuthReturnURI = sReturnUri;
+
+ $.post(
+ sOAuthAjaxURI,
+ {
+ operation: 'GetOAuthAuthorizationUrl',
+ class: sOAuthObjClass,
+ id: sOAuthObjKey
+ },
+ function (oData) {
+ if (oData.status === 'success') {
+ oOpenSignInWindow(oData.data.authorization_url, 'OAuth authorization')
+ }
+ }
+ );
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/composer.json b/datamodels/2.x/itop-oauth-client/composer.json
new file mode 100644
index 000000000..f12b85530
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/composer.json
@@ -0,0 +1,16 @@
+{
+ "config": {
+ "classmap-authoritative": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Combodo\\iTop\\OAuthClient\\": "src"
+ }
+ },
+ "name": "combodo/itop-oauth-client",
+ "type": "itop-extension",
+ "description": "Remote authentication for OAuth 2.0",
+ "require": {
+ "composer-runtime-api": "^2.0"
+ }
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/composer.lock b/datamodels/2.x/itop-oauth-client/composer.lock
new file mode 100644
index 000000000..b1b3d9fd2
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/composer.lock
@@ -0,0 +1,20 @@
+{
+ "_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": "285a4d33f818950c151bb893193d2cce",
+ "packages": [],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "composer-runtime-api": "^2.0"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.1.0"
+}
diff --git a/datamodels/2.x/itop-oauth-client/cs.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/cs.dict.itop-oauth-client.php
new file mode 100644
index 000000000..ac3a5196f
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/cs.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('CS CZ', 'Czech', 'ÄeÅ”tina', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('CS CZ', 'Czech', 'ÄeÅ”tina', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('CS CZ', 'Czech', 'ÄeÅ”tina', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/da.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/da.dict.itop-oauth-client.php
new file mode 100644
index 000000000..5bcb967ee
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/da.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('DA DA', 'Danish', 'Dansk', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('DA DA', 'Danish', 'Dansk', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('DA DA', 'Danish', 'Dansk', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml b/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml
new file mode 100644
index 000000000..70c6eeeea
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml
@@ -0,0 +1,301 @@
+
+
+
+
+
+ cmdbAbstractObject
+
+ cloud,searchable
+ true
+ autoincrement
+ priv_oauth_client
+ id
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ provider
+
+ false
+
+
+ name
+
+ false
+
+
+ true
+
+
+ active
+
+
+
+ inactive
+
+
+
+ status
+ inactive
+ false
+
+
+ description
+
+ true
+
+
+ client_id
+
+ false
+
+
+ client_secret
+
+ false
+
+
+ refresh_token
+
+ true
+ none
+
+
+ refresh_token_expiration
+
+ true
+ none
+
+
+ token
+
+ true
+ none
+
+
+ token_expiration
+
+ true
+ none
+
+
+ redirect_url
+
+ _blank
+ true
+
+
+ MailInboxOAuth
+ oauth_client_id
+ 0
+ 0
+
+
+
+
+
+ false
+ public
+ Overload-DBObject
+
+
+
+ false
+ public
+ Overload-DBObject
+
+
+
+ false
+ public
+ Get('provider').'.com';
+ }
+ ]]>
+
+
+ false
+ public
+
+
+
+ false
+ public
+ Get('status') == 'active') {
+ return new \League\OAuth2\Client\Token\AccessToken([
+ 'access_token' => $this->Get('token'),
+ 'expires_in' => date_format(new DateTime($this->Get('token_expiration')), 'U') - time(),
+ 'refresh_token' => $this->Get('refresh_token'),
+ 'token_type' => 'Bearer',
+ ]);
+ }
+ return null;
+ }
+ ]]>
+
+
+ false
+ public
+ Set('token', $oAccessToken->getToken());
+ $this->Set('token_expiration', date(AttributeDateTime::GetSQLFormat(), $oAccessToken->getExpires()));
+ if (!empty($oAccessToken->getRefreshToken())) {
+ $this->Set('refresh_token', $oAccessToken->getRefreshToken());
+ }
+ $this->Set('status', 'active');
+ $this->DBUpdate();
+ }
+ ]]>
+
+
+
+
+
+ -
+
1
+
+ -
+
2
+
+ -
+
3
+
+ -
+
5
+
+ -
+
6
+
+ -
+
7
+
+ -
+
8
+
+
+
+
+
+ -
+
1
+
+ -
+
3
+
+
+
+
+
+ -
+
1
+
+ -
+
2
+
+
+
+
+
+ -
+
1
+
+ -
+
2
+
+
+
+
+
+
+
+
+ 100
+ ConfigurationTools
+
+ 1
+ 0
+ OAuthClient
+ UR_ACTION_READ
+
+
+
+
+
+
+
+
+
diff --git a/datamodels/2.x/itop-oauth-client/de.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/de.dict.itop-oauth-client.php
new file mode 100644
index 000000000..fc7d62765
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/de.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access token...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access token...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('DE DE', 'German', 'Deutsch', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('DE DE', 'German', 'Deutsch', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('DE DE', 'German', 'Deutsch', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php
new file mode 100644
index 000000000..1a91fb173
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php
@@ -0,0 +1,78 @@
+ 'Create a mailbox...',
+ 'Menu:OAuthClient' => 'OAuth Client',
+ 'Menu:OAuthClient+' => '',
+ 'Menu:GenerateTokens' => 'Generate access token...',
+ 'Menu:RegenerateTokens' => 'Regenerate access token...',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP',
+ 'itop-oauth-client:TestSMTP' => 'Email send test',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('EN US', 'English', 'English', [
+ 'Class:OAuthClient' => 'Oauth Client',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider',
+ 'Class:OAuthClient/Attribute:provider+' => '',
+ 'Class:OAuthClient/Attribute:name' => 'Login',
+ 'Class:OAuthClient/Attribute:name+' => '',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope',
+ 'Class:OAuthClient/Attribute:scope+' => '',
+ 'Class:OAuthClient/Attribute:status' => 'Status',
+ 'Class:OAuthClient/Attribute:status+' => '',
+ 'Class:OAuthClient/Attribute:status/Value:active' => 'Access token generated',
+ 'Class:OAuthClient/Attribute:status/Value:inactive' => 'No Access token',
+ 'Class:OAuthClient/Attribute:description' => 'Description',
+ 'Class:OAuthClient/Attribute:description+' => '',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id',
+ 'Class:OAuthClient/Attribute:client_id+' => '',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret',
+ 'Class:OAuthClient/Attribute:client_secret+' => '',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '',
+ 'Class:OAuthClient/Attribute:token' => 'Access token',
+ 'Class:OAuthClient/Attribute:token+' => '',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('EN US', 'English', 'English', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('EN US', 'English', 'English', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/es_cr.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/es_cr.dict.itop-oauth-client.php
new file mode 100644
index 000000000..5baf5dbf9
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/es_cr.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('ES CR', 'Spanish', 'EspaƱol, CastellaƱo', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('ES CR', 'Spanish', 'EspaƱol, CastellaƱo', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('ES CR', 'Spanish', 'EspaƱol, CastellaƱo', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php
new file mode 100644
index 000000000..e8461b535
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php
@@ -0,0 +1,78 @@
+ 'CrƩer une boite mail...',
+ 'Menu:OAuthClient' => 'Client OAuth',
+ 'Menu:OAuthClient+' => '',
+ 'Menu:GenerateTokens' => 'Créer un jeton d\'accès...',
+ 'Menu:RegenerateTokens' => 'Recréer un jeton d\'accès..',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'CrƩation de boite mail',
+
+ 'itop-oauth-client:UsedForSMTP' => 'Ce client Oauth est utilisƩ pour SMTP',
+ 'itop-oauth-client:TestSMTP' => 'Tester l\'envoi de mail',
+ 'itop-oauth-client:MissingOAuthClient' => 'Il n\'y a pas de client OAuth pour l\'utilisateur %1$s',
+ 'itop-oauth-client:Message:MissingToken' => 'Générez le jeton d\'accès avant d\'utiliser ce client OAuth',
+ 'itop-oauth-client:Message:TokenCreated' => 'Le jeton d\'accès à été créé',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Le jeton d\'accès à été renouvelé',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('FR FR', 'French', 'FranƧais', [
+ 'Class:OAuthClient' => 'Client OAuth',
+ 'Class:OAuthClient/Attribute:provider' => 'Fournisseur',
+ 'Class:OAuthClient/Attribute:provider+' => '',
+ 'Class:OAuthClient/Attribute:name' => 'Login',
+ 'Class:OAuthClient/Attribute:name+' => '',
+ 'Class:OAuthClient/Attribute:scope' => 'Niveaux d\'accĆØs',
+ 'Class:OAuthClient/Attribute:scope+' => '',
+ 'Class:OAuthClient/Attribute:description' => 'Description',
+ 'Class:OAuthClient/Attribute:description+' => '',
+ 'Class:OAuthClient/Attribute:client_id' => 'ID Client',
+ 'Class:OAuthClient/Attribute:client_id+' => '',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Code secret du client',
+ 'Class:OAuthClient/Attribute:client_secret+' => '',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Jeton de renouvellement',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Date d\'expiration du jeton de renouvellement',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '',
+ 'Class:OAuthClient/Attribute:token' => 'Jeton d\'accĆØs',
+ 'Class:OAuthClient/Attribute:token+' => '',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Date d\'expiration du jeton d\'accĆØs',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'URL de redirection',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('FR FR', 'French', 'FranƧais', [
+ 'Class:OAuthClientAzure' => 'Client OAuth pour Microsoft Azure',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('FR FR', 'French', 'FranƧais', [
+ 'Class:OAuthClientGoogle' => 'Client OAuth pour Google',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)',
+]);
+
+
+// Additional language entries not present in English dict
+Dict::Add('FR FR', 'French', 'FranƧais', array(
+ 'Class:OAuthClient/Name' => '%1$s-%%2$~',
+));
diff --git a/datamodels/2.x/itop-oauth-client/hu.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/hu.dict.itop-oauth-client.php
new file mode 100644
index 000000000..6c6287f9f
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/hu.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('HU HU', 'Hungarian', 'Magyar', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('HU HU', 'Hungarian', 'Magyar', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('HU HU', 'Hungarian', 'Magyar', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/index.php b/datamodels/2.x/itop-oauth-client/index.php
new file mode 100644
index 000000000..4078be629
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/index.php
@@ -0,0 +1,24 @@
+= 0) {
+ $sTemplates = MODULESROOT.'itop-oauth-client/templates';
+} else {
+ $sTemplates = MODULESROOT.'itop-oauth-client/templates/legacy';
+}
+
+$oUpdateController = new OAuthClientController($sTemplates, 'itop-oauth-client');
+$oUpdateController->AllowOnlyAdmin();
+$oUpdateController->SetDefaultOperation('CreateMailbox');
+$oUpdateController->HandleOperation();
+
+
diff --git a/datamodels/2.x/itop-oauth-client/it.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/it.dict.itop-oauth-client.php
new file mode 100644
index 000000000..bc601ae8b
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/it.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('IT IT', 'Italian', 'Italiano', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('IT IT', 'Italian', 'Italiano', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('IT IT', 'Italian', 'Italiano', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/ja.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/ja.dict.itop-oauth-client.php
new file mode 100644
index 000000000..1a5bdca02
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/ja.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('JA JP', 'Japanese', 'ę„ę¬čŖ', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('JA JP', 'Japanese', 'ę„ę¬čŖ', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('JA JP', 'Japanese', 'ę„ę¬čŖ', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php
new file mode 100644
index 000000000..3e80fcaf3
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php
@@ -0,0 +1,54 @@
+ 'OAuth 2.0 client',
+ 'category' => 'business',
+
+ // Setup
+ //
+ 'dependencies' => array(
+ 'itop-welcome-itil/3.1.0,',
+ ),
+ 'mandatory' => false,
+ 'visible' => true,
+
+ // Components
+ //
+ 'datamodel' => array(
+ 'vendor/autoload.php',
+ 'model.itop-oauth-client.php', // Contains the PHP code generated by the "compilation" of datamodel.remote-authent-oauth.xml
+ 'src/Model/OAuthClientGoogle.php',
+ 'src/Model/OAuthClientAzure.php',
+ 'src/Service/PopupMenuExtension.php',
+ ),
+ 'webservice' => array(
+
+ ),
+ 'data.struct' => array(
+ // add your 'structure' definition XML files here,
+ ),
+ 'data.sample' => array(
+ // add your sample data XML files here,
+ ),
+
+ // Documentation
+ //
+ 'doc.manual_setup' => '', // hyperlink to manual setup documentation, if any
+ 'doc.more_information' => '', // hyperlink to more information, if any
+
+ // Default settings
+ //
+ 'settings' => array(
+ // Module specific settings go here, if any
+ ),
+ )
+);
+
diff --git a/datamodels/2.x/itop-oauth-client/nl.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/nl.dict.itop-oauth-client.php
new file mode 100644
index 000000000..81d390251
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/nl.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('NL NL', 'Dutch', 'Nederlands', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('NL NL', 'Dutch', 'Nederlands', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('NL NL', 'Dutch', 'Nederlands', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/pt_br.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/pt_br.dict.itop-oauth-client.php
new file mode 100644
index 000000000..150ac6fc6
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/pt_br.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/ru.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/ru.dict.itop-oauth-client.php
new file mode 100644
index 000000000..b97fad178
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/ru.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('RU RU', 'Russian', 'Š ŃŃŃŠŗŠøŠ¹', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('RU RU', 'Russian', 'Š ŃŃŃŠŗŠøŠ¹', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('RU RU', 'Russian', 'Š ŃŃŃŠŗŠøŠ¹', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/sk.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/sk.dict.itop-oauth-client.php
new file mode 100644
index 000000000..d1e15cc49
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/sk.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('SK SK', 'Slovak', 'SlovenÄina', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('SK SK', 'Slovak', 'SlovenÄina', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('SK SK', 'Slovak', 'SlovenÄina', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/src/Controller/AjaxOauthClientController.php b/datamodels/2.x/itop-oauth-client/src/Controller/AjaxOauthClientController.php
new file mode 100644
index 000000000..51367d34e
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/src/Controller/AjaxOauthClientController.php
@@ -0,0 +1,77 @@
+ 'success', 'data' => []];
+
+ $sAuthorizationUrl = OAuthClientProviderFactory::GetAuthorizationUrl($oOAuthClient);
+ $aResult['data']['authorization_url'] = $sAuthorizationUrl;
+
+ $this->DisplayJSONPage($aResult);
+ }
+
+ public function OperationGetDisplayAuthenticationResults()
+ {
+ $sClass = utils::ReadParam('class');
+ $sId = utils::ReadParam('id');
+
+ IssueLog::Debug("GetDisplayAuthenticationResults for $sClass::$sId", self::LOG_CHANNEL);
+
+ /** @var \OAuthClient $oOAuthClient */
+ $oOAuthClient = MetaModel::GetObject($sClass, $sId);
+ $bIsCreation = empty($oOAuthClient->Get('token'));
+
+ $sRedirectUrl = utils::ReadParam('redirect_url', '', false, 'raw');
+
+ $sRedirectUrlQuery = parse_url($sRedirectUrl)['query'];
+
+ $aQuery = [];
+ parse_str($sRedirectUrlQuery, $aQuery);
+ $sCode = $aQuery['code'];
+ $oAccessToken = OAuthClientProviderFactory::GetAccessTokenFromCode($oOAuthClient, $sCode);
+
+ $oOAuthClient->SetAccessToken($oAccessToken);
+
+ cmdbAbstractObject::SetSessionMessage(
+ $sClass,
+ $sId,
+ "$sClass:$sId:TokenCreated",
+ $bIsCreation ? Dict::S('itop-oauth-client:Message:TokenCreated') : Dict::S('itop-oauth-client:Message:TokenRecreated'),
+ 'ok',
+ 1,
+ true
+ );
+
+ $aResult = ['status' => 'success'];
+ $aResult['data'] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=details&class=$sClass&id=$sId";
+
+ $this->DisplayJSONPage($aResult);
+ }
+
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/src/Controller/OAuthClientController.php b/datamodels/2.x/itop-oauth-client/src/Controller/OAuthClientController.php
new file mode 100644
index 000000000..26d2b05b6
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/src/Controller/OAuthClientController.php
@@ -0,0 +1,41 @@
+Get('name');
+ $sDefaultServer = $oOAuthClient->GetDefaultMailServer();
+ $sDefaultPort = $oOAuthClient->GetDefaultMailServerPort();
+
+ $aParams['sURL'] = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=new&class=MailInboxOAuth'.
+ '&default[mailbox]=INBOX'.
+ '&default[server]='.$sDefaultServer.
+ '&default[port]='.$sDefaultPort.
+ '&default[oauth_client_id]='.$sId.
+ '&default[login]='.$sLogin;
+
+ $this->DisplayPage($aParams);
+ }
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php
new file mode 100644
index 000000000..eb798e64d
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php
@@ -0,0 +1,128 @@
+ 'cloud',
+ 'key_type' => 'autoincrement',
+ 'name_attcode' => ['name', 'scope'],
+ 'state_attcode' => '',
+ 'reconc_keys' => ['provider', 'name'],
+ 'db_table' => 'priv_oauth_client_azure',
+ 'db_key_field' => 'id',
+ 'icon' => utils::GetAbsoluteUrlModulesRoot().'itop-oauth-client/assets/img/icons8-azure.svg',
+ 'db_finalclass_field' => '',
+ 'uniqueness_rules' => [
+ 'Username for scope' =>
+ [
+ 'attributes' => ['name', 'scope'],
+ 'filter' => null,
+ 'disabled' => false,
+ 'is_blocking' => true,
+ ],
+ 'OAuth Server' =>
+ [
+ 'attributes' => ['provider', 'scope', 'client_id', 'client_secret'],
+ 'filter' => null,
+ 'disabled' => false,
+ 'is_blocking' => true,
+ ],
+ ],
+ ];
+ MetaModel::Init_Params($aParams);
+ MetaModel::Init_InheritAttributes();
+ MetaModel::Init_AddAttribute(new AttributeEnum('scope', [
+ 'allowed_values' => new ValueSetEnum('EMail'),
+ 'display_style' => 'list',
+ 'sql' => 'scope',
+ 'default_value' => 'EMail',
+ 'is_null_allowed' => false,
+ 'depends_on' => [],
+ 'always_load_in_tables' => true,
+ ]));
+
+ MetaModel::Init_SetZListItems('details', [
+ 'name',
+ 'status',
+ 'description',
+ 'provider',
+ 'scope',
+ 'redirect_url',
+ 'client_id',
+ 'client_secret',
+ 'mailbox_list',
+ ]);
+ MetaModel::Init_SetZListItems('standard_search', [
+ 'name',
+ 'provider',
+ 'status',
+ ]);
+ MetaModel::Init_SetZListItems('list', [
+ 'status',
+ 'provider',
+ ]);
+ }
+
+ public function PrefillCreationForm(&$aContextParam)
+ {
+ $this->Set('provider', 'Azure');
+ $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri());
+
+ parent::PrefillCreationForm($aContextParam);
+ }
+
+ /**
+ * Compute read-only values
+ *
+ * @return void
+ * @throws \ArchivedObjectException
+ * @throws \CoreException
+ * @throws \CoreUnexpectedValue
+ */
+ public function ComputeValues()
+ {
+ parent::ComputeValues();
+ if (empty($this->Get('provider'))) {
+ $this->Set('provider', 'Azure');
+ }
+ if (empty($this->Get('redirect_url'))) {
+ $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri());
+ }
+ }
+
+ public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState = '')
+ {
+ if ($sAttCode == 'provider' || $sAttCode == 'redirect_url') {
+ return OPT_ATT_READONLY;
+ }
+
+ return parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState);
+ }
+
+ public function GetInitialStateAttributeFlags($sAttCode, &$aReasons = array())
+ {
+ if ($sAttCode == 'provider' || $sAttCode == 'redirect_url') {
+ return OPT_ATT_READONLY;
+ }
+
+ return parent::GetInitialStateAttributeFlags($sAttCode, $aReasons);
+ }
+
+ public function GetDefaultMailServer()
+ {
+ return 'outlook.office365.com';
+ }
+
+ public function GetScope()
+ {
+ return 'https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send offline_access';
+ }
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php
new file mode 100644
index 000000000..83c111852
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php
@@ -0,0 +1,134 @@
+ 'cloud',
+ 'key_type' => 'autoincrement',
+ 'name_attcode' => ['name', 'scope'],
+ 'state_attcode' => '',
+ 'reconc_keys' => ['provider', 'name'],
+ 'db_table' => 'priv_oauth_client_google',
+ 'db_key_field' => 'id',
+ 'icon' => utils::GetAbsoluteUrlModulesRoot().'itop-oauth-client/assets/img/icons8-google.svg',
+ 'db_finalclass_field' => '',
+ 'uniqueness_rules' => [
+ 'Username for scope' =>
+ [
+ 'attributes' => ['name', 'scope'],
+ 'filter' => null,
+ 'disabled' => false,
+ 'is_blocking' => true,
+ ],
+ 'OAuth Server' =>
+ [
+ 'attributes' => ['provider', 'scope', 'client_id', 'client_secret'],
+ 'filter' => null,
+ 'disabled' => false,
+ 'is_blocking' => true,
+ ],
+ ],
+ );
+ MetaModel::Init_Params($aParams);
+ MetaModel::Init_InheritAttributes();
+ MetaModel::Init_AddAttribute(new AttributeEnum('scope', [
+ 'allowed_values' => new ValueSetEnum('EMail'),
+ 'display_style' => 'list',
+ 'sql' => 'scope',
+ 'default_value' => 'EMail',
+ 'is_null_allowed' => false,
+ 'depends_on' => [],
+ 'always_load_in_tables' => true,
+ ]));
+
+ MetaModel::Init_SetZListItems('details', [
+ 'name',
+ 'status',
+ 'description',
+ 'provider',
+ 'scope',
+ 'redirect_url',
+ 'client_id',
+ 'client_secret',
+ 'mailbox_list',
+ ]);
+ MetaModel::Init_SetZListItems('standard_search', [
+ 'name',
+ 'provider',
+ 'status',
+ ]);
+ MetaModel::Init_SetZListItems('list', [
+ 'status',
+ 'provider',
+ ]);
+ }
+
+ public function PrefillCreationForm(&$aContextParam)
+ {
+ $this->Set('provider', 'Google');
+ $this->Set('scope', 'EMail');
+ $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri());
+
+ parent::PrefillCreationForm($aContextParam);
+ }
+
+ public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState = '')
+ {
+ if ($sAttCode == 'provider' || $sAttCode == 'scope' || $sAttCode == 'redirect_url') {
+ return OPT_ATT_READONLY;
+ }
+
+ return parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState);
+ }
+
+ public function GetInitialStateAttributeFlags($sAttCode, &$aReasons = array())
+ {
+ if ($sAttCode == 'provider' || $sAttCode == 'scope' || $sAttCode == 'redirect_url') {
+ return OPT_ATT_READONLY;
+ }
+
+ return parent::GetInitialStateAttributeFlags($sAttCode, $aReasons);
+ }
+
+ /**
+ * Compute read-only values
+ *
+ * @return void
+ * @throws \ArchivedObjectException
+ * @throws \CoreException
+ * @throws \CoreUnexpectedValue
+ */
+ public function ComputeValues()
+ {
+ parent::ComputeValues();
+ if (empty($this->Get('provider'))) {
+ $this->Set('provider', 'Google');
+ }
+ if (empty($this->Get('redirect_url'))) {
+ $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri());
+ }
+ if (empty($this->Get('scope'))) {
+ $this->Set('scope', 'EMail');
+ }
+ }
+
+
+ public function GetDefaultMailServer()
+ {
+ return 'imap.gmail.com';
+ }
+
+ public function GetScope()
+ {
+ return 'https://mail.google.com/';
+ }
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php b/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php
new file mode 100644
index 000000000..6ca4783b4
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php
@@ -0,0 +1,79 @@
+Get('token'));
+ $aResult[] = new SeparatorPopupMenuItem();
+
+ $oAppContext = new ApplicationContext();
+ $sMenu = $bHasToken ? 'Menu:RegenerateTokens' : 'Menu:GenerateTokens';
+ $sObjClass = get_class($oObj);
+ $sClass = $sObjClass;
+ $sId = $oObj->GetKey();
+ $sAjaxUri = utils::GetAbsoluteUrlModulePage(static::MODULE_CODE, 'ajax.php');
+ // Add a new menu item that triggers a custom JS function defined in our own javascript file: js/sample.js
+ $sJSFileUrl = utils::GetAbsoluteUrlModulesRoot().static::MODULE_CODE.'/assets/js/oauth_connect.js';
+ $sRedirectUri = OAuthClientProviderFactory::GetRedirectUri();
+ $aResult[] = new JSPopupMenuItem(
+ $sMenu.' from '.$sObjClass,
+ Dict::S($sMenu),
+ "OAuthConnect('$sClass', $sId, '$sAjaxUri', '$sRedirectUri')",
+ [$sJSFileUrl]
+ );
+
+ if ($bHasToken) {
+ $sScope = $oObj->Get('scope');
+ if ($sScope == 'EMail') {
+ $aParams = $oAppContext->GetAsHash();
+ $sMenu = 'Menu:CreateMailbox';
+ $sObjClass = get_class($oObj);
+ $aParams['class'] = $sObjClass;
+ $aParams['id'] = $oObj->GetKey();
+ $aParams['operation'] = 'CreateMailbox';
+ $aResult[] = new URLPopupMenuItem(
+ $sMenu.' from '.$sObjClass,
+ Dict::S($sMenu),
+ utils::GetAbsoluteUrlModulePage(static::MODULE_CODE, 'index.php', $aParams)
+ );
+ }
+ }
+ }
+ break;
+
+ default:
+ // Unknown type of menu, do nothing
+ break;
+ }
+
+ return $aResult;
+ }
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.html.twig b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.html.twig
new file mode 100644
index 000000000..578bce7b0
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.html.twig
@@ -0,0 +1,3 @@
+{# @copyright Copyright (C) 2010-2022 Combodo SARL #}
+{# @license http://opensource.org/licenses/AGPL-3.0 #}
+
diff --git a/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.ready.js.twig b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.ready.js.twig
new file mode 100644
index 000000000..8b3d10330
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/templates/legacy/CreateMailbox.ready.js.twig
@@ -0,0 +1,4 @@
+{# @copyright Copyright (C) 2010-2022 Combodo SARL #}
+{# @license http://opensource.org/licenses/AGPL-3.0 #}
+
+window.location.href = '{{ sURL|raw }}'
\ No newline at end of file
diff --git a/datamodels/2.x/itop-oauth-client/tr.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/tr.dict.itop-oauth-client.php
new file mode 100644
index 000000000..8ef119962
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/tr.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('TR TR', 'Turkish', 'Türkçe', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('TR TR', 'Turkish', 'Türkçe', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('TR TR', 'Turkish', 'Türkçe', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-oauth-client/vendor/autoload.php b/datamodels/2.x/itop-oauth-client/vendor/autoload.php
new file mode 100644
index 000000000..d7cdc470f
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/autoload.php
@@ -0,0 +1,7 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier
+ * @author Jordi Boggiano
+ * @see https://www.php-fig.org/psr/psr-0/
+ * @see https://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ /** @var ?string */
+ private $vendorDir;
+
+ // PSR-4
+ /**
+ * @var array[]
+ * @psalm-var array>
+ */
+ private $prefixLengthsPsr4 = array();
+ /**
+ * @var array[]
+ * @psalm-var array>
+ */
+ private $prefixDirsPsr4 = array();
+ /**
+ * @var array[]
+ * @psalm-var array
+ */
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ /**
+ * @var array[]
+ * @psalm-var array>
+ */
+ private $prefixesPsr0 = array();
+ /**
+ * @var array[]
+ * @psalm-var array
+ */
+ private $fallbackDirsPsr0 = array();
+
+ /** @var bool */
+ private $useIncludePath = false;
+
+ /**
+ * @var string[]
+ * @psalm-var array
+ */
+ private $classMap = array();
+
+ /** @var bool */
+ private $classMapAuthoritative = false;
+
+ /**
+ * @var bool[]
+ * @psalm-var array
+ */
+ private $missingClasses = array();
+
+ /** @var ?string */
+ private $apcuPrefix;
+
+ /**
+ * @var self[]
+ */
+ private static $registeredLoaders = array();
+
+ /**
+ * @param ?string $vendorDir
+ */
+ public function __construct($vendorDir = null)
+ {
+ $this->vendorDir = $vendorDir;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
+ }
+
+ return array();
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array>
+ */
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array
+ */
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array
+ */
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ /**
+ * @return string[] Array of classname => path
+ * @psalm-var array
+ */
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param string[] $classMap Class to filename map
+ * @psalm-param array $classMap
+ *
+ * @return void
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param string[]|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @return void
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param string[]|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param string[]|string $paths The PSR-0 base directories
+ *
+ * @return void
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param string[]|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ *
+ * @return void
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ *
+ * @return void
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ *
+ * @return void
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ *
+ * @return void
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+ if (null === $this->vendorDir) {
+ return;
+ }
+
+ if ($prepend) {
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+ } else {
+ unset(self::$registeredLoaders[$this->vendorDir]);
+ self::$registeredLoaders[$this->vendorDir] = $this;
+ }
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ *
+ * @return void
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+
+ if (null !== $this->vendorDir) {
+ unset(self::$registeredLoaders[$this->vendorDir]);
+ }
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return true|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+
+ return null;
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+ return false;
+ }
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if (false === $file && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
+ if (false === $file) {
+ // Remember that this class does not exist.
+ $this->missingClasses[$class] = true;
+ }
+
+ return $file;
+ }
+
+ /**
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ *
+ * @return self[]
+ */
+ public static function getRegisteredLoaders()
+ {
+ return self::$registeredLoaders;
+ }
+
+ /**
+ * @param string $class
+ * @param string $ext
+ * @return string|false
+ */
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath . '\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ if (file_exists($file = $dir . $pathEnd)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
+ return false;
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ *
+ * @param string $file
+ * @return void
+ * @private
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/InstalledVersions.php b/datamodels/2.x/itop-oauth-client/vendor/composer/InstalledVersions.php
new file mode 100644
index 000000000..d50e0c9fc
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/InstalledVersions.php
@@ -0,0 +1,350 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ */
+class InstalledVersions
+{
+ /**
+ * @var mixed[]|null
+ * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null
+ */
+ private static $installed;
+
+ /**
+ * @var bool|null
+ */
+ private static $canGetVendors;
+
+ /**
+ * @var array[]
+ * @psalm-var array}>
+ */
+ private static $installedByVendor = array();
+
+ /**
+ * Returns a list of all package names which are present, either by being installed, replaced or provided
+ *
+ * @return string[]
+ * @psalm-return list
+ */
+ public static function getInstalledPackages()
+ {
+ $packages = array();
+ foreach (self::getInstalled() as $installed) {
+ $packages[] = array_keys($installed['versions']);
+ }
+
+ if (1 === \count($packages)) {
+ return $packages[0];
+ }
+
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+ }
+
+ /**
+ * Returns a list of all package names with a specific type e.g. 'library'
+ *
+ * @param string $type
+ * @return string[]
+ * @psalm-return list
+ */
+ public static function getInstalledPackagesByType($type)
+ {
+ $packagesByType = array();
+
+ foreach (self::getInstalled() as $installed) {
+ foreach ($installed['versions'] as $name => $package) {
+ if (isset($package['type']) && $package['type'] === $type) {
+ $packagesByType[] = $name;
+ }
+ }
+ }
+
+ return $packagesByType;
+ }
+
+ /**
+ * Checks whether the given package is installed
+ *
+ * This also returns true if the package name is provided or replaced by another package
+ *
+ * @param string $packageName
+ * @param bool $includeDevRequirements
+ * @return bool
+ */
+ public static function isInstalled($packageName, $includeDevRequirements = true)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (isset($installed['versions'][$packageName])) {
+ return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Checks whether the given package satisfies a version constraint
+ *
+ * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+ *
+ * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+ *
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
+ * @param string $packageName
+ * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+ * @return bool
+ */
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
+ {
+ $constraint = $parser->parseConstraints($constraint);
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+ return $provided->matches($constraint);
+ }
+
+ /**
+ * Returns a version constraint representing all the range(s) which are installed for a given package
+ *
+ * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+ * whether a given version of a package is installed, and not just whether it exists
+ *
+ * @param string $packageName
+ * @return string Version constraint usable with composer/semver
+ */
+ public static function getVersionRanges($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ $ranges = array();
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+ }
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+ }
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+ }
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+ }
+
+ return implode(' || ', $ranges);
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+ */
+ public static function getVersion($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['version'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['version'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+ */
+ public static function getPrettyVersion($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['pretty_version'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+ */
+ public static function getReference($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['reference'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['reference'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+ */
+ public static function getInstallPath($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @return array
+ * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+ */
+ public static function getRootPackage()
+ {
+ $installed = self::getInstalled();
+
+ return $installed[0]['root'];
+ }
+
+ /**
+ * Returns the raw installed.php data for custom implementations
+ *
+ * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+ * @return array[]
+ * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}
+ */
+ public static function getRawData()
+ {
+ @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+ if (null === self::$installed) {
+ // only require the installed.php file if this file is loaded from its dumped location,
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+ if (substr(__DIR__, -8, 1) !== 'C') {
+ self::$installed = include __DIR__ . '/installed.php';
+ } else {
+ self::$installed = array();
+ }
+ }
+
+ return self::$installed;
+ }
+
+ /**
+ * Returns the raw data of all installed.php which are currently loaded for custom implementations
+ *
+ * @return array[]
+ * @psalm-return list}>
+ */
+ public static function getAllRawData()
+ {
+ return self::getInstalled();
+ }
+
+ /**
+ * Lets you reload the static array from another file
+ *
+ * This is only useful for complex integrations in which a project needs to use
+ * this class but then also needs to execute another project's autoloader in process,
+ * and wants to ensure both projects have access to their version of installed.php.
+ *
+ * A typical case would be PHPUnit, where it would need to make sure it reads all
+ * the data it needs from this class, then call reload() with
+ * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+ * the project in which it runs can then also use this class safely, without
+ * interference between PHPUnit's dependencies and the project's dependencies.
+ *
+ * @param array[] $data A vendor/composer/installed.php data set
+ * @return void
+ *
+ * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data
+ */
+ public static function reload($data)
+ {
+ self::$installed = $data;
+ self::$installedByVendor = array();
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return list}>
+ */
+ private static function getInstalled()
+ {
+ if (null === self::$canGetVendors) {
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+ }
+
+ $installed = array();
+
+ if (self::$canGetVendors) {
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+ if (isset(self::$installedByVendor[$vendorDir])) {
+ $installed[] = self::$installedByVendor[$vendorDir];
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+ if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+ self::$installed = $installed[count($installed) - 1];
+ }
+ }
+ }
+ }
+
+ if (null === self::$installed) {
+ // only require the installed.php file if this file is loaded from its dumped location,
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+ if (substr(__DIR__, -8, 1) !== 'C') {
+ self::$installed = require __DIR__ . '/installed.php';
+ } else {
+ self::$installed = array();
+ }
+ }
+ $installed[] = self::$installed;
+
+ return $installed;
+ }
+}
diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/LICENSE b/datamodels/2.x/itop-oauth-client/vendor/composer/LICENSE
new file mode 100644
index 000000000..f27399a04
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+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/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_classmap.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_classmap.php
new file mode 100644
index 000000000..25e360e9d
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_classmap.php
@@ -0,0 +1,13 @@
+ $baseDir . '/src/Controller/AjaxOauthClientController.php',
+ 'Combodo\\iTop\\OAuthClient\\Controller\\OAuthClientController' => $baseDir . '/src/Controller/OAuthClientController.php',
+ 'Combodo\\iTop\\OAuthClient\\Service\\PopupMenuExtension' => $baseDir . '/src/Service/PopupMenuExtension.php',
+ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+);
diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_namespaces.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_namespaces.php
new file mode 100644
index 000000000..b7fc0125d
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,9 @@
+ array($baseDir . '/src'),
+);
diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_real.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_real.php
new file mode 100644
index 000000000..ad033ac9f
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_real.php
@@ -0,0 +1,46 @@
+= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+ if ($useStaticLoader) {
+ require __DIR__ . '/autoload_static.php';
+
+ call_user_func(\Composer\Autoload\ComposerStaticInitd52424b43ff18219f2ec935428aff074::getInitializer($loader));
+ } else {
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+ }
+
+ $loader->setClassMapAuthoritative(true);
+ $loader->register(true);
+
+ return $loader;
+ }
+}
diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_static.php b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_static.php
new file mode 100644
index 000000000..3f16c1e01
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/autoload_static.php
@@ -0,0 +1,39 @@
+
+ array (
+ 'Combodo\\iTop\\OAuthClient\\' => 25,
+ ),
+ );
+
+ public static $prefixDirsPsr4 = array (
+ 'Combodo\\iTop\\OAuthClient\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/src',
+ ),
+ );
+
+ public static $classMap = array (
+ 'Combodo\\iTop\\OAuthClient\\Controller\\AjaxOauthClientController' => __DIR__ . '/../..' . '/src/Controller/AjaxOauthClientController.php',
+ 'Combodo\\iTop\\OAuthClient\\Controller\\OAuthClientController' => __DIR__ . '/../..' . '/src/Controller/OAuthClientController.php',
+ 'Combodo\\iTop\\OAuthClient\\Service\\PopupMenuExtension' => __DIR__ . '/../..' . '/src/Service/PopupMenuExtension.php',
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+ );
+
+ public static function getInitializer(ClassLoader $loader)
+ {
+ return \Closure::bind(function () use ($loader) {
+ $loader->prefixLengthsPsr4 = ComposerStaticInitd52424b43ff18219f2ec935428aff074::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInitd52424b43ff18219f2ec935428aff074::$prefixDirsPsr4;
+ $loader->classMap = ComposerStaticInitd52424b43ff18219f2ec935428aff074::$classMap;
+
+ }, null, ClassLoader::class);
+ }
+}
diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/installed.json b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.json
new file mode 100644
index 000000000..87fda747e
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.json
@@ -0,0 +1,5 @@
+{
+ "packages": [],
+ "dev": true,
+ "dev-package-names": []
+}
diff --git a/datamodels/2.x/itop-oauth-client/vendor/composer/installed.php b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.php
new file mode 100644
index 000000000..78d9f7563
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/vendor/composer/installed.php
@@ -0,0 +1,23 @@
+ array(
+ 'pretty_version' => 'dev-develop',
+ 'version' => 'dev-develop',
+ 'type' => 'itop-extension',
+ 'install_path' => __DIR__ . '/../../',
+ 'aliases' => array(),
+ 'reference' => '1135896b3d084aa9df778bfbb724b7e992534989',
+ 'name' => 'combodo/itop-oauth-client',
+ 'dev' => true,
+ ),
+ 'versions' => array(
+ 'combodo/itop-oauth-client' => array(
+ 'pretty_version' => 'dev-develop',
+ 'version' => 'dev-develop',
+ 'type' => 'itop-extension',
+ 'install_path' => __DIR__ . '/../../',
+ 'aliases' => array(),
+ 'reference' => '1135896b3d084aa9df778bfbb724b7e992534989',
+ 'dev_requirement' => false,
+ ),
+ ),
+);
diff --git a/datamodels/2.x/itop-oauth-client/zh_cn.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/zh_cn.dict.itop-oauth-client.php
new file mode 100644
index 000000000..e4f644fde
--- /dev/null
+++ b/datamodels/2.x/itop-oauth-client/zh_cn.dict.itop-oauth-client.php
@@ -0,0 +1,74 @@
+ 'Create a mailbox...~~',
+ 'Menu:OAuthClient' => 'OAuth Client~~',
+ 'Menu:OAuthClient+' => '~~',
+ 'Menu:GenerateTokens' => 'Generate access tokens...~~',
+ 'Menu:RegenerateTokens' => 'Regenerate access tokens...~~',
+
+ 'itop-oauth-client/Operation:CreateMailBox/Title' => 'Mailbox creation~~',
+
+ 'itop-oauth-client:UsedForSMTP' => 'This OAuth client is used for SMTP~~',
+ 'itop-oauth-client:TestSMTP' => 'Email send test~~',
+ 'itop-oauth-client:MissingOAuthClient' => 'Missing Oauth client for user name %1$s~~',
+ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client~~',
+ 'itop-oauth-client:Message:TokenCreated' => 'Access token created~~',
+ 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated~~',
+]);
+
+//
+// Class: OAuthClient
+//
+
+Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', [
+ 'Class:OAuthClient' => 'Oauth Client~~',
+ 'Class:OAuthClient/Attribute:provider' => 'Provider~~',
+ 'Class:OAuthClient/Attribute:provider+' => '~~',
+ 'Class:OAuthClient/Attribute:name' => 'Login~~',
+ 'Class:OAuthClient/Attribute:name+' => '~~',
+ 'Class:OAuthClient/Attribute:scope' => 'Scope~~',
+ 'Class:OAuthClient/Attribute:scope+' => '~~',
+ 'Class:OAuthClient/Attribute:description' => 'Description~~',
+ 'Class:OAuthClient/Attribute:description+' => '~~',
+ 'Class:OAuthClient/Attribute:client_id' => 'Client id~~',
+ 'Class:OAuthClient/Attribute:client_id+' => '~~',
+ 'Class:OAuthClient/Attribute:client_secret' => 'Client secret~~',
+ 'Class:OAuthClient/Attribute:client_secret+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token~~',
+ 'Class:OAuthClient/Attribute:refresh_token+' => '~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration~~',
+ 'Class:OAuthClient/Attribute:refresh_token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:token' => 'Access token~~',
+ 'Class:OAuthClient/Attribute:token+' => '~~',
+ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration~~',
+ 'Class:OAuthClient/Attribute:token_expiration+' => '~~',
+ 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url~~',
+ 'Class:OAuthClient/Attribute:redirect_url+' => '~~',
+ 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list~~',
+ 'Class:OAuthClient/Attribute:mailbox_list+' => '~~',
+]);
+
+//
+// Class: OAuthClientAzure
+//
+Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', [
+ 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure~~',
+ 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)~~',
+
+]);
+
+//
+// Class: OAuthClientGoogle
+//
+Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', [
+ 'Class:OAuthClientGoogle' => 'OAuth client for Google~~',
+ 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)~~',
+]);
+
diff --git a/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php
index ffa019b87..6742a5ed8 100644
--- a/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php
+++ b/datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php
@@ -33,28 +33,28 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Portal:Button:Delete' => 'å é¤',
'Portal:EnvironmentBanner:Title' => 'ęØē®åå¤äŗ %1$s 樔å¼',
'Portal:EnvironmentBanner:GoToProduction' => 'åå°äŗ§å樔å¼',
- 'Error:HTTP:400' => 'Bad request~~',
- 'Error:HTTP:401' => '认čÆ',
+ 'Error:HTTP:400' => '请ę±é误',
+ 'Error:HTTP:401' => '认čÆé误',
'Error:HTTP:404' => '锵é¢ę¾äøå°',
'Error:HTTP:500' => 'Oops! åēäŗäøäøŖé误.',
'Error:HTTP:GetHelp' => 'å¦ęé®é¢ä»ē¶ååØ,请č系箔ēå.',
'Error:XHR:Fail' => 'ę ę³å č½½ę°ę®, 请č系箔ēå',
- 'Portal:ErrorUserLoggedOut' => 'ęØå·²éåŗļ¼čÆ·éę°ē»å½.',
+ 'Portal:ErrorUserLoggedOut' => 'ęØå·²éåŗ,请éę°ē»å½.',
'Portal:Datatables:Language:Processing' => '请ēØå...',
'Portal:Datatables:Language:Search' => 'čæę»¤åØ:',
'Portal:Datatables:Language:LengthMenu' => 'ęÆé”µę¾ē¤ŗ _MENU_ 锹',
'Portal:Datatables:Language:ZeroRecords' => 'ę²”ęē»ę',
'Portal:Datatables:Language:Info' => '第 _PAGE_ 锵,å
± _PAGES_ 锵',
'Portal:Datatables:Language:InfoEmpty' => 'ę²”ęäæ”ęÆ',
- 'Portal:Datatables:Language:InfoFiltered' => 'filtered out of _MAX_ items',
+ 'Portal:Datatables:Language:InfoFiltered' => 'ęå¤čæę»¤ _MAX_ 锹',
'Portal:Datatables:Language:EmptyTable' => 'č”Øę ¼äøę²”ęę°ę®',
'Portal:Datatables:Language:DisplayLength:All' => 'å
ØéØ',
'Portal:Datatables:Language:Paginate:First' => 'é¦é”µ',
'Portal:Datatables:Language:Paginate:Previous' => 'äøäøé”µ',
'Portal:Datatables:Language:Paginate:Next' => 'äøäøé”µ',
'Portal:Datatables:Language:Paginate:Last' => '尾锵',
- 'Portal:Datatables:Language:Sort:Ascending' => 'ååŗęåŗ',
- 'Portal:Datatables:Language:Sort:Descending' => 'éåŗęåŗ',
+ 'Portal:Datatables:Language:Sort:Ascending' => 'ååŗ',
+ 'Portal:Datatables:Language:Sort:Descending' => 'éåŗ',
'Portal:Autocomplete:NoResult' => 'ę²”ęę°ę®',
'Portal:Attachments:DropZone:Message' => 'ęęä»¶ę·»å äøŗéä»¶',
'Portal:File:None' => 'ę²”ęęä»¶',
@@ -110,7 +110,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Brick:Portal:Manage:Name' => 'ē®”ē锹ē®',
'Brick:Portal:Manage:Table:NoData' => 'ę²”ę锹ē®.',
- 'Brick:Portal:Manage:Table:ItemActions' => 'Actions',
+ 'Brick:Portal:Manage:Table:ItemActions' => 'ęä½',
'Brick:Portal:Manage:DisplayMode:list' => 'å蔨',
'Brick:Portal:Manage:DisplayMode:pie-chart' => '鄼å¾',
'Brick:Portal:Manage:DisplayMode:bar-chart' => 'ę”å½¢å¾',
@@ -135,8 +135,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Brick:Portal:Object:Form:Message:ObjectSaved' => 'å·²äæå %1$s~~',
'Brick:Portal:Object:Search:Regular:Title' => 'éę© %1$s (%2$s)',
'Brick:Portal:Object:Search:Hierarchy:Title' => 'éę© %1$s (%2$s)',
- 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~',
- 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~',
+ 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s',
+ 'Brick:Portal:Object:Copy:Tooltip' => 'å¤å¶åÆ¹č±”é¾ę„',
'Brick:Portal:Object:Copy:CopiedTooltip' => 'å·²å¤å¶'
));
diff --git a/datamodels/2.x/itop-portal-base/portal/bin/console b/datamodels/2.x/itop-portal-base/portal/bin/console
index 02af7bfa0..140caa4db 100644
--- a/datamodels/2.x/itop-portal-base/portal/bin/console
+++ b/datamodels/2.x/itop-portal-base/portal/bin/console
@@ -14,20 +14,18 @@ set_time_limit(0);
if (!defined('APPROOT'))
{
- if (file_exists(__DIR__.'/../../../../approot.inc.php'))
- {
- require_once __DIR__.'/../../../../approot.inc.php'; // When in env-xxxx folder
- }
- else
- {
- require_once __DIR__.'/../../../../../approot.inc.php'; // When in datamodels/x.x folder
- }
+ if (file_exists(__DIR__.'/../../../../approot.inc.php')) {
+ require_once __DIR__ . '/../../../../approot.inc.php'; // When in env-xxxx folder
+ } else {
+ require_once __DIR__ . '/../../../../../approot.inc.php'; // When in datamodels/x.x folder
+ }
}
-require_once APPROOT.'lib/autoload.php';
+require_once APPROOT . 'lib/autoload.php';
-if (!class_exists(Application::class))
-{
- throw new RuntimeException('You need to add "symfony/framework-bundle" as a Composer dependency.');
+require_once APPROOT . 'application/startup.inc.php';
+
+if (!class_exists(Application::class)) {
+ throw new RuntimeException('You need to add "symfony/framework-bundle" as a Composer dependency.');
}
// Remove --portal_id from CLI params to avoid SF CLI conflicts
diff --git a/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php b/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php
index 2a64a5c79..eb79bf4fc 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php
+++ b/datamodels/2.x/itop-portal-base/portal/config/bootstrap.php
@@ -21,7 +21,7 @@
// Disable PhpUnhandledExceptionInspection as the exception handling is made by the file including this one
/** @noinspection PhpUnhandledExceptionInspection */
-use Symfony\Component\Debug\Debug;
+use Symfony\Component\ErrorHandler\Debug;
use Symfony\Component\Dotenv\Dotenv;
// Global autoloader (portal autoloader is already required through module.itop-portal-base.php)
@@ -43,55 +43,43 @@ if (!defined('MODULESROOT'))
// Load cached env vars if the .env.local.php file exists
// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2)
-if (is_array($sEnv = @include dirname(__DIR__).'/.env.local.php'))
-{
- $_ENV += $sEnv;
-}
-elseif (!class_exists(Dotenv::class))
-{
+if (file_exists(dirname(__DIR__).'/.env.local.php')) {
+ if (is_array($sEnv = @include dirname(__DIR__).'/.env.local.php')) {
+ $_ENV += $sEnv;
+ }
+} elseif (!class_exists(Dotenv::class)) {
throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
-}
-else
-{
+} else {
$sPath = dirname(__DIR__).'/.env';
$oDotenv = new Dotenv();
+ $oDotenv->usePutenv();
// load all the .env files
- if (method_exists($oDotenv, 'loadEnv'))
- {
+ if (method_exists($oDotenv, 'loadEnv')) {
$oDotenv->loadEnv($sPath);
- }
- else
- {
+ } else {
// fallback code in case your Dotenv component is not 4.2 or higher (when loadEnv() was added)
- if (file_exists($sPath) || !file_exists($sPathDist = "$sPath.dist"))
- {
+ if (file_exists($sPath) || !file_exists($sPathDist = "$sPath.dist")) {
$oDotenv->load($sPath);
- }
- else
- {
+ } else {
$oDotenv->load($sPathDist);
}
- if (null === $sEnv = (isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : (isset($_ENV['APP_ENV']) ? $_ENV['APP_ENV'] : null)))
- {
+ if (null === $sEnv = (isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : (isset($_ENV['APP_ENV']) ? $_ENV['APP_ENV'] : null))) {
$oDotenv->populate(array('APP_ENV' => $sEnv = 'prod'));
}
- if ('test' !== $sEnv && file_exists($sPathDist = "$sPath.local"))
- {
+ if ('test' !== $sEnv && file_exists($sPathDist = "$sPath.local")) {
$oDotenv->load($sPathDist);
$sEnv = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : (isset($_ENV['APP_ENV']) ? $_ENV['APP_ENV'] : $sEnv);
}
- if (file_exists($sPathDist = "$sPath.$sEnv"))
- {
+ if (file_exists($sPathDist = "$sPath.$sEnv")) {
$oDotenv->load($sPathDist);
}
- if (file_exists($sPathDist = "$sPath.$sEnv.local"))
- {
+ if (file_exists($sPathDist = "$sPath.$sEnv.local")) {
$oDotenv->load($sPathDist);
}
}
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml
index 37e916327..5e374f117 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml
+++ b/datamodels/2.x/itop-portal-base/portal/config/packages/cache.yaml
@@ -1,10 +1,10 @@
framework:
cache:
- # Put the unique name of your app here: the prefix seed
- # is used to compute stable namespaces for cache keys.
+ # Unique name of your app: used to compute stable namespaces for cache keys.
#prefix_seed: your_vendor_name/app_name
- # The app cache caches to the filesystem by default.
+ # The "app" cache stores to the filesystem by default.
+ # The data in this cache should persist between deploys.
# Other options include:
# Redis
@@ -16,4 +16,4 @@ framework:
# Namespaced pools use the above "app" backend by default
#pools:
- #my.dedicated.cache: ~
+ #my.dedicated.cache: null
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/routing.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/dev/routing.yaml
deleted file mode 100644
index a3d2503d5..000000000
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/routing.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-framework:
- router:
- strict_requirements: true
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/dev/web_profiler.yaml
deleted file mode 100644
index 278d5fd42..000000000
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/dev/web_profiler.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-web_profiler:
- toolbar: true
- intercept_redirects: false
-
-framework:
- profiler: { only_exceptions: false }
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml
index 27b6842c7..b5707a878 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml
+++ b/datamodels/2.x/itop-portal-base/portal/config/packages/framework.yaml
@@ -7,9 +7,25 @@ framework:
# Enables session support. Note that the session will ONLY be started if you read or write from it.
# Remove or comment this section to explicitly disable session support.
session:
- handler_id: ~
+ handler_id: null
+ cookie_secure: auto
+ cookie_samesite: lax
+ storage_factory_id: session.storage.factory.native
#esi: true
#fragments: true
php_errors:
log: true
+
+when@test:
+ framework:
+ test: true
+ profiler: { collect: false }
+ router: { strict_requirements: true}
+ session:
+ storage_factory_id: session.storage.factory.mock_file
+
+when@dev:
+ framework:
+ profiler: { only_exceptions: false }
+ router: { strict_requirements: true}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml
index 17ae54822..8701b05af 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml
+++ b/datamodels/2.x/itop-portal-base/portal/config/packages/routing.yaml
@@ -1,3 +1,17 @@
framework:
router:
- strict_requirements: ~
+ utf8: true
+
+ # Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
+ # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
+ #default_uri: http://localhost
+
+when@prod:
+ framework:
+ router:
+ strict_requirements: null
+
+when@dev:
+ framework:
+ router:
+ strict_requirements: true
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/test/framework.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/test/framework.yaml
deleted file mode 100644
index d153e0d23..000000000
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/test/framework.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-framework:
- test: true
- session:
- storage_id: session.storage.mock_file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/test/routing.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/test/routing.yaml
deleted file mode 100644
index a3d2503d5..000000000
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/test/routing.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-framework:
- router:
- strict_requirements: true
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/test/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/test/web_profiler.yaml
deleted file mode 100644
index fd7ff5a35..000000000
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/test/web_profiler.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-web_profiler:
- toolbar: false
- intercept_redirects: false
-
-framework:
- profiler: { collect: false }
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml
index e4a98b501..e17e03cc9 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml
+++ b/datamodels/2.x/itop-portal-base/portal/config/packages/twig.yaml
@@ -2,3 +2,7 @@ twig:
default_path: '%combodo.modules.absolute_path%'
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
+
+when@test:
+ twig:
+ strict_variables: true
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/packages/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/packages/web_profiler.yaml
new file mode 100644
index 000000000..7676f2292
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/config/packages/web_profiler.yaml
@@ -0,0 +1,12 @@
+
+when@dev:
+ web_profiler:
+ toolbar: true
+ intercept_redirects: false
+
+when@test:
+ web_profiler:
+ toolbar: false
+ intercept_redirects: false
+
+
diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/twig.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/dev/twig.yaml
deleted file mode 100644
index 93c0e4cf8..000000000
--- a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/twig.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-_errors:
- resource: '@TwigBundle/Resources/config/routing/errors.xml'
- prefix: /_error
diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/dev/web_profiler.yaml
deleted file mode 100644
index df4ab33bf..000000000
--- a/datamodels/2.x/itop-portal-base/portal/config/routes/dev/web_profiler.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-web_profiler_wdt:
- resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
- prefix: /_wdt
-
-web_profiler_profiler:
- resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
- prefix: /_profiler
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/framework.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/framework.yaml
new file mode 100644
index 000000000..0fc74bbac
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/config/routes/framework.yaml
@@ -0,0 +1,4 @@
+when@dev:
+ _errors:
+ resource: '@FrameworkBundle/Resources/config/routing/errors.xml'
+ prefix: /_error
diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/web_profiler.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/web_profiler.yaml
new file mode 100644
index 000000000..8d85319fd
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/config/routes/web_profiler.yaml
@@ -0,0 +1,8 @@
+when@dev:
+ web_profiler_wdt:
+ resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
+ prefix: /_wdt
+
+ web_profiler_profiler:
+ resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
+ prefix: /_profiler
diff --git a/datamodels/2.x/itop-portal-base/portal/config/services.yaml b/datamodels/2.x/itop-portal-base/portal/config/services.yaml
index 249b6b42e..17e82f3f1 100644
--- a/datamodels/2.x/itop-portal-base/portal/config/services.yaml
+++ b/datamodels/2.x/itop-portal-base/portal/config/services.yaml
@@ -24,8 +24,6 @@ imports:
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
- # Replace default url generator service
- router.options.generator_base_class: Combodo\iTop\Portal\Routing\UrlGenerator
# Used in templates
combodo.current_environment: '%env(string:COMBODO_CURRENT_ENVIRONMENT)%'
@@ -100,17 +98,19 @@ services:
- '@Combodo\iTop\Portal\Twig\AppVariable.inner'
- '@service_container'
+ Combodo\iTop\Portal\Routing\UrlGenerator:
+ decorates: 'router'
+ arguments: ['@Combodo\iTop\Portal\Routing\UrlGenerator.inner']
+
# Standard services
combodo.current_contact.photo_url:
public: true
class: Combodo\iTop\Portal\VariableAccessor\CombodoCurrentContactPhotoUrl
- arguments: ['@combodo.current_user', '@service_container']
- # Note: This service is initialized with a UserLocal object as it needs a class that can be instantiated.
- # Anyway, it will be replaced with the real class by UserProvider in onKernelRequestEvent.
- # Note: Services relying on this one should use \User in their signature and not \UserLocal.
+ arguments: ['@Combodo\iTop\Portal\EventListener\UserProvider', '@service_container']
+
combodo.current_user:
+ alias: Combodo\iTop\Portal\Twig\CurrentUserAccessor
public: true
- class: UserLocal
# Aliases
brick_collection:
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php
index 9d69df51b..89ddeaba0 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php
@@ -20,7 +20,7 @@
namespace Combodo\iTop\Portal\Controller;
-use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use \Symfony\Bundle\FrameworkBundle\Controller\AbstractController as SymfonyAbstractController;
/**
* Class AbstractController
@@ -29,8 +29,37 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller;
* @author Guillaume Lajarige
* @since 2.3.0
*/
-abstract class AbstractController extends Controller
+abstract class AbstractController extends SymfonyAbstractController
{
+ /**
+ * Return services needed inside controllers.
+ * Allow access to service via $controller->get(`service_name`).
+ *
+ * Improvement: Use service dependency injection
+ *
+ * @return array array of service injected to controllers
+ * @since 3.1.0
+ *
+ */
+ public static function getSubscribedServices(): array
+ {
+ return array_merge(parent::getSubscribedServices(), [
+ 'brick_collection' => 'Combodo\iTop\Portal\Brick\BrickCollection',
+ 'request_manipulator' => 'Combodo\iTop\Portal\Helper\RequestManipulatorHelper',
+ 'scope_validator' => 'Combodo\iTop\Portal\Helper\ScopeValidatorHelper',
+ 'security_helper' => 'Combodo\iTop\Portal\Helper\SecurityHelper',
+ 'context_manipulator' => 'Combodo\iTop\Portal\Helper\ContextManipulatorHelper',
+ 'navigation_rule_helper' => 'Combodo\iTop\Portal\Helper\NavigationRuleHelper',
+ 'ui_extensions_helper' => 'Combodo\iTop\Portal\Helper\UIExtensionsHelper',
+ 'lifecycle_validator' => 'Combodo\iTop\Portal\Helper\LifecycleValidatorHelper',
+ 'url_generator' => 'router',
+ 'object_form_handler' => 'Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper',
+ 'browse_brick' => 'Combodo\iTop\Portal\Helper\BrowseBrickHelper',
+ 'brick_controller_helper' => 'Combodo\iTop\Portal\Helper\BrickControllerHelper',
+ 'session_message_helper' => 'Combodo\iTop\Portal\Helper\SessionMessageHelper',
+ ]);
+ }
+
/**
* Unlike {@see \Symfony\Bundle\FrameworkBundle\Controller\ControllerTrait::redirectToRoute()}, this method directly calls the route controller without creating a redirection client side
*
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php
index 682b084f7..4fde47639 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.class.inc.php
@@ -40,11 +40,11 @@ class AggregatePageBrickController extends BrickController
{
/**
* @param \Symfony\Component\HttpFoundation\Request $oRequest
- * @param string $sBrickId
+ * @param string $sBrickId
*
* @return \Symfony\Component\HttpFoundation\Response
*
- * @throws \Combodo\iTop\Portal\Brick\BrickNotFoundException
+ * @throws BrickNotFoundException
* @throws \Exception
*/
public function DisplayAction(Request $oRequest, $sBrickId)
diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php
index a78973331..7bec67c51 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetPluginPropertyClass.php
@@ -20,7 +20,7 @@
namespace Combodo\iTop\Portal\EventListener;
use ApplicationContext;
-use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\RequestEvent;
use UserRights;
use utils;
@@ -34,17 +34,16 @@ use utils;
class ApplicationContextSetPluginPropertyClass
{
/**
- * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent
+ * @param RequestEvent $oRequestEvent
*/
- public function onKernelRequest(GetResponseEvent $oGetResponseEvent)
- {
- // Enable archived data
- utils::InitArchiveMode();
-
- // Enabling datalocalizer if needed
- if (!defined('DISABLE_DATA_LOCALIZER_PORTAL'))
- {
- ApplicationContext::SetPluginProperty('QueryLocalizerPlugin', 'language_code', UserRights::GetUserLanguage());
- }
- }
+ public function onKernelRequest(RequestEvent $oRequestEvent)
+ {
+ // Enable archived data
+ utils::InitArchiveMode();
+
+ // Enabling datalocalizer if needed
+ if (!defined('DISABLE_DATA_LOCALIZER_PORTAL')) {
+ ApplicationContext::SetPluginProperty('QueryLocalizerPlugin', 'language_code', UserRights::GetUserLanguage());
+ }
+ }
}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php
index 286d333c3..c0574e454 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ApplicationContextSetUrlMakerClass.php
@@ -20,7 +20,7 @@
namespace Combodo\iTop\Portal\EventListener;
use ApplicationContext;
-use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\RequestEvent;
/**
* Class ApplicationContextSetUrlMakerClass
@@ -43,13 +43,12 @@ class ApplicationContextSetUrlMakerClass
}
/**
- * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent
+ * @param RequestEvent $oRequestEvent
*/
- public function onKernelRequest(GetResponseEvent $oGetResponseEvent)
- {
- if ($this->aCombodoPortalInstanceConf['properties']['urlmaker_class'] !== null)
- {
- ApplicationContext::SetUrlMakerClass($this->aCombodoPortalInstanceConf['properties']['urlmaker_class']);
- }
- }
+ public function onKernelRequest(RequestEvent $oRequestEvent)
+ {
+ if ($this->aCombodoPortalInstanceConf['properties']['urlmaker_class'] !== null) {
+ ApplicationContext::SetUrlMakerClass($this->aCombodoPortalInstanceConf['properties']['urlmaker_class']);
+ }
+ }
}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php
index de5253180..0b914c0dd 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php
@@ -19,7 +19,7 @@
namespace Combodo\iTop\Portal\EventListener;
-use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\RequestEvent;
use utils;
/**
@@ -47,19 +47,17 @@ class CssFromSassCompiler
}
/**
- * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent
+ * @param RequestEvent $oRequestEvent
*/
- public function onKernelRequest(GetResponseEvent $oGetResponseEvent)
+ public function onKernelRequest(RequestEvent $oRequestEvent)
{
// Force compilation need only when by-passing cache to limit server load.
- if (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] !== 'no-cache'))
- {
+ if (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] !== 'no-cache')) {
return;
}
$aImportPaths = array($_ENV['COMBODO_PORTAL_BASE_ABSOLUTE_PATH'].'css/');
- foreach ($this->aCombodoPortalInstanceConf['properties']['themes'] as $sKey => $value)
- {
+ foreach ($this->aCombodoPortalInstanceConf['properties']['themes'] as $sKey => $value) {
if (!is_array($value))
{
utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$value, $aImportPaths);
diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php
index 6b585ffbe..bde7d0f60 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php
@@ -24,13 +24,12 @@ namespace Combodo\iTop\Portal\EventListener;
use Dict;
use ExceptionLog;
-use IssueLog;
-use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
/**
@@ -52,10 +51,10 @@ class ExceptionListener implements ContainerAwareInterface
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
- public function onKernelException(GetResponseForExceptionEvent $oEvent)
+ public function onKernelException(ExceptionEvent $oEvent)
{
// Get the exception object from the received event
- $oException = $oEvent->getException();
+ $oException = $oEvent->getThrowable();
// Prepare / format exception data
if ($oException instanceof \MySQLException) {
@@ -78,7 +77,7 @@ class ExceptionListener implements ContainerAwareInterface
}
// Prepare flatten exception
- $oFlattenException = ($_SERVER['APP_DEBUG'] == 1) ? FlattenException::create($oException) : null;
+ $oFlattenException = ($_SERVER['APP_DEBUG'] == 1) ? FlattenException::createFromThrowable($oException) : null;
// Remove APPROOT from file paths if in production (SF context)
if (!is_null($oFlattenException) && ($_SERVER['APP_ENV'] === 'prod'))
{
diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php
index da42e9370..439e92fa6 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/UserProvider.php
@@ -26,7 +26,7 @@ use ModuleDesign;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Exception\HttpException;
use UserRights;
@@ -44,12 +44,16 @@ class UserProvider implements ContainerAwareInterface
private $sPortalId;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface $container */
private $oContainer;
+ /** @var \User $oUser */
+ private $oUser;
+ /** @var array $aAllowedPortals */
+ private $aAllowedPortals;
/**
* UserProvider constructor.
*
* @param \ModuleDesign $oModuleDesign
- * @param string $sPortalId
+ * @param string $sPortalId
*/
public function __construct(ModuleDesign $oModuleDesign, $sPortalId)
{
@@ -58,11 +62,11 @@ class UserProvider implements ContainerAwareInterface
}
/**
- * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent
+ * @param RequestEvent $oRequestEvent
*
* @throws \Exception
*/
- public function onKernelRequest(GetResponseEvent $oGetResponseEvent)
+ public function onKernelRequest(RequestEvent $oRequestEvent)
{
// User pre-checks
// Note: The following note and handling of the $iExitMethod were for the old login mechanism
@@ -71,45 +75,62 @@ class UserProvider implements ContainerAwareInterface
//
// Note: At this point the Exception handler is not registered, so we can't use $oApp::abort() method, hence the die().
// - Checking user rights and prompt if needed (401 HTTP code returned if XHR request)
- $iExitMethod = ($oGetResponseEvent->getRequest()->isXmlHttpRequest()) ? LoginWebPage::EXIT_RETURN : LoginWebPage::EXIT_PROMPT;
+ $iExitMethod = ($oRequestEvent->getRequest()->isXmlHttpRequest()) ? LoginWebPage::EXIT_RETURN : LoginWebPage::EXIT_PROMPT;
$iLogonRes = LoginWebPage::DoLoginEx($this->sPortalId, false, $iExitMethod);
- if( ($iExitMethod === LoginWebPage::EXIT_RETURN) && ($iLogonRes != 0) )
- {
+ if( ($iExitMethod === LoginWebPage::EXIT_RETURN) && ($iLogonRes != 0) ) {
die(Dict::S('Portal:ErrorUserLoggedOut'));
}
// - User must be associated with a Contact
- if (UserRights::GetContactId() == 0)
- {
+ if (UserRights::GetContactId() == 0) {
die(Dict::S('Portal:ErrorNoContactForThisUser'));
}
// User
- $oUser = UserRights::GetUserObject();
- if ($oUser === null)
- {
+ $this->oUser = UserRights::GetUserObject();
+ if ($this->oUser === null) {
throw new Exception('Could not load connected user.');
}
- $this->oContainer->set('combodo.current_user', $oUser);
// Allowed portals
$aAllowedPortals = UserRights::GetAllowedPortals();
// Checking that user is allowed this portal
$bAllowed = false;
- foreach ($aAllowedPortals as $aAllowedPortal)
- {
- if ($aAllowedPortal['id'] === $this->sPortalId)
- {
+ foreach ($aAllowedPortals as $aAllowedPortal) {
+ if ($aAllowedPortal['id'] === $this->sPortalId) {
$bAllowed = true;
break;
}
}
- if (!$bAllowed)
- {
+ if (!$bAllowed) {
throw new HttpException(Response::HTTP_NOT_FOUND);
}
- /** @noinspection PhpParamsInspection It's an array and it's gonna stay that way */
- $this->oContainer->set('combodo.current_user.allowed_portals', $aAllowedPortals);
+
+ $this->aAllowedPortals = $aAllowedPortals;
+ }
+
+ /**
+ * Get current user.
+ *
+ * @return \User current user
+ * @since 3.1.0
+ *
+ */
+ public function getCurrentUser()
+ {
+ return $this->oUser;
+ }
+
+ /**
+ * Get allowed portals.
+ *
+ * @return array allowed portals
+ * @since 3.1.0
+ *
+ */
+ public function getAllowedPortals()
+ {
+ return $this->aAllowedPortals;
}
/**
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php
index 2c36eed94..e77312602 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php
@@ -36,7 +36,8 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
-use Twig_Environment;
+use Twig\Environment;
+use Twig\Loader\ArrayLoader;
use Twig_Loader_Array;
use URLButtonItem;
use UserRights;
@@ -420,7 +421,7 @@ class ObjectFormHandlerHelper
public function RenderFormFromTwig($sId, $sTwigString, $aData)
{
// Creating sandbox twig env. to load and test the custom form template
- $oTwig = new Twig_Environment(new Twig_Loader_Array(array($sId => $sTwigString)));
+ $oTwig = new Environment(new ArrayLoader(array($sId => $sTwigString)));
// Manually registering filters and functions as we didn't find how to do it automatically
$aFilters = $this->oAppExtension->getFilters();
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Kernel.php b/datamodels/2.x/itop-portal-base/portal/src/Kernel.php
index f67bab16c..d0ecb0b21 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/Kernel.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/Kernel.php
@@ -83,9 +83,6 @@ class Kernel extends BaseKernel
protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
{
$container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php'));
- // Feel free to remove the "container.autowiring.strict_mode" parameter
- // if you are using symfony/dependency-injection 4.0+ as it's the default behavior
- $container->setParameter('container.autowiring.strict_mode', true);
$container->setParameter('container.dumper.inline_class_loader', true);
$confDir = $this->getProjectDir().'/config';
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php b/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php
index f16ed4f49..1dd2b4e86 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/Routing/UrlGenerator.php
@@ -19,43 +19,72 @@
namespace Combodo\iTop\Portal\Routing;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\RouterInterface;
use utils;
-use Symfony\Component\Routing\Generator\UrlGenerator as BaseUrlGenerator;
/**
* Class UrlGenerator
*
+ * @author Benjamin Dalsass
* @package Combodo\iTop\Portal\Routing
- * @since 2.7.0
- * @author Bruno Da Silva
- * @author Guillaume Lajarige
+ * @since 3.1.0
*/
-class UrlGenerator extends BaseUrlGenerator
+class UrlGenerator implements RouterInterface
{
- /** @noinspection PhpTooManyParametersInspection */
+ /** @var \Symfony\Component\Routing\RouterInterface $router */
+ private $router;
+
/**
- * Overloading of the parent function to add the $_REQUEST parameters to the url parameters.
- * This is used to keep additional parameters in the url, especially when portal is accessed from the /pages/exec.php
+ * Constructor.
*
- * Note: As of now, it only adds the exec_module/exec_page/portal_id/env_switch/debug parameters. Any other parameter will be ignored.
- *
- * @param $variables
- * @param $defaults
- * @param $requirements
- * @param $tokens
- * @param $parameters
- * @param $name
- * @param $referenceType
- * @param $hostTokens
- * @param array $requiredSchemes
- *
- * @return string
+ * @param \Symfony\Component\Routing\RouterInterface $router
*/
- protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array())
+ public function __construct(RouterInterface $router)
+ {
+ $this->router = $router;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH)
{
$parameters = $this->getExtraParams($parameters);
- return parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes);
+ return $this->router->generate($name, $parameters, $referenceType);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function setContext(RequestContext $context)
+ {
+ $this->router->setContext($context);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getContext()
+ {
+ return $this->router->getContext();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getRouteCollection()
+ {
+ return $this->router->getRouteCollection();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function match($pathinfo)
+ {
+ return $this->router->match($pathinfo);
}
/**
@@ -67,26 +96,22 @@ class UrlGenerator extends BaseUrlGenerator
{
$sExecModule = utils::ReadParam('exec_module', '', false, 'string');
$sExecPage = utils::ReadParam('exec_page', '', false, 'string');
- if ($sExecModule !== '' && $sExecPage !== '')
- {
+ if ($sExecModule !== '' && $sExecPage !== '') {
$aParameters['exec_module'] = $sExecModule;
$aParameters['exec_page'] = $sExecPage;
}
// Optional parameters
$sPortalId = utils::ReadParam('portal_id', '', false, 'string');
- if ($sPortalId !== '')
- {
+ if ($sPortalId !== '') {
$aParameters['portal_id'] = $sPortalId;
}
$sEnvSwitch = utils::ReadParam('env_switch', '', false, 'string');
- if ($sEnvSwitch !== '')
- {
+ if ($sEnvSwitch !== '') {
$aParameters['env_switch'] = $sEnvSwitch;
}
$sDebug = utils::ReadParam('debug', '', false, 'string');
- if ($sDebug !== '')
- {
+ if ($sDebug !== '') {
$aParameters['debug'] = $sDebug;
}
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php
index 1790b5426..b783fb79b 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppExtension.php
@@ -19,18 +19,9 @@
namespace Combodo\iTop\Portal\Twig;
-use AttributeDate;
use Combodo\iTop\Application\TwigBase\Twig\Extension;
use Twig\Extension\AbstractExtension;
-use AttributeDateTime;
-use AttributeText;
-use Twig_SimpleFilter;
-use Twig_SimpleFunction;
-use utils;
-use Dict;
-use MetaModel;
-
/**
* Class AppExtension
*
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Twig/AppGlobal.php b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppGlobal.php
new file mode 100644
index 000000000..a1c3907d4
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/src/Twig/AppGlobal.php
@@ -0,0 +1,63 @@
+
+ * @package Combodo\iTop\Portal\Twig
+ * @since 3.1.0
+ */
+class AppGlobal extends AbstractExtension implements GlobalsInterface
+{
+ /** @var \Combodo\iTop\Portal\EventListener\UserProvider $userProvider */
+ private $userProvider;
+
+ /**
+ * Constructor.
+ *
+ * @param \Combodo\iTop\Portal\EventListener\UserProvider $userProvider
+ */
+ public function __construct(UserProvider $userProvider)
+ {
+ $this->userProvider = $userProvider;
+ }
+
+ /**
+ * Return global variables.
+ *
+ * @return array
+ */
+ public function getGlobals(): array
+ {
+ $data = array();
+ $data['allowed_portals'] = $this->userProvider->getAllowedPortals();
+
+ return $data;
+ }
+
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/src/Twig/CurrentUserAccessor.php b/datamodels/2.x/itop-portal-base/portal/src/Twig/CurrentUserAccessor.php
new file mode 100644
index 000000000..28a1f567a
--- /dev/null
+++ b/datamodels/2.x/itop-portal-base/portal/src/Twig/CurrentUserAccessor.php
@@ -0,0 +1,64 @@
+> app['combodo.current_user'].Get('first_name')
+ * To prevent changes in templates we expose a service CurrentUserAccessor with a bridge role.
+ *
+ * @author Benjamin Dalsass
+ * @package Combodo\iTop\Portal\Twig
+ * @since 3.1.0
+ */
+class CurrentUserAccessor
+{
+ /** @var \Combodo\iTop\Portal\EventListener\UserProvider $userProvider */
+ private $userProvider;
+
+ /**
+ * Constructor.
+ *
+ * @param \Combodo\iTop\Portal\EventListener\UserProvider $userProvider
+ */
+ public function __construct(UserProvider $userProvider)
+ {
+ $this->userProvider = $userProvider;
+ }
+
+ /**
+ * Get (UserLocal meme function)
+ *
+ * @param $key
+ *
+ * @return int|mixed|\ormLinkSet|string|null
+ * @throws \ArchivedObjectException
+ * @throws \CoreException
+ */
+ public function Get($key)
+ {
+ return $this->userProvider->getCurrentUser()->Get($key);
+ }
+}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php b/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php
index 5ae7f2412..34b3b52f3 100644
--- a/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php
+++ b/datamodels/2.x/itop-portal-base/portal/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php
@@ -20,10 +20,10 @@
namespace Combodo\iTop\Portal\VariableAccessor;
+use Combodo\iTop\Portal\EventListener\UserProvider;
use Exception;
use MetaModel;
use Symfony\Component\DependencyInjection\ContainerInterface;
-use User;
use UserRights;
/**
@@ -35,25 +35,24 @@ use UserRights;
*/
class CombodoCurrentContactPhotoUrl
{
- /** @var \User $oUser */
- private $oUser;
/** @var string $sCombodoPortalBaseAbsoluteUrl */
private $sCombodoPortalBaseAbsoluteUrl;
/** @var string|null $sContactPhotoUrl */
private $sContactPhotoUrl;
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
private $oContainer;
+ /** @var UserProvider $oUserProvider */
+ private $oUserProvider;
/**
* CombodoCurrentContactPhotoUrl constructor.
*
- * @param \User $oUser
* @param \Symfony\Component\DependencyInjection\ContainerInterface $oContainer
- * @param string $sCombodoPortalBaseAbsoluteUrl
+ * @param string $sCombodoPortalBaseAbsoluteUrl
*/
- public function __construct(User $oUser, ContainerInterface $oContainer, $sCombodoPortalBaseAbsoluteUrl)
+ public function __construct(UserProvider $userProvider, ContainerInterface $oContainer, $sCombodoPortalBaseAbsoluteUrl)
{
- $this->oUser = $oUser;
+ $this->oUserProvider = $userProvider;
$this->oContainer = $oContainer;
$this->sCombodoPortalBaseAbsoluteUrl = $sCombodoPortalBaseAbsoluteUrl;
$this->sContactPhotoUrl = null;
@@ -65,8 +64,7 @@ class CombodoCurrentContactPhotoUrl
*/
public function __toString()
{
- if ($this->sContactPhotoUrl === null)
- {
+ if ($this->sContactPhotoUrl === null) {
$this->sContactPhotoUrl = $this->ComputeContactPhotoUrl();
}
@@ -84,44 +82,35 @@ class CombodoCurrentContactPhotoUrl
// Contact
$sContactPhotoUrl = "{$this->sCombodoPortalBaseAbsoluteUrl}img/user-profile-default-256px.png";
// - Checking if we can load the contact
- try
- {
+ try {
/** @var \cmdbAbstractObject $oContact */
$oContact = UserRights::GetContactObject();
}
- catch (Exception $e)
- {
- $oAllowedOrgSet = $this->oUser->Get('allowed_org_list');
- if ($oAllowedOrgSet->Count() > 0)
- {
+ catch (Exception $e) {
+ $oUser = $this->oUserProvider->getCurrentUser();
+ $oAllowedOrgSet = $oUser->Get('allowed_org_list');
+ if ($oAllowedOrgSet->Count() > 0) {
throw new Exception('Could not load contact related to connected user. (Tip: Make sure the contact\'s organization is among the user\'s allowed organizations)');
- }
- else
- {
+ } else {
throw new Exception('Could not load contact related to connected user.');
}
}
// - Retrieving picture
- if ($oContact)
- {
+ if ($oContact) {
$sPictureAttCode = 'picture';
- if (MetaModel::IsValidAttCode(get_class($oContact), $sPictureAttCode))
- {
+ if (MetaModel::IsValidAttCode(get_class($oContact), $sPictureAttCode)) {
/** @var \ormDocument $oImage */
$oImage = $oContact->Get($sPictureAttCode);
- if (is_object($oImage) && !$oImage->IsEmpty())
- {
+ if (is_object($oImage) && !$oImage->IsEmpty()) {
// TODO: This should be changed when refactoring the ormDocument GetDisplayUrl() and GetDownloadUrl() in iTop 3.0
$sContactPhotoUrl = $this->oContainer->get('url_generator')->generate('p_object_document_display', [
'sObjectClass' => get_class($oContact),
- 'sObjectId' => $oContact->GetKey(),
+ 'sObjectId' => $oContact->GetKey(),
'sObjectField' => $sPictureAttCode,
- 'cache' => 86400,
- 's' => $oImage->GetSignature(),
- ]);
- }
- else
- {
+ 'cache' => 86400,
+ 's' => $oImage->GetSignature(),
+ ]);
+ } else {
$sContactPhotoUrl = MetaModel::GetAttributeDef(get_class($oContact), $sPictureAttCode)->Get('default_image');
}
}
diff --git a/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig
index 676c9a263..78d5ff17c 100644
--- a/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig
+++ b/datamodels/2.x/itop-portal-base/portal/templates/errors/layout.html.twig
@@ -22,26 +22,6 @@
margin: 0 5px;
}
- {# Stack trace is only displayed in debug #}
- {% if app['kernel'].debug == true %}
- code {
- background-color: transparent;
- }
-
- {# Include SF style for the stack trace #}
- {{ include('@Twig/exception.css.twig') }}
-
- {# In production (SF context, not iTop), we hide some element as the code will not be displayed #}
- {% if app['kernel'].environment == 'prod' %}
- .trace-line-header > .icon{
- display: none !important;
- }
- .trace-code{
- display: none !important;
-
- }
- {% endif %}
- {% endif %}
{% endblock %}
@@ -61,36 +41,6 @@
- {% if app['kernel'].debug == true %}
-
- {# Note: The following is copied by the '@Twig/Exception/exception.html.twig' #}
- {% set exception_as_array = exception.toarray %}
- {% set _exceptions_with_user_code = [] %}
- {% for i, e in exception_as_array %}
- {% for trace in e.trace %}
- {% if (trace.file is not empty) and ('/vendor/' not in trace.file) and ('/var/cache/' not in trace.file) and not loop.last %}
- {% set _exceptions_with_user_code = _exceptions_with_user_code|merge([i]) %}
- {% endif %}
- {% endfor %}
- {% endfor %}
-
- {% if exception_as_array|length > 1 %}
- Exceptions {{ exception_as_array|length }}
- {% else %}
- Exception
- {% endif %}
-
-
- {% for i, e in exception_as_array %}
- {{ include('@Twig/Exception/traces.html.twig', { exception: e, index: loop.index, expand: i in _exceptions_with_user_code or (_exceptions_with_user_code is empty and loop.first) }, with_context = false) }}
- {% endfor %}
-
- {% endif %}
-
-{% endblock %}
-
-{% block pPageLiveScripts %}
- {{ include('@Twig/base_js.html.twig') }}
{% endblock %}
\ No newline at end of file
diff --git a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig
index 506dbb465..56b0aa404 100644
--- a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig
+++ b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig
@@ -224,14 +224,14 @@
{% if bUserConnected %}
{{ 'Brick:Portal:UserProfile:Navigation:Dropdown:MyProfil'|dict_s }}
- {% for aPortal in app['combodo.current_user.allowed_portals'] %}
+ {% for aPortal in allowed_portals %}
{% if aPortal.id != app['combodo.portal.instance.conf'].properties.id %}
{% set sIconClass = (aPortal.id == 'backoffice') ? 'far fa-list-alt' : 'fas fa-external-link-alt' %}
{{ aPortal.label|dict_s }}
{% endif %}
{% endfor %}
{# We display the separator only if the user has more then 1 portal. Meaning default portal + console or several portal at least #}
- {% if app['combodo.current_user.allowed_portals']|length > 1 %}
+ {% if allowed_portals|length > 1 %}
{% endif %}
{{ 'Brick:Portal:UserProfile:Navigation:Dropdown:Logout'|dict_s }}
@@ -263,14 +263,14 @@
diff --git a/dictionaries/cs.dictionary.itop.ui.php b/dictionaries/cs.dictionary.itop.ui.php
index 4ef65dfbd..ddf9906f0 100755
--- a/dictionaries/cs.dictionary.itop.ui.php
+++ b/dictionaries/cs.dictionary.itop.ui.php
@@ -472,6 +472,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance~~',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'MnožstvĆ',
'UI:GroupBy:Count+' => 'Množstvà prvků',
'UI:CountOfObjects' => 'PoÄet objektÅÆ odpovĆdajĆcĆh ktritĆ©riĆm: %1$d',
@@ -1674,22 +1676,6 @@ Dict::Add('CS CZ', 'Czech', 'ÄeÅ”tina', array(
'Menu:ConfigurationTools' => 'Configuration~~',
));
-// OAuth
-Dict::Add('CS CZ', 'Czech', 'ÄeÅ”tina', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('CS CZ', 'Czech', 'ÄeÅ”tina', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/da.dictionary.itop.ui.php b/dictionaries/da.dictionary.itop.ui.php
index 0de5a64fb..19b632898 100644
--- a/dictionaries/da.dictionary.itop.ui.php
+++ b/dictionaries/da.dictionary.itop.ui.php
@@ -461,6 +461,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance~~',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'Antal',
'UI:GroupBy:Count+' => 'Antal af elementer',
'UI:CountOfObjects' => '%1$d objekter opfylder kriteriet.',
@@ -1665,22 +1667,6 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Menu:ConfigurationTools' => 'Configuration~~',
));
-// OAuth
-Dict::Add('DA DA', 'Danish', 'Dansk', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/de.dictionary.itop.ui.php b/dictionaries/de.dictionary.itop.ui.php
index f8523f883..f6249a11f 100644
--- a/dictionaries/de.dictionary.itop.ui.php
+++ b/dictionaries/de.dictionary.itop.ui.php
@@ -461,6 +461,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Wartung',
'UI:Error:InvalidToken' => 'Error: The angeforderte Operation wurde bereits ausgeführt (CSRF-Token nicht gefunden)',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'Anzahl',
'UI:GroupBy:Count+' => 'Anzahl der Elemente',
'UI:CountOfObjects' => '%1$d Objekte, die das Kriterium erfüllen.',
@@ -1672,18 +1674,3 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Dashboard:Revert' => 'Auf Originalversion zurücksetzen...',
));
-// OAuth
-Dict::Add('DE DE', 'German', 'Deutsch', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
diff --git a/dictionaries/en.dictionary.itop.ui.php b/dictionaries/en.dictionary.itop.ui.php
index 7808ba90f..58194f286 100644
--- a/dictionaries/en.dictionary.itop.ui.php
+++ b/dictionaries/en.dictionary.itop.ui.php
@@ -483,6 +483,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)',
+
'UI:GroupBy:Count' => 'Count',
'UI:GroupBy:Count+' => 'Number of elements',
'UI:CountOfObjects' => '%1$d objects matching the criteria.',
@@ -1693,19 +1695,3 @@ Dict::Add('EN US', 'English', 'English', array(
'Menu:Queries' => 'Queries',
'Menu:ConfigurationTools' => 'Configuration',
));
-
-// OAuth
-Dict::Add('EN US', 'English', 'English', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails',
-));
\ No newline at end of file
diff --git a/dictionaries/es_cr.dictionary.itop.ui.php b/dictionaries/es_cr.dictionary.itop.ui.php
index 628eeb5cf..ac53295a8 100644
--- a/dictionaries/es_cr.dictionary.itop.ui.php
+++ b/dictionaries/es_cr.dictionary.itop.ui.php
@@ -473,6 +473,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Mantenimiento',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'Cuenta',
'UI:GroupBy:Count+' => 'NĆŗmero de Elementos',
'UI:CountOfObjects' => '%1$d Elementos cumplen Criterio.',
@@ -1680,22 +1682,6 @@ Dict::Add('ES CR', 'Spanish', 'EspaƱol, Castellano', array(
'Menu:ConfigurationTools' => 'Configuración',
));
-// OAuth
-Dict::Add('ES CR', 'Spanish', 'EspaƱol, Castellano', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('ES CR', 'Spanish', 'EspaƱol, Castellano', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/fr.dictionary.itop.ui.php b/dictionaries/fr.dictionary.itop.ui.php
index c483bec27..619b64abb 100644
--- a/dictionaries/fr.dictionary.itop.ui.php
+++ b/dictionaries/fr.dictionary.itop.ui.php
@@ -467,6 +467,8 @@ Nous espƩrons que vous aimerez cette version autant que nous avons eu du plaisi
'UI:Error:MaintenanceTitle' => 'Maintenance',
'UI:Error:InvalidToken' => 'Erreur: l\'opération a déjà été effectuée (CSRF token not found)',
+ 'UI:Error:SMTP:UnknownVendor' => 'Le provider SMTP Oauth 2.0 %1$s n\'existe pas',
+
'UI:GroupBy:Count' => 'Nombre',
'UI:GroupBy:Count+' => 'Nombre d\'ƩlƩments',
'UI:CountOfObjects' => '%1$d objets correspondants aux critĆØres.',
@@ -1669,19 +1671,3 @@ Dict::Add('FR FR', 'French', 'FranƧais', array(
'Menu:Queries' => 'RequĆŖtes',
'Menu:ConfigurationTools' => 'Configuration',
));
-
-// OAuth
-Dict::Add('FR FR', 'French', 'FranƧais', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'Configuration OAuth 2.0',
- 'UI:OAuth:Wizard:Page:Title' => 'Configuration OAuth 2.0',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'Configuration OAuth 2.0',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Id client',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Secret client',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'ParamĆØtres additionnels',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'URI de redirection',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentification',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration pour SMTP',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Copier ces lignes dans la configuration pour utiliser cette connexion OAyth 2.0 pour les mails sortants',
-));
\ No newline at end of file
diff --git a/dictionaries/hu.dictionary.itop.ui.php b/dictionaries/hu.dictionary.itop.ui.php
index d9ca1cc94..89929addd 100755
--- a/dictionaries/hu.dictionary.itop.ui.php
+++ b/dictionaries/hu.dictionary.itop.ui.php
@@ -461,6 +461,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance~~',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'SzƔmossƔga',
'UI:GroupBy:Count+' => '',
'UI:CountOfObjects' => '%1$d darab objektum felel meg a kritƩriumoknak.',
@@ -1665,22 +1667,6 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Menu:ConfigurationTools' => 'Configuration~~',
));
-// OAuth
-Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/it.dictionary.itop.ui.php b/dictionaries/it.dictionary.itop.ui.php
index 2b2476f3f..22c6d29fc 100644
--- a/dictionaries/it.dictionary.itop.ui.php
+++ b/dictionaries/it.dictionary.itop.ui.php
@@ -472,6 +472,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance~~',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'Conteggio',
'UI:GroupBy:Count+' => '',
'UI:CountOfObjects' => '%1$d oggetti corrispondenti ai criteri.',
@@ -1676,22 +1678,6 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Menu:ConfigurationTools' => 'configurazione',
));
-// OAuth
-Dict::Add('IT IT', 'Italian', 'Italiano', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/ja.dictionary.itop.ui.php b/dictionaries/ja.dictionary.itop.ui.php
index 6f8c19300..3c78e7d90 100644
--- a/dictionaries/ja.dictionary.itop.ui.php
+++ b/dictionaries/ja.dictionary.itop.ui.php
@@ -461,6 +461,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance~~',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'ć«ć¦ć³ć',
'UI:GroupBy:Count+' => 'č¦ē“ ę°',
'UI:CountOfObjects' => '%1$d åć®ćŖććøć§ćÆććę”ä»¶ć«ććććć¾ććć',
@@ -1665,22 +1667,6 @@ Dict::Add('JA JP', 'Japanese', 'ę„ę¬čŖ', array(
'Menu:ConfigurationTools' => 'Configuration~~',
));
-// OAuth
-Dict::Add('JA JP', 'Japanese', 'ę„ę¬čŖ', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('JA JP', 'Japanese', 'ę„ę¬čŖ', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/nl.dictionary.itop.ui.php b/dictionaries/nl.dictionary.itop.ui.php
index 3988f291b..1f6abbfab 100644
--- a/dictionaries/nl.dictionary.itop.ui.php
+++ b/dictionaries/nl.dictionary.itop.ui.php
@@ -472,6 +472,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Onderhoud',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'Aantal',
'UI:GroupBy:Count+' => 'Aantal objecten',
'UI:CountOfObjects' => '%1$d objecten voldoen aan de criteria.',
@@ -1679,22 +1681,6 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'Menu:ConfigurationTools' => 'Configuratie',
));
-// OAuth
-Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'UI:Toggle:StandardDashboard' => 'Standaard',
diff --git a/dictionaries/pt_br.dictionary.itop.ui.php b/dictionaries/pt_br.dictionary.itop.ui.php
index a6ff0e28c..2cdd156bb 100644
--- a/dictionaries/pt_br.dictionary.itop.ui.php
+++ b/dictionaries/pt_br.dictionary.itop.ui.php
@@ -472,6 +472,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Manutenção',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'NĆŗmero',
'UI:GroupBy:Count+' => 'NĆŗmero de elementos',
'UI:CountOfObjects' => '%1$d objetos correspondem aos critƩrios.',
@@ -1676,22 +1678,6 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:ConfigurationTools' => 'Configuração',
));
-// OAuth
-Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'UI:Toggle:StandardDashboard' => 'Padrão',
diff --git a/dictionaries/ru.dictionary.itop.ui.php b/dictionaries/ru.dictionary.itop.ui.php
index 51a3e0d81..edc0a00ae 100644
--- a/dictionaries/ru.dictionary.itop.ui.php
+++ b/dictionaries/ru.dictionary.itop.ui.php
@@ -473,6 +473,8 @@ Dict::Add('RU RU', 'Russian', 'Š ŃŃŃŠŗŠøŠ¹', array(
'UI:Error:MaintenanceTitle' => 'ТеŃ
Š½ŠøŃŠµŃкое Š¾Š±ŃŠ»Ńживание',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'ŠŠ¾Š»ŠøŃеŃŃŠ²Š¾',
'UI:GroupBy:Count+' => 'ŠŠ¾Š»ŠøŃеŃŃŠ²Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ńов',
'UI:CountOfObjects' => '%1$d Š¾Š±ŃŠµŠŗŃов ŃŠ¾Š¾ŃвеŃŃŃŠ²ŃŠµŃ ŠŗŃŠøŃŠµŃŠøŃм.',
@@ -1676,22 +1678,6 @@ Dict::Add('RU RU', 'Russian', 'Š ŃŃŃŠŗŠøŠ¹', array(
'Menu:ConfigurationTools' => 'ŠŠ¾Š½ŃигŃŃŠ°ŃŠøŃ',
));
-// OAuth
-Dict::Add('RU RU', 'Russian', 'Š ŃŃŃŠŗŠøŠ¹', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('RU RU', 'Russian', 'Š ŃŃŃŠŗŠøŠ¹', array(
'UI:CSVImport:ObjectsReŃmainedUnchanged' => '%1$d Š¾Š±ŃŠµŠŗŃ(ов) не изменилиŃŃ.',
diff --git a/dictionaries/sk.dictionary.itop.ui.php b/dictionaries/sk.dictionary.itop.ui.php
index 300d084cb..d1a1960ca 100644
--- a/dictionaries/sk.dictionary.itop.ui.php
+++ b/dictionaries/sk.dictionary.itop.ui.php
@@ -462,6 +462,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance~~',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'PoÄet',
'UI:GroupBy:Count+' => '',
'UI:CountOfObjects' => '%1$d objekt/y/ov sa nezhoduje s kritƩriami.',
@@ -1668,22 +1670,6 @@ Dict::Add('SK SK', 'Slovak', 'SlovenÄina', array(
'Menu:ConfigurationTools' => 'Configuration~~',
));
-// OAuth
-Dict::Add('SK SK', 'Slovak', 'SlovenÄina', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('SK SK', 'Slovak', 'SlovenÄina', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/tr.dictionary.itop.ui.php b/dictionaries/tr.dictionary.itop.ui.php
index a0cf9a51a..7f1b7264c 100644
--- a/dictionaries/tr.dictionary.itop.ui.php
+++ b/dictionaries/tr.dictionary.itop.ui.php
@@ -472,6 +472,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => 'Maintenance~~',
'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)~~',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'Say',
'UI:GroupBy:Count+' => 'Eleman sayısı',
'UI:CountOfObjects' => 'Kritere uyan %1$d nesne bulundu.',
@@ -1714,22 +1716,6 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Menu:ConfigurationTools' => 'Configuration~~',
));
-// OAuth
-Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'UI:Toggle:StandardDashboard' => 'Standard~~',
diff --git a/dictionaries/ui/components/datatable/zh_cn.dictionary.itop.datatable.php b/dictionaries/ui/components/datatable/zh_cn.dictionary.itop.datatable.php
index 0328dd329..48b714759 100644
--- a/dictionaries/ui/components/datatable/zh_cn.dictionary.itop.datatable.php
+++ b/dictionaries/ui/components/datatable/zh_cn.dictionary.itop.datatable.php
@@ -24,8 +24,8 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'UI:Datatables:Language:Info' => '_TOTAL_ 锹',
'UI:Datatables:Language:InfoEmpty' => 'ęŖę¾å°ēøå
³äæ”ęÆ',
'UI:Datatables:Language:EmptyTable' => 'č”Øę ¼äøęę ę°ę®',
- 'UI:Datatables:Language:Error' => 'An error occured while running the query~~',
+ 'UI:Datatables:Language:Error' => 'čæč”ę„询ę¶åŗé',
'UI:Datatables:Language:DisplayLength:All' => 'å
ØéØ',
- 'UI:Datatables:Language:Sort:Ascending' => '锺åŗęåŗ',
- 'UI:Datatables:Language:Sort:Descending' => 'ååŗęåŗ',
+ 'UI:Datatables:Language:Sort:Ascending' => 'éēØé”ŗåŗęåŗ',
+ 'UI:Datatables:Language:Sort:Descending' => 'éēØååŗęåŗ',
));
\ No newline at end of file
diff --git a/dictionaries/ui/layouts/activity-panel/zh_cn.dictionary.itop.activity-panel.php b/dictionaries/ui/layouts/activity-panel/zh_cn.dictionary.itop.activity-panel.php
index cd953418e..8efa7a635 100644
--- a/dictionaries/ui/layouts/activity-panel/zh_cn.dictionary.itop.activity-panel.php
+++ b/dictionaries/ui/layouts/activity-panel/zh_cn.dictionary.itop.activity-panel.php
@@ -31,13 +31,13 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Logs:Tooltip' => 'ę¾ē¤ŗ/éč ę„åæ',
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Logs:Menu:Hint' => '请éę©č¦ę¾ē¤ŗēę„åæ',
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Transitions:Title' => 'ē¶ęåå',
- 'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Transitions:Tooltip' => 'ę¾ē¤ŗ / éč ē¶ęåå',
+ 'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Transitions:Tooltip' => 'ę¾ē¤ŗ/éč ē¶ęåå',
'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Edits:Title' => 'ē¼č¾',
- 'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Edits:Tooltip' => 'ę¾ē¤ŗ / éč åꮵē¼č¾',
+ 'UI:Layout:ActivityPanel:Tab:Toolbar:Filter:Edits:Tooltip' => 'ę¾ē¤ŗ/éč åꮵē¼č¾',
'UI:Layout:ActivityPanel:Tab:Toolbar:Action:OpenAll:Tooltip' => 'å
ØéØęå¼',
'UI:Layout:ActivityPanel:Tab:Toolbar:Action:CloseAll:Tooltip' => 'å
ØéØå
³é',
- 'UI:Layout:ActivityPanel:Tab:Toolbar:Info:AuthorsCount:Tooltip' => 'Number of persons interacting in the visible entries~~',
- 'UI:Layout:ActivityPanel:Tab:Toolbar:Info:MessagesCount:Tooltip' => 'Number of messages in the visible log(s)~~',
+ 'UI:Layout:ActivityPanel:Tab:Toolbar:Info:AuthorsCount:Tooltip' => 'ę£åØę„ēę¤ę”ē®ēäŗŗę°',
+ 'UI:Layout:ActivityPanel:Tab:Toolbar:Info:MessagesCount:Tooltip' => 'ę¤ę„åæēę¶ęÆę°',
// Compose button
'UI:Layout:ActivityPanel:ComposeButton:Tooltip' => 'ę°åę°ēę”ē®',
@@ -50,7 +50,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'UI:Layout:ActivityPanel:NotificationEntry:MessageLink:Tooltip' => 'ē¹å»ęå¼éē„ę 仄č·å¾ę“å¤äæ”ęÆ',
// Placeholder
- 'UI:Layout:ActivityPanel:NoEntry:Placeholder:Hint' => 'å¾å¹³é, ęę ä»»ä½ę“»åØ',
+ 'UI:Layout:ActivityPanel:NoEntry:Placeholder:Hint' => 'ęę ä»»ä½ę“»åØ',
// Closed cover
'UI:Layout:ActivityPanel:ClosedCover:Title' => 'ę“»åØé¢ęæ',
diff --git a/dictionaries/ui/layouts/navigation-menu/zh_cn.dictionary.itop.navigation-menu.php b/dictionaries/ui/layouts/navigation-menu/zh_cn.dictionary.itop.navigation-menu.php
index cf6614181..8175c2b26 100644
--- a/dictionaries/ui/layouts/navigation-menu/zh_cn.dictionary.itop.navigation-menu.php
+++ b/dictionaries/ui/layouts/navigation-menu/zh_cn.dictionary.itop.navigation-menu.php
@@ -19,16 +19,16 @@
// Navigation menu
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'å
¬åølogo',
- 'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
- 'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'å±å¼ / ęå ',
- 'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'å±å¼ / ęå (Filtered on %1$s)~~',
+ 'UI:Layout:NavigationMenu:Silo:Label' => '请éę©č¦čæę»¤ēē»ē»',
+ 'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'å±å¼/ęå ',
+ 'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'å±å¼/ęå (čæę»¤åØ %1$s)',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'čæę»¤åØ...',
'UI:Layout:NavigationMenu:MenuFilter:Input:Tooltip' => '请č¾å
„č¦čæę»¤ēå
³é®å',
'UI:Layout:NavigationMenu:MenuFilter:Input:Hint' => 'å°ä¼ę¾ē¤ŗęęå¹é
ēčå',
- 'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
+ 'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'ę¤čåęę čæę»¤ē»ę',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!',
- 'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
- 'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
- 'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
+ 'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s ēč系人夓å',
+ 'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'ęå¼ēØę·čå',
+ 'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'čæę»¤čå',
));
\ No newline at end of file
diff --git a/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php
index b0a061729..43a0b768e 100644
--- a/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php
+++ b/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php
@@ -4,8 +4,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', [
- 'UI:Layout:ObjectDetails:KeyboardShortcut:EditObject' => 'ē¼č¾ę£åØę¾ē¤ŗē对豔',
- 'UI:Layout:ObjectDetails:KeyboardShortcut:DeleteObject' => 'å é¤ę£åØę¾ē¤ŗē对豔',
- 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'å建ę°åÆ¹č±” (äøę£åØę¾ē¤ŗē对豔ēøå)',
- 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'äæåę£åØę¾ē¤ŗē对豔',
+ 'UI:Layout:ObjectDetails:KeyboardShortcut:EditObject' => 'ē¼č¾å½å对豔',
+ 'UI:Layout:ObjectDetails:KeyboardShortcut:DeleteObject' => 'å é¤å½å对豔',
+ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'å建ę°åÆ¹č±” (äøå½å对豔ēøå)',
+ 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'äæåå½å对豔',
]);
diff --git a/dictionaries/ui/layouts/tab-container/zh_cn.dictionary.itop.tab-container.php b/dictionaries/ui/layouts/tab-container/zh_cn.dictionary.itop.tab-container.php
index f92172ff7..484ff1768 100644
--- a/dictionaries/ui/layouts/tab-container/zh_cn.dictionary.itop.tab-container.php
+++ b/dictionaries/ui/layouts/tab-container/zh_cn.dictionary.itop.tab-container.php
@@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', [
- 'UI:Layout:TabContainer:ExtraTabsListToggler:Label' => 'Other tabs~~',
- 'UIBlock:Error:AddBlockNotTabForbidden' => 'Cannot add block %1$s to %2$s (only Tab blocks are allowed)~~',
- 'UIBlock:TabContainer:RemoteTabLoad' => 'Click to load this tab~~',
+ 'UI:Layout:TabContainer:ExtraTabsListToggler:Label' => 'å
¶å®ę ē¾é”µ',
+ 'UIBlock:Error:AddBlockNotTabForbidden' => 'ę ę³ę·»å %1$s å° %2$s (ä»
å
许ę ē¾)',
+ 'UIBlock:TabContainer:RemoteTabLoad' => 'ē¹å»å č½½ę¤ę ē¾',
]);
diff --git a/dictionaries/ui/layouts/ui-content-block/zh_cn.dictionary.itop.ui-content-block.php b/dictionaries/ui/layouts/ui-content-block/zh_cn.dictionary.itop.ui-content-block.php
index 6d64326b5..6f6ed380d 100644
--- a/dictionaries/ui/layouts/ui-content-block/zh_cn.dictionary.itop.ui-content-block.php
+++ b/dictionaries/ui/layouts/ui-content-block/zh_cn.dictionary.itop.ui-content-block.php
@@ -4,5 +4,5 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', [
- 'UIBlock:Error:AddBlockForbidden' => 'Cannot add block to %1$s~~',
+ 'UIBlock:Error:AddBlockForbidden' => 'ę ę³ę·»å å° %1$s',
]);
diff --git a/dictionaries/ui/pages/preferences/zh_cn.dictionary.itop.preferences.php b/dictionaries/ui/pages/preferences/zh_cn.dictionary.itop.preferences.php
index 4dfe47a86..5890a6ec6 100644
--- a/dictionaries/ui/pages/preferences/zh_cn.dictionary.itop.preferences.php
+++ b/dictionaries/ui/pages/preferences/zh_cn.dictionary.itop.preferences.php
@@ -44,5 +44,5 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'UI:Preferences:Tabs:Scrollable:Classic' => 'ē»å
ø',
'UI:Preferences:Tabs:Scrollable:Scrollable' => 'åÆę»åØ',
'UI:Preferences:ChooseAPlaceholder' => 'ēØę·ēé»č®¤å¤“å',
- 'UI:Preferences:ChooseAPlaceholder+' => 'Choose a placeholder image that will be displayed if the contact linked to your user doesn\'t have one~~',
+ 'UI:Preferences:ChooseAPlaceholder+' => 'éę©äøäøŖå ä½å¾ē,å°åØēØę·č系人沔ę设å®å¤“åå¾ēę¶ę¾ē¤ŗ',
));
diff --git a/dictionaries/zh_cn.dictionary.itop.core.php b/dictionaries/zh_cn.dictionary.itop.core.php
index 330776323..eb0900664 100644
--- a/dictionaries/zh_cn.dictionary.itop.core.php
+++ b/dictionaries/zh_cn.dictionary.itop.core.php
@@ -22,7 +22,7 @@
*/
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:DeletedObjectLabel' => '%1s (å·²å é¤)',
- 'Core:DeletedObjectTip' => 'The object has been deleted on %1$s (%2$s)',
+ 'Core:DeletedObjectTip' => '对豔已被å é¤äŗ %1$s (%2$s)',
'Core:UnknownObjectLabel' => '对豔ę¾äøå° (class: %1$s, id: %2$d)',
'Core:UnknownObjectTip' => 'The object could not be found. It may have been deleted some time ago and the log has been purged since.',
@@ -75,7 +75,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:AttributeArchiveFlag' => 'ęÆå¦å½ę”£',
'Core:AttributeArchiveFlag/Value:yes' => 'ęÆ',
- 'Core:AttributeArchiveFlag/Value:yes+' => '评对豔ä»
åØå½ę”£ęØ”å¼åÆč§',
+ 'Core:AttributeArchiveFlag/Value:yes+' => 'ę¤åÆ¹č±”ä»
åØå½ę”£ęØ”å¼åÆč§',
'Core:AttributeArchiveFlag/Value:no' => 'å¦',
'Core:AttributeArchiveFlag/Label' => 'å·²å½ę”£',
'Core:AttributeArchiveFlag/Label+' => '',
@@ -115,18 +115,18 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:AttributeText+' => 'å¤č”å符串',
'Core:AttributeHTML' => 'HTML',
- 'Core:AttributeHTML+' => 'HTML string',
+ 'Core:AttributeHTML+' => 'HTMLå符串',
'Core:AttributeEmailAddress' => 'é®ē®±å°å',
'Core:AttributeEmailAddress+' => 'é®ē®±å°å',
- 'Core:AttributeIPAddress' => 'IP å°å',
- 'Core:AttributeIPAddress+' => 'IP å°å',
+ 'Core:AttributeIPAddress' => 'IPå°å',
+ 'Core:AttributeIPAddress+' => 'IPå°å',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => 'Object Query Langage expression',
- 'Core:AttributeEnum' => 'Enum',
+ 'Core:AttributeEnum' => 'åäø¾',
'Core:AttributeEnum+' => 'List of predefined alphanumeric strings',
'Core:AttributeTemplateString' => 'å符樔ęæ',
@@ -135,11 +135,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:AttributeTemplateText' => 'ęå樔ęæ',
'Core:AttributeTemplateText+' => 'å
å«å ä½ē¬¦ēęę¬',
- 'Core:AttributeTemplateHTML' => 'HTML 樔ęæ',
+ 'Core:AttributeTemplateHTML' => 'HTML樔ęæ',
'Core:AttributeTemplateHTML+' => 'HTML containing placeholders',
'Core:AttributeDateTime' => 'ę„ę/ę¶é“',
- 'Core:AttributeDateTime+' => 'Date and time (year-month-day hh:mm:ss)',
+ 'Core:AttributeDateTime+' => 'Date and time (幓-ę-ę„ ę¶:å:ē§)',
'Core:AttributeDateTime?SmartSearch' => '
ę„ęę ¼å¼:
@@ -180,7 +180,7 @@ Operators:
'Core:AttributeHierarchicalKey' => 'Hierarchical Key',
'Core:AttributeHierarchicalKey+' => 'External (or foreign) key to the parent',
- 'Core:AttributeExternalField' => 'External field',
+ 'Core:AttributeExternalField' => 'å¤éØåꮵ',
'Core:AttributeExternalField+' => 'Field mapped to an external key',
'Core:AttributeURL' => 'URL',
@@ -192,8 +192,8 @@ Operators:
'Core:AttributeOneWayPassword' => 'åååÆē ',
'Core:AttributeOneWayPassword+' => 'ååå åÆ(ęååø) ēåÆē ',
- 'Core:AttributeTable' => 'Table',
- 'Core:AttributeTable+' => 'Indexed array having two dimensions',
+ 'Core:AttributeTable' => '蔨',
+ 'Core:AttributeTable+' => '带瓢å¼ēäŗē»“ę°ē»',
'Core:AttributePropertySet' => 'å±ę§',
'Core:AttributePropertySet+' => 'List of untyped properties (name and value)',
@@ -208,10 +208,10 @@ Operators:
'Core:AttributeTag+' => 'ę ē¾',
'Core:Context=REST/JSON' => 'REST',
- 'Core:Context=Synchro' => 'Synchro~~',
+ 'Core:Context=Synchro' => 'åę„',
'Core:Context=Setup' => 'å®č£
å导',
- 'Core:Context=GUI:Console' => 'Console~~',
- 'Core:Context=CRON' => 'cron~~',
+ 'Core:Context=GUI:Console' => 'å½ä»¤č”',
+ 'Core:Context=CRON' => 'å®ę¶ä»»å”',
'Core:Context=GUI:Portal' => 'éØę·',
));
@@ -230,11 +230,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:CMDBChange+' => 'åę“č·čøŖ',
'Class:CMDBChange/Attribute:date' => 'ę„ę',
'Class:CMDBChange/Attribute:date+' => 'åę“被记å½ēę„ęåę¶é“',
- 'Class:CMDBChange/Attribute:userinfo' => 'ę锹. äæ”ęÆ',
+ 'Class:CMDBChange/Attribute:userinfo' => 'ę锹俔ęÆ',
'Class:CMDBChange/Attribute:userinfo+' => 'å¼å«č
å·²å®ä¹ēäæ”ęÆ',
- 'Class:CMDBChange/Attribute:origin/Value:interactive' => 'User interaction in the GUI~~',
- 'Class:CMDBChange/Attribute:origin/Value:csv-import.php' => 'CSV import script~~',
- 'Class:CMDBChange/Attribute:origin/Value:csv-interactive' => 'CSV import in the GUI~~',
+ 'Class:CMDBChange/Attribute:origin/Value:interactive' => 'å¾å½¢ēé¢äŗ¤äŗ',
+ 'Class:CMDBChange/Attribute:origin/Value:csv-import.php' => '使ēØčę¬åƼå
„CSV',
+ 'Class:CMDBChange/Attribute:origin/Value:csv-interactive' => '使ēØå¾å½¢ēé¢åƼå
„CSV',
'Class:CMDBChange/Attribute:origin/Value:email-processing' => 'Email processing~~',
'Class:CMDBChange/Attribute:origin/Value:synchro-data-source' => 'Synchro. data source~~',
'Class:CMDBChange/Attribute:origin/Value:webservice-rest' => 'REST/JSON webservices~~',
@@ -300,7 +300,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:CMDBChangeOpSetAttributeScalar' => 'å±ę§ę“ę¹č·čøŖ',
'Class:CMDBChangeOpSetAttributeScalar+' => '对豔å±ę§ę“ę¹č·čøŖ',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'ę§å¼',
- 'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '仄å评å±ę§ēå¼',
+ 'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '仄åę¤å±ę§ēå¼',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'ę°å¼',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => 'å±ę§ēę°å¼',
));
@@ -332,7 +332,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:CMDBChangeOpSetAttributeBlob' => 'ę°ę®åę“č·čøŖ',
'Class:CMDBChangeOpSetAttributeBlob+' => 'ę°ę®åę“č·čøŖ',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'ä¹åēå¼',
- 'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '评ę°ę®ä¹åēå
容',
+ 'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'ę¤ę°ę®ä¹åēå
容',
));
//
@@ -343,7 +343,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:CMDBChangeOpSetAttributeText' => 'ęę¬åę“č·čøŖ',
'Class:CMDBChangeOpSetAttributeText+' => 'ęę¬åę“č·čøŖ',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'ę§å¼',
- 'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '评ęę¬ä¹åēå
容',
+ 'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'ę¤ęę¬ä¹åēå
容',
));
//
@@ -414,10 +414,10 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:EventIssue/Attribute:impact+' => 'éč¦ę§å¦ä½',
'Class:EventIssue/Attribute:page' => 'Page',
'Class:EventIssue/Attribute:page+' => 'HTTP entry point',
- 'Class:EventIssue/Attribute:arguments_post' => 'POST åę°',
- 'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST åę°',
- 'Class:EventIssue/Attribute:arguments_get' => 'URL åę°',
- 'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET åę°',
+ 'Class:EventIssue/Attribute:arguments_post' => 'POSTåę°',
+ 'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POSTåę°',
+ 'Class:EventIssue/Attribute:arguments_get' => 'URLåę°',
+ 'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GETåę°',
'Class:EventIssue/Attribute:callstack' => 'č°ēØę ',
'Class:EventIssue/Attribute:callstack+' => 'Call stack',
'Class:EventIssue/Attribute:data' => 'ę°ę®',
@@ -457,9 +457,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:EventRestService/Attribute:code' => '代ē ',
'Class:EventRestService/Attribute:code+' => 'čæå代ē ',
'Class:EventRestService/Attribute:json_output' => 'ååŗ',
- 'Class:EventRestService/Attribute:json_output+' => 'HTTP ååŗ (json)',
- 'Class:EventRestService/Attribute:provider' => 'Provider',
- 'Class:EventRestService/Attribute:provider+' => 'PHP class implementing the expected operation',
+ 'Class:EventRestService/Attribute:json_output+' => 'HTTPååŗ (json)',
+ 'Class:EventRestService/Attribute:provider' => 'ęä¾č
',
+ 'Class:EventRestService/Attribute:provider+' => 'å®ē°ę¤åč½ēPHPē±»',
));
//
@@ -497,7 +497,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Action/Attribute:status/Value:disabled' => 'åēØ',
'Class:Action/Attribute:status/Value:disabled+' => 'åēØ',
'Class:Action/Attribute:trigger_list' => 'ēøå
³ē触ååØ',
- 'Class:Action/Attribute:trigger_list+' => '评ęä½å
³čē触ååØ',
+ 'Class:Action/Attribute:trigger_list+' => 'ę¤ęä½å
³čē触ååØ',
'Class:Action/Attribute:finalclass' => 'Action sub-class',
'Class:Action/Attribute:finalclass+' => 'Name of the final class',
'Action:WarningNoTriggerLinked' => 'Warning, no trigger is linked to the action. It will not be active until it has at least 1.~~',
@@ -744,7 +744,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:Synchro:ModifiedLabel' => '已修ę¹',
'Core:Synchro:UnchangedLabel' => 'äæęäøå',
'Core:Synchro:ReconciledErrorsLabel' => 'é误',
- 'Core:Synchro:ReconciledLabel' => 'Reconciled',
+ 'Core:Synchro:ReconciledLabel' => 'å·²ę øåÆ¹',
'Core:Synchro:ReconciledNewLabel' => 'å·²å建',
'Core:SynchroReconcile:Yes' => 'ęÆ',
'Core:SynchroReconcile:No' => 'å¦',
@@ -841,13 +841,13 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'å
ę“ę°åå é¤',
'Class:SynchroDataSource/Attribute:attribute_list' => 'å±ę§å蔨',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'ä»
éē®”ēå',
- 'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Everybody allowed to delete such objects',
+ 'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'å
许ęęäŗŗå é¤ę¤åÆ¹č±”',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nobody',
'Class:SynchroAttribute' => 'åę„å±ę§',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'åę„ę°ę®ęŗ',
'Class:SynchroAttribute/Attribute:attcode' => 'å±ę§ä»£ē ',
'Class:SynchroAttribute/Attribute:update' => 'ę“ę°',
- 'Class:SynchroAttribute/Attribute:reconcile' => 'Reconcile',
+ 'Class:SynchroAttribute/Attribute:reconcile' => 'ę øåÆ¹',
'Class:SynchroAttribute/Attribute:update_policy' => 'ę“ę°ēē„',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'å é',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'č§£é',
@@ -926,7 +926,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:BulkExport:HTMLFormat' => 'ē½é”µ (*.html)',
'Core:BulkExport:CSVFormat' => 'CSV (*.csv)',
'Core:BulkExport:XLSXFormat' => 'Excel 2007+ (*.xlsx)',
- 'Core:BulkExport:PDFFormat' => 'PDF ę攣 (*.pdf)',
+ 'Core:BulkExport:PDFFormat' => 'PDFę攣 (*.pdf)',
'Core:BulkExport:DragAndDropHelp' => 'åÆęåØęå é¤å夓čæč”ęåŗ. ę£åØé¢č§ %1$s č”. äøå
±éč¦åƼåŗ: %2$s č”.',
'Core:BulkExport:EmptyPreview' => '请éę©č¦åƼåŗēå',
'Core:BulkExport:ColumnsOrder' => 'å锺åŗ',
@@ -935,9 +935,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:BulkExport:CheckAll' => 'å
Øé',
'Core:BulkExport:UncheckAll' => 'åé',
'Core:BulkExport:ExportCancelledByUser' => '导åŗč¢«ēØę·åę¶',
- 'Core:BulkExport:CSVOptions' => 'CSV é锹',
+ 'Core:BulkExport:CSVOptions' => 'CSVé锹',
'Core:BulkExport:CSVLocalization' => 'ę¬å°å',
- 'Core:BulkExport:PDFOptions' => 'PDF é锹',
+ 'Core:BulkExport:PDFOptions' => 'PDFé锹',
'Core:BulkExport:PDFPageFormat' => '锵é¢ę ¼å¼',
'Core:BulkExport:PDFPageSize' => '锵é¢å¤§å°:',
'Core:BulkExport:PageSize-A4' => 'A4',
@@ -954,14 +954,14 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Core:BulkExport:OptionLinkSets' => 'å
å«å¤é¾ē对豔',
'Core:BulkExport:OptionFormattedText' => 'äæęęę¬ę ¼å¼',
'Core:BulkExport:ScopeDefinition' => 'å®ä¹č¦åƼåŗē对豔',
- 'Core:BulkExportLabelOQLExpression' => 'OQL ę„询:',
+ 'Core:BulkExportLabelOQLExpression' => 'OQLę„询:',
'Core:BulkExportLabelPhrasebookEntry' => 'Query Phrasebook Entry:',
- 'Core:BulkExportMessageEmptyOQL' => '请č¾å
„ęęēOQL ę„询.',
+ 'Core:BulkExportMessageEmptyOQL' => '请č¾å
„ęęēOQLę„询.',
'Core:BulkExportMessageEmptyPhrasebookEntry' => 'Please select a valid phrasebook entry.',
- 'Core:BulkExportQueryPlaceholder' => '请åØčæéč¾å
„OQL ę„询...',
+ 'Core:BulkExportQueryPlaceholder' => '请åØčæéč¾å
„OQLę„询...',
'Core:BulkExportCanRunNonInteractive' => 'ē¹å»čæéčæč”éäŗ¤äŗå¼åƼåŗ.',
'Core:BulkExportLegacyExport' => 'ē¹å»čæéčæå
„ę§ē导åŗ.',
- 'Core:BulkExport:XLSXOptions' => 'Excel é锹',
+ 'Core:BulkExport:XLSXOptions' => 'Excelé锹',
'Core:BulkExport:TextFormat' => 'ęę¬äøå
å«äøäŗHTML ę č®°',
'Core:BulkExport:DateTimeFormat' => 'ę„ęåę¶é“ę ¼å¼',
'Core:BulkExport:DateTimeFormatDefault_Example' => 'é»č®¤ę ¼å¼ (%1$s), e.g. %2$s',
@@ -1020,7 +1020,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
// Class: DBProperty
//
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Class:DBProperty' => 'DB å±ę§',
+ 'Class:DBProperty' => 'ę°ę®åŗå±ę§',
'Class:DBProperty+' => '~~',
'Class:DBProperty/Attribute:name' => 'åē§°',
'Class:DBProperty/Attribute:name+' => '',
diff --git a/dictionaries/zh_cn.dictionary.itop.ui.php b/dictionaries/zh_cn.dictionary.itop.ui.php
index a1f3fd83c..8b05300d7 100644
--- a/dictionaries/zh_cn.dictionary.itop.ui.php
+++ b/dictionaries/zh_cn.dictionary.itop.ui.php
@@ -25,11 +25,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:AuditCategory/Attribute:name' => 'ē±»å«åē§°',
'Class:AuditCategory/Attribute:name+' => 'ē±»å«ē®ē§°',
'Class:AuditCategory/Attribute:description' => '宔讔类å«ęčæ°',
- 'Class:AuditCategory/Attribute:description+' => '评宔讔类å«ē详ē»ęčæ°',
+ 'Class:AuditCategory/Attribute:description+' => 'ę¤å®”讔类å«ē详ē»ęčæ°',
'Class:AuditCategory/Attribute:definition_set' => 'å®ä¹',
'Class:AuditCategory/Attribute:definition_set+' => 'å®ä¹ēØäŗå®”č®”ē对豔ēOQL蔨达å¼',
'Class:AuditCategory/Attribute:rules_list' => '宔讔č§å',
- 'Class:AuditCategory/Attribute:rules_list+' => '评类å«ē宔讔č§å',
+ 'Class:AuditCategory/Attribute:rules_list+' => 'ę¤ē±»å«ē宔讔č§å',
));
//
@@ -43,11 +43,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:AuditRule/Attribute:name+' => 'č§ååē§°',
'Class:AuditRule/Attribute:description' => '宔讔č§åęčæ°',
'Class:AuditRule/Attribute:description+' => '宔讔č§å详ē»ęčæ°',
- 'Class:TagSetFieldData/Attribute:finalclass' => 'Tag class~~',
- 'Class:TagSetFieldData/Attribute:obj_class' => 'Object class~~',
+ 'Class:TagSetFieldData/Attribute:finalclass' => 'ę ē¾ē±»',
+ 'Class:TagSetFieldData/Attribute:obj_class' => '对豔类',
'Class:TagSetFieldData/Attribute:obj_attcode' => 'Field code~~',
'Class:AuditRule/Attribute:query' => 'č¦čæč”ēę„询',
- 'Class:AuditRule/Attribute:query+' => 'č¦čæč”ēOQL 蔨达å¼',
+ 'Class:AuditRule/Attribute:query+' => 'č¦čæč”ēOQL蔨达å¼',
'Class:AuditRule/Attribute:valid_flag' => 'ęÆå¦ęę?',
'Class:AuditRule/Attribute:valid_flag+' => 'č„č§åčæåęę对豔åTrue,å¦åFalse',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'true',
@@ -55,9 +55,9 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'false',
'Class:AuditRule/Attribute:valid_flag/Value:false+' => 'false',
'Class:AuditRule/Attribute:category_id' => 'ē±»å«',
- 'Class:AuditRule/Attribute:category_id+' => '评č§å对åŗēē±»å«',
+ 'Class:AuditRule/Attribute:category_id+' => 'ä»č§å对åŗēē±»å«',
'Class:AuditRule/Attribute:category_name' => 'ē±»å«',
- 'Class:AuditRule/Attribute:category_name+' => '评č§å对åŗē±»å«ēåē§°',
+ 'Class:AuditRule/Attribute:category_name+' => 'ę¤č§å对åŗē±»å«ēåē§°',
));
//
@@ -70,17 +70,17 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:Query/Attribute:name' => 'åē§°',
'Class:Query/Attribute:name+' => 'ę„询ēåē§°',
'Class:Query/Attribute:description' => 'ęčæ°',
- 'Class:Query/Attribute:description+' => '请ęčæ°ę¤ę„询 (ē®ēćēØę³ēē.)',
- 'Class:Query/Attribute:is_template' => 'Template for OQL fields~~',
+ 'Class:Query/Attribute:description+' => '请ęčæ°ę¤ę„询 (ē®ē,ēØę³ēē.)',
+ 'Class:Query/Attribute:is_template' => 'OQL樔ęæ',
'Class:Query/Attribute:is_template+' => 'Usable as source for recipient OQL in Notifications~~',
'Class:Query/Attribute:is_template/Value:yes' => 'ęÆ',
'Class:Query/Attribute:is_template/Value:no' => 'å¦',
'Class:QueryOQL/Attribute:fields' => 'åŗå',
'Class:QueryOQL/Attribute:fields+' => 'å±ę§ä¹é“使ēØéå·åé (or alias.attribute) to export~~',
- 'Class:QueryOQL' => 'OQL ę„询',
- 'Class:QueryOQL+' => 'A query based on the Object Query Language',
+ 'Class:QueryOQL' => 'OQLę„询',
+ 'Class:QueryOQL+' => 'äøē§åŗäŗåÆ¹č±”ę„询ēčÆčØ',
'Class:QueryOQL/Attribute:oql' => '蔨达å¼',
- 'Class:QueryOQL/Attribute:oql+' => 'OQL 蔨达å¼',
+ 'Class:QueryOQL/Attribute:oql+' => 'OQL蔨达å¼',
));
//////////////////////////////////////////////////////////////////////
@@ -112,11 +112,11 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:User/Attribute:language' => 'čÆčØ',
'Class:User/Attribute:language+' => 'ēØę·čÆčØ',
'Class:User/Attribute:language/Value:EN US' => 'č±čÆ',
- 'Class:User/Attribute:language/Value:EN US+' => 'č±čÆ (U.S.)',
+ 'Class:User/Attribute:language/Value:EN US+' => 'č±čÆ(U.S.)',
'Class:User/Attribute:language/Value:FR FR' => 'ę³čÆ',
- 'Class:User/Attribute:language/Value:FR FR+' => 'ę³čÆ (France)',
+ 'Class:User/Attribute:language/Value:FR FR+' => 'ę³čÆ(France)',
'Class:User/Attribute:profile_list' => 'č§č²',
- 'Class:User/Attribute:profile_list+' => 'ęäŗčÆ„ēØę·ēč§č²',
+ 'Class:User/Attribute:profile_list+' => 'ęäŗę¤ēØę·ēč§č²',
'Class:User/Attribute:allowed_org_list' => 'åÆč®æé®ēē»ē»',
'Class:User/Attribute:allowed_org_list+' => 'ē®ę ēØę·åÆä»„ēå°ä»„äøē»ē»ēę°ę®. å¦ęę²”ęęå®,åę éå¶.',
'Class:User/Attribute:status' => 'ē¶ę',
@@ -125,14 +125,14 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:User/Attribute:status/Value:disabled' => 'åēØ',
'Class:User/Error:LoginMustBeUnique' => 'ē»å½ååæ
é”»åÆäø - "%1s" å·²ē»č¢«ä½æēØ.',
- 'Class:User/Error:AtLeastOneProfileIsNeeded' => 'åæ
é”»ęå®č³å°äøäøŖč§č²ē»čÆ„ēØę·.',
+ 'Class:User/Error:AtLeastOneProfileIsNeeded' => 'åæ
é”»ęå®č³å°äøäøŖč§č²ē»ę¤ēØę·.',
'Class:User/Error:ProfileNotAllowed' => 'Profile "%1$s" cannot be added it will deny the access to backoffice~~',
'Class:User/Error:StatusChangeIsNotAllowed' => 'Changing status is not allowed for your own User~~',
'Class:User/Error:AllowedOrgsMustContainUserOrg' => 'Allowed organizations must contain User organization~~',
'Class:User/Error:CurrentProfilesHaveInsufficientRights' => 'The current list of profiles does not give sufficient access rights (Users are not modifiable anymore)~~',
- 'Class:User/Error:AtLeastOneOrganizationIsNeeded' => 'åæ
锻为评ēØę·ęå®äøäøŖē»ē».',
- 'Class:User/Error:OrganizationNotAllowed' => '评ē»ē»äøč¢«å
许.',
- 'Class:User/Error:UserOrganizationNotAllowed' => '评ēØę·č“¦ę·äøå±äŗé£äøŖē»ē».',
+ 'Class:User/Error:AtLeastOneOrganizationIsNeeded' => 'åæ
锻为ę¤ēØę·ęå®äøäøŖē»ē».',
+ 'Class:User/Error:OrganizationNotAllowed' => 'ę¤ē»ē»äøč¢«å
许.',
+ 'Class:User/Error:UserOrganizationNotAllowed' => 'ę¤ēØę·č“¦ę·äøå±äŗé£äøŖē»ē».',
'Class:User/Error:PersonIsMandatory' => 'č系人åæ
唫.',
'Class:UserInternal' => 'å
éØēØę·',
'Class:UserInternal+' => ITOP_APPLICATION_SHORT.' å
éØå®ä¹ēēØę·',
@@ -150,7 +150,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:URP_Profiles/Attribute:description' => 'ęčæ°',
'Class:URP_Profiles/Attribute:description+' => 'åč”ęčæ°',
'Class:URP_Profiles/Attribute:user_list' => 'ēØę·',
- 'Class:URP_Profiles/Attribute:user_list+' => 'ę„ę评č§č²ēēØę·',
+ 'Class:URP_Profiles/Attribute:user_list+' => 'ę„ęę¤č§č²ēēØę·',
));
//
@@ -175,7 +175,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:URP_UserProfile' => 'č§č²ē®ę ēØę·',
'Class:URP_UserProfile+' => 'ēØę·ēč§č²',
- 'Class:URP_UserProfile/Name' => 'é¾ę„ %1$s å %2$s',
+ 'Class:URP_UserProfile/Name' => 'å
³č %1$s å %2$s',
'Class:URP_UserProfile/Attribute:userid' => 'ēØę·',
'Class:URP_UserProfile/Attribute:userid+' => 'ēØę·åøę·',
'Class:URP_UserProfile/Attribute:userlogin' => 'ē»å½å',
@@ -185,7 +185,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:URP_UserProfile/Attribute:profile' => 'č§č²',
'Class:URP_UserProfile/Attribute:profile+' => 'č§č²åē§°',
'Class:URP_UserProfile/Attribute:reason' => 'åå ',
- 'Class:URP_UserProfile/Attribute:reason+' => 'č§£éäøŗä»ä¹ę¤ēØę·éč¦ę„ę评č§č²',
+ 'Class:URP_UserProfile/Attribute:reason+' => 'č§£éäøŗä»ä¹ę¤ēØę·éč¦ę„ęę¤č§č²',
));
//
@@ -196,7 +196,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:URP_UserOrg' => 'ēØę·ē»ē»',
'Class:URP_UserOrg+' => 'åÆä»„访é®ēē»ē»',
- 'Class:URP_UserOrg/Name' => 'é¾ę„ %1$s å %2$s',
+ 'Class:URP_UserOrg/Name' => 'å
³č %1$s å %2$s',
'Class:URP_UserOrg/Attribute:userid' => 'ēØę·',
'Class:URP_UserOrg/Attribute:userid+' => 'ēØę·åøę·',
'Class:URP_UserOrg/Attribute:userlogin' => 'ē»å½å',
@@ -206,7 +206,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'ē»ē»',
'Class:URP_UserOrg/Attribute:allowed_org_name+' => 'åÆä»„访é®ēē»ē»',
'Class:URP_UserOrg/Attribute:reason' => 'åå ',
- 'Class:URP_UserOrg/Attribute:reason+' => 'č§£éäøŗä»ä¹ę¤ēØę·åÆä»„访é®čÆ„ē»ē»ēę°ę®',
+ 'Class:URP_UserOrg/Attribute:reason+' => 'č§£éäøŗä»ä¹ę¤ēØę·åÆä»„访é®ę¤ē»ē»ēę°ę®',
));
//
@@ -225,7 +225,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:URP_ProfileProjection/Attribute:profile' => 'č§č²',
'Class:URP_ProfileProjection/Attribute:profile+' => 'č§č²åē§°',
'Class:URP_ProfileProjection/Attribute:value' => 'å¼č”Øč¾¾å¼',
- 'Class:URP_ProfileProjection/Attribute:value+' => 'OQL č”Øč¾¾å¼ (using $user) | constant | | +attribute code',
+ 'Class:URP_ProfileProjection/Attribute:value+' => 'OQLč”Øč¾¾å¼ (using $user) | constant | | +attribute code',
'Class:URP_ProfileProjection/Attribute:attribute' => 'å±ę§',
'Class:URP_ProfileProjection/Attribute:attribute+' => 'ē®ę å±ę§ē¼ē (åÆé)',
));
@@ -244,7 +244,7 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Class:URP_ClassProjection/Attribute:class' => 'ē±»',
'Class:URP_ClassProjection/Attribute:class+' => 'ē®ę ē±»',
'Class:URP_ClassProjection/Attribute:value' => 'å¼č”Øč¾¾å¼',
- 'Class:URP_ClassProjection/Attribute:value+' => 'OQL č”Øč¾¾å¼ (using $this) | constant | | +attribute code',
+ 'Class:URP_ClassProjection/Attribute:value+' => 'OQLč”Øč¾¾å¼ (using $this) | constant | | +attribute code',
'Class:URP_ClassProjection/Attribute:attribute' => 'å±ę§',
'Class:URP_ClassProjection/Attribute:attribute+' => 'ē®ę å±ę§ē¼ē (åÆé)',
));
@@ -347,12 +347,12 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Menu:WelcomeMenuPage+' => '欢čæä½æēØ '.ITOP_APPLICATION_SHORT, // Duplicated into itop-welcome-itil (will be removed from here...)
'UI:WelcomeMenu:Title' => '欢čæä½æēØ '.ITOP_APPLICATION_SHORT,
- 'UI:WelcomeMenu:LeftBlock' => '
'.ITOP_APPLICATION_SHORT.' ęÆå®å
Øå¼ęŗēIT ęä½éØę·.
+ 'UI:WelcomeMenu:LeftBlock' => ''.ITOP_APPLICATION_SHORT.' ęÆå®å
Øå¼ęŗēITęä½éØę·.
å®å
ę¬:
-å®ę“ēCMDB(Configuration management database)ļ¼ēØäŗē»č®°åē®”ēęØēIT čµäŗ§.
-äŗä»¶ē®”ē樔åēØäŗč·čøŖåä¼ éęęåēåØIT ē³»ē»äøēäŗä»¶.
-åę“ē®”ē樔åēØäŗč§ååč·čøŖIT ēÆå¢äøåēēåå.
-å·²ē„é误ę°ę®åŗåÆå éäŗä»¶ēå¤ē.
+å®ę“ēCMDB(é
置箔ēę°ę®åŗ),ēØäŗē»č®°åē®”ēęØēITčµäŗ§.
+äŗä»¶ē®”ē樔åēØäŗč·čøŖåä¼ éęęåēåØITē³»ē»äøēäŗä»¶.
+åę“ē®”ē樔åēØäŗč§ååč·čøŖITēÆå¢äøåēēåå.
+å·²ē„é®é¢ę°ę®åŗåÆå éäŗä»¶ēå¤ē.
åęŗęØ”åč®°å½ęęč®”åå
ēåęŗå¹¶éē„对åŗēč系人.
éčæä»Ŗč”Øēåæ«éč·å¾ęØēITę¦åµ.
@@ -360,27 +360,27 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'UI:WelcomeMenu:RightBlock' => ''.ITOP_APPLICATION_SHORT.' ęÆé¢åęå”ä¾åŗåē, å®ä½æå¾IT å·„ēØåøč½å¤ę“ę¹ä¾æå°ē®”ēå¤å®¢ę·åå¤ē»ē».
'.ITOP_APPLICATION_SHORT.' ęä¾åč½äø°åÆēäøå”å¤ēęµēØ:
-ęé«IT ē®”ēęē
-ęåIT åÆęä½č½å
+ęé«ITē®”ēęē
+ęåITåÆęä½č½å
ęé«ēØę·ę»”ęåŗ¦,ęåäøå”č½å.
-'.ITOP_APPLICATION_SHORT.' ęÆå®å
Øå¼ę¾ē,åÆč¢«éęå°ē°ęēIT ē®”ēę¶ęä¹äø.
+'.ITOP_APPLICATION_SHORT.' ęÆå®å
Øå¼ę¾ē,åÆč¢«éęå°ē°ęēITē®”ēę¶ęä¹äø.
-
å©ēØčæäøŖę°äøä»£ēIT ęä½éØę·, åÆä»„åø®å©ęØ:
-ę“儽å°ē®”ēč¶ę„č¶å¤ęēIT ēÆå¢.
-éę„å®ē°ITIL ęµēØ.
+å©ēØčæäøŖę°äøä»£ēITęä½éØę·, åÆä»„åø®å©ęØ:
+ę“儽å°ē®”ēč¶ę„č¶å¤ęēITēÆå¢.
+éę„å®ē°ITILęµēØ.
ē®”ēIT äøęéč¦ēčµäŗ§: ę攣.
',
- 'UI:WelcomeMenu:Text'=> 'Congratulations, you landed on '.ITOP_APPLICATION.' '.ITOP_VERSION_NAME.'!
+ 'UI:WelcomeMenu:Text'=> 'ęå, ęØčæč”ēęÆ '.ITOP_APPLICATION.' '.ITOP_VERSION_NAME.'!
-This version features a brand new modern and accessible backoffice design.
+ę¤ēę¬å
Øę°č®¾č®”äŗäøäøŖē°ä»£äøęēØēåå°ēé¢.
-We kept '.ITOP_APPLICATION.' core functions that you liked and modernized them to make you love them.
-We hope youāll enjoy this version as much as we enjoyed imagining and creating it.
+ę们äøä»
äæē '.ITOP_APPLICATION.' äøęØęåē±ēę øåæåč½,åę¶ä½æå
¶ę“å
·ē°ä»£å.
+ę们蔷åæå°åøęęØåē±ę¤ēę¬,ę£å¦ę们åØč®¾č®”åå®ē°å®ēę¶åäøę ·.
-Customize your '.ITOP_APPLICATION.' preferences for a personalized experience.
',
+å®å¶åęØē '.ITOP_APPLICATION.' 设置,å®ē°äøŖę§åä½éŖ.
',
'UI:WelcomeMenu:AllOpenRequests' => 'ęęęå¼ēéę±: %1$d',
'UI:WelcomeMenu:MyCalls' => 'ęåēēéę±',
'UI:WelcomeMenu:OpenIncidents' => 'ęęęå¼ēäŗä»¶: %1$d',
@@ -395,7 +395,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Button:Search' => 'ęē“¢',
'UI:Button:Clear' => ' ęø
空',
'UI:Button:SearchInHierarchy' => ' éå½ęē“¢',
- 'UI:Button:Query' => ' ę„询 ',
+ 'UI:Button:Query' => 'ę„询',
'UI:Button:Ok' => 'OK',
'UI:Button:Save' => 'äæå',
'UI:Button:SaveAnd' => 'äæåå¹¶ %1$s',
@@ -404,31 +404,31 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Button:Apply' => 'åŗēØ',
'UI:Button:Send' => 'åé',
'UI:Button:SendAnd' => 'åéå¹¶ %1$s',
- 'UI:Button:Back' => ' << äøäøę„ ',
- 'UI:Button:Restart' => ' |<< éę„ ',
- 'UI:Button:Next' => ' äøäøę„ >> ',
- 'UI:Button:Finish' => ' ē»ę ',
+ 'UI:Button:Back' => '<< äøäøę„',
+ 'UI:Button:Restart' => '|<< éę„',
+ 'UI:Button:Next' => 'äøäøę„ >>',
+ 'UI:Button:Finish' => 'ē»ę',
'UI:Button:DoImport' => ' ę§č”导å
„ ! ',
- 'UI:Button:Done' => ' å®ę ',
- 'UI:Button:SimulateImport' => ' å¼å§åƼå
„ ',
+ 'UI:Button:Done' => 'å®ę',
+ 'UI:Button:SimulateImport' => 'å¼å§åƼå
„',
'UI:Button:Test' => 'ęµčÆ!',
- 'UI:Button:Evaluate' => ' ęµčÆ ',
- 'UI:Button:Evaluate:Title' => ' čÆä¼° (Ctrl+Enter)',
- 'UI:Button:AddObject' => ' ę·»å ... ',
- 'UI:Button:BrowseObjects' => ' ęµč§... ',
- 'UI:Button:Add' => ' ę·»å ',
- 'UI:Button:AddToList' => ' << ę·»å ',
- 'UI:Button:RemoveFromList' => ' ē§»é¤ >> ',
- 'UI:Button:FilterList' => ' čæę»¤... ',
- 'UI:Button:Create' => ' å建 ',
- 'UI:Button:Delete' => ' å é¤ ! ',
- 'UI:Button:Rename' => ' éå½å... ',
- 'UI:Button:ChangePassword' => ' äæ®ę¹åÆē ',
- 'UI:Button:ResetPassword' => ' éē½®åÆē ',
+ 'UI:Button:Evaluate' => 'ęµčÆ',
+ 'UI:Button:Evaluate:Title' => 'čÆä¼° (Ctrl+Enter)',
+ 'UI:Button:AddObject' => 'ę·»å ... ',
+ 'UI:Button:BrowseObjects' => 'ęµč§...',
+ 'UI:Button:Add' => 'ę·»å ',
+ 'UI:Button:AddToList' => '<< ę·»å ',
+ 'UI:Button:RemoveFromList' => 'ē§»é¤ >>',
+ 'UI:Button:FilterList' => 'čæę»¤...',
+ 'UI:Button:Create' => 'å建',
+ 'UI:Button:Delete' => 'å é¤!',
+ 'UI:Button:Rename' => 'éå½å...',
+ 'UI:Button:ChangePassword' => 'äæ®ę¹åÆē ',
+ 'UI:Button:ResetPassword' => 'éē½®åÆē ',
'UI:Button:Insert' => 'ęå
„',
'UI:Button:More' => 'ę“å¤',
'UI:Button:Less' => 'ę“å°',
- 'UI:Button:Wait' => 'ę£åØę“ę°åꮵļ¼čÆ·ēØå',
+ 'UI:Button:Wait' => 'ę£åØę“ę°åꮵ,请ēØå',
'UI:Treeview:CollapseAll' => 'å
ØéØę¶čµ·',
'UI:Treeview:ExpandAll' => 'å
ØéØå±å¼',
'UI:UserPref:DoNotShowAgain' => 'äøåę¾ē¤ŗ',
@@ -455,21 +455,21 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:UploadStoppedByExtension_FileName' => 'äøä¼ å äøŗę©å±å被åę¢. (Original file name = "%1$s").',
'UI:Error:UploadFailedUnknownCause_Code' => 'ęä»¶äøä¼ 失蓄, åå ęŖē„. (Error code = "%1$s").',
- 'UI:Error:1ParametersMissing' => 'é误: åæ
锻为评ęä½ęå®ä»„äøåę°: %1$s.',
- 'UI:Error:2ParametersMissing' => 'é误: åæ
锻为评ęä½ęå®ä»„äøåę°: %1$s and %2$s.',
- 'UI:Error:3ParametersMissing' => 'é误: åæ
锻为评ęä½ęå®ä»„äøåę°: %1$s, %2$s and %3$s.',
- 'UI:Error:4ParametersMissing' => 'é误: åæ
锻为评ęä½ęå®ä»„äøåę°: %1$s, %2$s, %3$s and %4$s.',
- 'UI:Error:IncorrectOQLQuery_Message' => 'é误: é误ē OQL ę„询: %1$s',
- 'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'čæč”评ę„询ę¶åēäŗäøäøŖé误: %1$s',
- 'UI:Error:ObjectAlreadyUpdated' => 'é误: 评对豔已ę“ę°.',
+ 'UI:Error:1ParametersMissing' => 'é误: åæ
锻为ę¤ęä½ęå®ä»„äøåę°: %1$s.',
+ 'UI:Error:2ParametersMissing' => 'é误: åæ
锻为ę¤ęä½ęå®ä»„äøåę°: %1$s and %2$s.',
+ 'UI:Error:3ParametersMissing' => 'é误: åæ
锻为ę¤ęä½ęå®ä»„äøåę°: %1$s, %2$s and %3$s.',
+ 'UI:Error:4ParametersMissing' => 'é误: åæ
锻为ę¤ęä½ęå®ä»„äøåę°: %1$s, %2$s, %3$s and %4$s.',
+ 'UI:Error:IncorrectOQLQuery_Message' => 'é误: é误ēOQLę„询: %1$s',
+ 'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'čæč”ę¤ę„询ę¶åēäŗäøäøŖé误: %1$s',
+ 'UI:Error:ObjectAlreadyUpdated' => 'é误: ę¤åÆ¹č±”å·²ę“ę°.',
'UI:Error:ObjectCannotBeUpdated' => 'é误: 对豔ę ę³ę“ę°.',
'UI:Error:ObjectsAlreadyDeleted' => 'é误: 对豔已被å é¤!',
'UI:Error:BulkDeleteNotAllowedOn_Class' => 'ęØę ęčæč” %1$s 类对豔ēę¹éå é¤',
'UI:Error:DeleteNotAllowedOn_Class' => 'ęØę ęå é¤ %1$s ē±»ē对豔',
'UI:Error:ReadNotAllowedOn_Class' => 'ęØę ęę„ē对豔ē %1$s',
'UI:Error:BulkModifyNotAllowedOn_Class' => 'ęØę ęčæč” %1$s 类对豔ēę¹éę“ę°',
- 'UI:Error:ObjectAlreadyCloned' => 'é误: 评对豔已被å
é!',
- 'UI:Error:ObjectAlreadyCreated' => 'é误: 评对豔已被å建!',
+ 'UI:Error:ObjectAlreadyCloned' => 'é误: ę¤åÆ¹č±”å·²č¢«å
é!',
+ 'UI:Error:ObjectAlreadyCreated' => 'é误: ę¤åÆ¹č±”å·²č¢«å建!',
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'é误: åØåÆ¹č±” %2$s ē "%3$s" ē¶ęäøēę ęåŗęæ "%1$s" .',
'UI:Error:InvalidDashboardFile' => 'Error: ę ęē仪蔨ēęä»¶',
'UI:Error:InvalidDashboard' => 'Error: ę ęē仪蔨ē',
@@ -477,6 +477,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Error:MaintenanceTitle' => '结ę¤',
'UI:Error:InvalidToken' => 'Error: ę请ę±ēęä½å·²ę§č” (ęŖåē° CSRF token )',
+ 'UI:Error:SMTP:UnknownVendor' => 'OAuth SMTP provider %1$s does not exist (email_transport_smtp.oauth.provider)~~',
+
'UI:GroupBy:Count' => 'äøŖę°',
'UI:GroupBy:Count+' => '锹ē®ę°',
'UI:CountOfObjects' => '%1$d 个对豔符åęå®ēę”ä»¶.',
@@ -493,7 +495,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:History:User' => 'ēØę·',
'UI:History:User+' => 'é ęåę“ēēØę·',
'UI:History:Changes' => 'åę“',
- 'UI:History:Changes+' => '对评对豔ęåēåę“',
+ 'UI:History:Changes+' => '对ę¤åÆ¹č±”ęåēåę“',
'UI:History:StatsCreations' => 'å·²å建',
'UI:History:StatsCreations+' => 'å·²å建ē对豔个ę°',
'UI:History:StatsModifs' => '已修ę¹',
@@ -509,7 +511,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Menu:Add' => 'ę·»å ...',
'UI:Menu:Manage' => 'ē®”ē...',
'UI:Menu:EMail' => 'é®ä»¶',
- 'UI:Menu:CSVExport' => 'CSV 导åŗ...',
+ 'UI:Menu:CSVExport' => 'CSV导åŗ...',
'UI:Menu:Modify' => 'äæ®ę¹...',
'UI:Menu:Delete' => 'å é¤...',
'UI:Menu:BulkDelete' => 'å é¤...',
@@ -517,15 +519,15 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Document:OpenInNewWindow:Download' => 'åØę°ēŖå£ęå¼: %1$s, äøč½½: %2$s',
'UI:SplitDateTime-Date' => 'ę„ę',
'UI:SplitDateTime-Time' => 'ę¶é“',
- 'UI:TruncatedResults' => 'ę¾ē¤ŗ %1$d 个对豔ļ¼å
± %2$d äøŖ',
+ 'UI:TruncatedResults' => 'ę¾ē¤ŗ %1$d 个对豔,å
± %2$d äøŖ',
'UI:DisplayAll' => 'å
ØéØę¾ē¤ŗ',
'UI:CollapseList' => 'ę¶čµ·',
'UI:CountOfResults' => '%1$d 个对豔',
'UI:ChangesLogTitle' => 'åę“č®°å½ (%1$d):',
'UI:EmptyChangesLogTitle' => 'åę“č®°å½äøŗē©ŗ',
'UI:SearchFor_Class_Objects' => 'ęē“¢ %1$s ',
- 'UI:OQLQueryBuilderTitle' => 'OQL ę„询ę建åØ',
- 'UI:OQLQueryTab' => 'OQL ę„询',
+ 'UI:OQLQueryBuilderTitle' => 'OQLę„询ę建åØ',
+ 'UI:OQLQueryTab' => 'OQLę„询',
'UI:SimpleSearchTab' => 'ē®åęē“¢',
'UI:Details+' => '详ę
',
'UI:SearchValue:Any' => '* ä»»ä½ *',
@@ -548,9 +550,9 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:ResetPwd-Error-WrongLogin' => '\'%1$s\' ēØę·åę ę',
'UI:ResetPwd-Error-NotPossible' => 'å¤éØč“¦ę·äøå
许éē½®åÆē .',
- 'UI:ResetPwd-Error-FixedPwd' => '评蓦ę·äøå
许éē½®åÆē .',
- 'UI:ResetPwd-Error-NoContact' => '评蓦ę·ę²”ęå
³čå°äøŖäŗŗ.',
- 'UI:ResetPwd-Error-NoEmailAtt' => '评蓦ę·ęŖå
³čé®ē®±å°åļ¼čÆ·č系箔ēå.',
+ 'UI:ResetPwd-Error-FixedPwd' => 'ę¤č“¦ę·äøå
许éē½®åÆē .',
+ 'UI:ResetPwd-Error-NoContact' => 'ę¤č“¦ę·ę²”ęå
³čå°äøŖäŗŗ.',
+ 'UI:ResetPwd-Error-NoEmailAtt' => 'ę¤č“¦ę·ęŖå
³čé®ē®±å°å,请č系箔ēå.',
'UI:ResetPwd-Error-NoEmail' => 'ē¼ŗå°é®ē®±å°å. 请č系箔ēå.',
'UI:ResetPwd-Error-Send' => 'é®ä»¶åéååØęęÆåå . 请č系箔ēå.',
'UI:ResetPwd-EmailSent' => '请ę£ę„ęØēę¶ä»¶ē®±å¹¶ę ¹ę®ęå¼čæč”ęä½. å¦ęęØę²”ęę¶å°é®ä»¶, 请ę£ę„ęØē»å½ę¶ēč¾å
„ęÆå¦ååØé误.',
@@ -585,7 +587,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Login:Error:MultipleContactsHaveSameEmail' => 'å¤äøŖč系人ååØēøåēé®ē®±',
'UI:Login:Error:NoValidProfiles' => 'ę ęēčµę',
'UI:CSVImport:MappingSelectOne' => '-- 请éę© --',
- 'UI:CSVImport:MappingNotApplicable' => '-- åæ½ē„评ę --',
+ 'UI:CSVImport:MappingNotApplicable' => '-- åæ½ē„ę¤ę --',
'UI:CSVImport:NoData' => 'ę°ę®äøŗē©ŗ..., 请ęä¾ę°ę®!',
'UI:Title:DataPreview' => 'ę°ę®é¢č§',
'UI:CSVImport:ErrorOnlyOneColumn' => 'é误: ę°ę®ä»
å
å«äøå. ęØéę©äŗåéēåé符äŗå?',
@@ -594,7 +596,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:CSVImport:DataLine2' => 'ę°ę®č” 2',
'UI:CSVImport:idField' => 'id (äø»é®)',
'UI:Title:BulkImport' => ITOP_APPLICATION_SHORT.' - ę¹é导å
„',
- 'UI:Title:BulkImport+' => 'CSV 导å
„å导',
+ 'UI:Title:BulkImport+' => 'CSV导å
„å导',
'UI:Title:BulkSynchro_nbItem_ofClass_class' => 'åę„ %2$s 个对豔äøē %1$d',
'UI:CSVImport:ClassesSelectOne' => '-- 请éę© --',
'UI:CSVImport:ErrorExtendedAttCode' => 'å
éØé误: "%1$s" ęÆé误ēē¼ē , å äøŗ "%2$s" äøęÆē±» "%3$s" ēå¤é®',
@@ -634,7 +636,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:CSVImport:SelectClass' => 'éę©č¦åƼå
„ēē±»å«:',
'UI:CSVImport:AdvancedMode' => 'é«ēŗ§ęØ”å¼',
'UI:CSVImport:AdvancedMode+' => 'åØé«ēŗ§ęØ”å¼äø,对豔ē"id" (äø»é®) åÆä»„被ēØę„äæ®ę¹åéå½å对豔. äøē®”ęę ·,å "id" (å¦ęååØ) åŖč½č¢«ēØåäøäøŖęē“¢ę”ä»¶,äøč½äøå
¶å®ęē“¢ę”ä»¶ę··ēØ.',
- 'UI:CSVImport:SelectAClassFirst' => 'č¦é
ē½®ę å°ļ¼čÆ·å
éę©äøäøŖē±».',
+ 'UI:CSVImport:SelectAClassFirst' => 'č¦é
ē½®ę å°,请å
éę©äøäøŖē±».',
'UI:CSVImport:HeaderFields' => 'ę ē®',
'UI:CSVImport:HeaderMappings' => 'ę å°',
'UI:CSVImport:HeaderSearch' => 'ęē“¢?',
@@ -683,7 +685,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:CSVReport-Icon-Error' => 'é误',
'UI:CSVReport-Object-Error' => 'é误: %1$s',
'UI:CSVReport-Object-Ambiguous' => 'AMBIGUOUS: %1$s',
- 'UI:CSVReport-Stats-Errors' => '%1$.0f %% å·²å č½½ē对豔å
å«é误ļ¼å®ä»¬å°ä¼č¢«åæ½ē„.',
+ 'UI:CSVReport-Stats-Errors' => '%1$.0f %% å·²å č½½ē对豔å
å«é误,å®ä»¬å°ä¼č¢«åæ½ē„.',
'UI:CSVReport-Stats-Created' => '%1$.0f %% å·²å č½½ē对豔å°ä¼č¢«å建.',
'UI:CSVReport-Stats-Modified' => '%1$.0f %% å·²å č½½ē对豔å°ä¼č¢«äæ®ę¹.',
@@ -711,31 +713,31 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Audit:AuditCategory:Subtitle' => '%2$s äøŖäøę %1$s äøŖé误 - %3$s%%',
- 'UI:RunQuery:Title' => ITOP_APPLICATION_SHORT.' - OQL ę„询čÆä¼°',
+ 'UI:RunQuery:Title' => ITOP_APPLICATION_SHORT.' - OQLę„询čÆä¼°',
'UI:RunQuery:QueryExamples' => '示ä¾ę„询',
'UI:RunQuery:QueryResults' => 'ę„询ē»ę',
'UI:RunQuery:HeaderPurpose' => 'ē®ē',
- 'UI:RunQuery:HeaderPurpose+' => '评ę„询ēč§£é',
+ 'UI:RunQuery:HeaderPurpose+' => 'ę¤ę„询ēč§£é',
'UI:RunQuery:HeaderOQLExpression' => 'OQL 蔨达å¼',
'UI:RunQuery:HeaderOQLExpression+' => 'OQL čÆę³č”Øē¤ŗēę„询',
'UI:RunQuery:ExpressionToEvaluate' => '请č¾å
„蔨达å¼: ',
'UI:RunQuery:QueryArguments' => 'ę„询åę°',
- 'UI:RunQuery:MoreInfo' => '评ę„询ēę“å¤äæ”ęÆ: ',
+ 'UI:RunQuery:MoreInfo' => 'ę¤ę„询ēę“å¤äæ”ęÆ: ',
'UI:RunQuery:DevelopedQuery' => 'éę°å¼åēę„询蔨达å¼: ',
'UI:RunQuery:SerializedFilter' => 'åŗååēčæę»¤åØ: ',
'UI:RunQuery:DevelopedOQL' => 'ä¼åē OQL',
'UI:RunQuery:DevelopedOQLCount' => 'Developed OQL for count~~',
'UI:RunQuery:ResultSQLCount' => 'Resulting SQL for count~~',
'UI:RunQuery:ResultSQL' => 'Resulting SQL~~',
- 'UI:RunQuery:Error' => 'čæč”评ę„询ę¶åēäŗäøäøŖé误',
+ 'UI:RunQuery:Error' => 'čæč”ę¤ę„询ę¶åēäŗäøäøŖé误',
'UI:Query:UrlForExcel' => 'URL to use for MS-Excel web queries',
'UI:Query:UrlV1' => 'The list of fields has been left unspecified. The page export-V2.php cannot be invoked without this information. Therefore, the URL suggested here below points to the legacy page: export.php . This legacy version of the export has the following limitation: the list of exported fields may vary depending on the output format and the data model of '.ITOP_APPLICATION_SHORT.'. Should you want to garantee that the list of exported columns will remain stable on the long run, then you must specify a value for the attribute "Fields" and use the page export-V2.php .',
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' 对豔樔å',
'UI:Schema:TitleForClass' => '%1$s schema~~',
'UI:Schema:CategoryMenuItem' => 'ē±»å« %1$s ',
'UI:Schema:Relationships' => 'å
³č',
- 'UI:Schema:AbstractClass' => 'ę½č±”ē±»: 评类äøč½å®ä¾å对豔.',
- 'UI:Schema:NonAbstractClass' => 'éę½č±”ē±»: 评类åÆä»„å®ä¾å对豔.',
+ 'UI:Schema:AbstractClass' => 'ę½č±”ē±»: ę¤ē±»äøč½å®ä¾å对豔.',
+ 'UI:Schema:NonAbstractClass' => 'éę½č±”ē±»: ę¤ē±»åÆä»„å®ä¾å对豔.',
'UI:Schema:ClassHierarchyTitle' => 'ē±»å±ēŗ§',
'UI:Schema:AllClasses' => 'ęęē±»',
'UI:Schema:ExternalKey_To' => '%1$sēå¤é®',
@@ -752,20 +754,20 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Schema:Type+' => 'å±ę§ēę°ę®ē±»å',
'UI:Schema:Origin' => 'ę„čŖ',
- 'UI:Schema:Origin+' => '评å±ę§č¢«å®ä¹ēåŗē±»',
+ 'UI:Schema:Origin+' => 'ę¤å±ę§č¢«å®ä¹ēåŗē±»',
'UI:Schema:Description' => 'ęčæ°',
'UI:Schema:Description+' => 'å±ę§ēęčæ°',
'UI:Schema:AllowedValues' => 'å
许å¼',
- 'UI:Schema:AllowedValues+' => '评å±ę§åå¼ēéå¶',
+ 'UI:Schema:AllowedValues+' => 'ę¤å±ę§åå¼ēéå¶',
'UI:Schema:MoreInfo' => 'ę“å¤äæ”ęÆ',
- 'UI:Schema:MoreInfo+' => '评ę ē®åØę°ę®åŗäøč¢«å®ä¹ēę“å¤äæ”ęÆ',
+ 'UI:Schema:MoreInfo+' => 'ę¤ę ē®åØę°ę®åŗäøč¢«å®ä¹ēę“å¤äæ”ęÆ',
'UI:Schema:SearchCriteria' => 'ęē“¢ę”ä»¶',
'UI:Schema:FilterCode' => 'čæę»¤åØē¼ē ',
- 'UI:Schema:FilterCode+' => '评ęē“¢ę”ä»¶ēē¼ē ',
+ 'UI:Schema:FilterCode+' => 'ę¤ęē“¢ę”ä»¶ēē¼ē ',
'UI:Schema:FilterDescription' => 'ęčæ°',
- 'UI:Schema:FilterDescription+' => '评ęē“¢ę”ä»¶ēęčæ°',
+ 'UI:Schema:FilterDescription+' => 'ę¤ęē“¢ę”ä»¶ēęčæ°',
'UI:Schema:AvailOperators' => 'åÆēØēčæē®ē¬¦',
- 'UI:Schema:AvailOperators+' => '评ęē“¢ę”ä»¶åÆč½ēčæē®ē¬¦',
+ 'UI:Schema:AvailOperators+' => 'ę¤ęē“¢ę”ä»¶åÆč½ēčæē®ē¬¦',
'UI:Schema:ChildClasses' => 'åē±»',
'UI:Schema:ReferencingClasses' => 'ēøå
³ē±»',
'UI:Schema:RelatedClasses' => 'ēøå
³ē±»',
@@ -779,9 +781,9 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s 被类 %2$s åē
§, éčæę ē® %3$s',
'UI:Schema:Class_IsLinkedTo_Class_Via_ClassAndAttribute' => '%1$s 被é¾ę„å° %2$s éčæ %3$s::%4$s ',
'UI:Schema:Links:1-n' => 'ē±»ęå %1$s (1:n é¾ę„):',
- 'UI:Schema:Links:n-n' => 'ē±»é¾ę„å° %1$s (n:n é¾ę„):',
+ 'UI:Schema:Links:n-n' => 'ē±»å
³čå° %1$s (n:n é¾ę„):',
'UI:Schema:Links:All' => 'å
ØéØēøå
³ē±»ēå¾',
- 'UI:Schema:NoLifeCyle' => '评类沔ęēå½åØęēå®ä¹.',
+ 'UI:Schema:NoLifeCyle' => 'ę¤ē±»ę²”ęēå½åØęēå®ä¹.',
'UI:Schema:LifeCycleTransitions' => 'ē¶ęå转ę¢',
'UI:Schema:LifeCyleAttributeOptions' => 'å±ę§é锹',
'UI:Schema:LifeCycleHiddenAttribute' => 'éč',
@@ -804,7 +806,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Label:SelectedObjects' => '被éē对豔: ',
'UI:Label:AvailableObjects' => 'åÆēØē对豔: ',
'UI:Link_Class_Attributes' => '%1$s å±ę§',
- 'UI:SelectAllToggle+' => 'å
Øé / åé',
+ 'UI:SelectAllToggle+' => 'å
Øé/åé',
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'ę·»å %1$s 个对豔, é¾ę„ %2$s: %3$s',
'UI:AddObjectsOf_Class_LinkedWith_Class' => ' %1$s ',
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'ē®”ē %1$s 个对豔, é¾ę„ %2$s: %3$s',
@@ -815,13 +817,13 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Wizard:FinalStepTitle' => 'ęåäøę„: 甮认',
'UI:Title:DeletionOf_Object' => 'å é¤ %1$s',
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'ę¹éå é¤ %1$d äøŖ %2$s ē±»ē对豔',
- 'UI:Delete:NotAllowedToDelete' => 'ęØę ęå é¤čÆ„åÆ¹č±”',
+ 'UI:Delete:NotAllowedToDelete' => 'ęØę ęå é¤ę¤åÆ¹č±”',
'UI:Delete:NotAllowedToUpdate_Fields' => 'ęØę ęę“ę°ä»„äøę ē®: %1$s',
'UI:Error:ActionNotAllowed' => 'ęØę ęčæč”ęä½',
- 'UI:Error:NotEnoughRightsToDelete' => 'ę ę³å é¤čÆ„åÆ¹č±”, å äøŗå½åēØę·ę²”ęč¶³å¤ēęé',
- 'UI:Error:CannotDeleteBecause' => 'ę ę³å é¤čÆ„åÆ¹č±”ļ¼å äøŗ: %1$s',
- 'UI:Error:CannotDeleteBecauseOfDepencies' => 'ę ę³å é¤čÆ„åÆ¹č±”, å äøŗåæ
é”»äŗå
å®ęäøäŗęåØęä½',
- 'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'ę ę³å é¤čÆ„åÆ¹č±”ļ¼åæ
é”»äŗå
å®ęäøäŗęåØęä½',
+ 'UI:Error:NotEnoughRightsToDelete' => 'ę ę³å é¤ę¤åÆ¹č±”, å äøŗå½åēØę·ę²”ęč¶³å¤ēęé',
+ 'UI:Error:CannotDeleteBecause' => 'ę ę³å é¤ę¤åÆ¹č±”,å äøŗ: %1$s',
+ 'UI:Error:CannotDeleteBecauseOfDepencies' => 'ę ę³å é¤ę¤åÆ¹č±”, å äøŗåæ
é”»äŗå
å®ęäøäŗęåØęä½',
+ 'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'ę ę³å é¤ę¤åÆ¹č±”,åæ
é”»äŗå
å®ęäøäŗęåØęä½',
'UI:Archive_User_OnBehalfOf_User' => '%1$s on behalf of %2$s',
'UI:Delete:Deleted' => 'å·²å é¤',
'UI:Delete:AutomaticallyDeleted' => 'å·²čŖåØå é¤',
@@ -834,7 +836,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'å é¤ %2$s ē±»ē %1$d 个对豔',
'UI:Delete:CannotDeleteBecause' => 'ę ę³å é¤: %1$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'åŗčÆ„čŖåØå é¤, ä½ęØę ęčæę ·å',
- 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'åæ
é”»ęåØå é¤ - ä½ęØę ęå é¤čÆ„åÆ¹č±”, 请č系箔ēå',
+ 'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'åæ
é”»ęåØå é¤ - ä½ęØę ęå é¤ę¤åÆ¹č±”, 请č系箔ēå',
'UI:Delete:WillBeDeletedAutomatically' => 'å°č¢«čŖåØå é¤',
'UI:Delete:MustBeDeletedManually' => 'åæ
é”»ęåØå é¤',
'UI:Delete:CannotUpdateBecause_Issue' => 'åŗčÆ„č¢«čŖåØę“ę°, ä½ęÆ: %1$s',
@@ -843,14 +845,14 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d 个对豔/é¾ę„ å
³čäŗäøäŗå³å°č¦å é¤ē对豔',
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'äøŗäŗē”®äæę°ę®åŗēå®ę“ę§, ä»»ä½äøä¹å
³čē锹ē®ä¹ä¼č¢«å é¤',
'UI:Delete:Consequence+' => 'č¦åä»ä¹',
- 'UI:Delete:SorryDeletionNotAllowed' => 'ę±ę, ęØę ęå é¤čÆ„åÆ¹č±”, 请ēäøčæ°čƦē»č§£é',
- 'UI:Delete:PleaseDoTheManualOperations' => 'åØå é¤čÆ„åÆ¹č±”ä¹å, 请å
ęå·„å®ęäøčæ°ååŗēęä½',
+ 'UI:Delete:SorryDeletionNotAllowed' => 'ę±ę, ęØę ęå é¤ę¤åÆ¹č±”, 请ēäøčæ°čƦē»č§£é',
+ 'UI:Delete:PleaseDoTheManualOperations' => 'åØå é¤ę¤åÆ¹č±”ä¹å, 请å
ęå·„å®ęäøčæ°ååŗēęä½',
'UI:Delect:Confirm_Object' => '请甮认č¦å é¤ %1$s.',
'UI:Delect:Confirm_Count_ObjectsOf_Class' => '请甮认č¦å é¤äøå %2$s ē±»ē %1$d 个对豔.',
'UI:WelcomeToITop' => '欢čæä½æēØ '.ITOP_APPLICATION_SHORT,
'UI:DetailsPageTitle' => ITOP_APPLICATION_SHORT.' - %1$s - %2$s 详ē»å
容',
'UI:ErrorPageTitle' => ITOP_APPLICATION_SHORT.' - é误',
- 'UI:ObjectDoesNotExist' => 'ę±ę, 评对豔äøååØ (ęę ęęµč§čÆ„åÆ¹č±”).',
+ 'UI:ObjectDoesNotExist' => 'ę±ę, ę¤åÆ¹č±”äøååØ (ęę ęęµč§ę¤åÆ¹č±”).',
'UI:ObjectArchived' => '对豔已被å½ę”£. 请åÆēØå½ę”£ęØ”å¼ęč系箔ēå.',
'Tag:Archived' => 'å·²å½ę”£',
'Tag:Archived+' => 'ä»
č½åØå½ę”£ęØ”å¼äøč®æé®',
@@ -896,7 +898,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:UserManagement:ProjectedObject+' => '被ę å°ē对豔',
'UI:UserManagement:AnyObject' => '* ä»»ä½ *',
'UI:UserManagement:User' => 'ēØę·',
- 'UI:UserManagement:User+' => 'äøčÆ„ę å°ēøå
³ēēØę·',
+ 'UI:UserManagement:User+' => 'äøę¤ę å°ēøå
³ēēØę·',
'UI:UserManagement:Action:Read' => '读',
'UI:UserManagement:Action:Read+' => '读/ę¾ē¤ŗ 对豔',
'UI:UserManagement:Action:Modify' => 'äæ®ę¹',
@@ -906,13 +908,13 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:UserManagement:Action:BulkRead' => 'ę¹é读å(导åŗ)',
'UI:UserManagement:Action:BulkRead+' => 'ååŗåÆ¹č±”ęę¹é导åŗ',
'UI:UserManagement:Action:BulkModify' => 'ę¹éäæ®ę¹',
- 'UI:UserManagement:Action:BulkModify+' => 'ę¹éå建/ē¼č¾ (CSV 导å
„)',
+ 'UI:UserManagement:Action:BulkModify+' => 'ę¹éå建/ē¼č¾ (CSV导å
„)',
'UI:UserManagement:Action:BulkDelete' => 'ę¹éå é¤',
'UI:UserManagement:Action:BulkDelete+' => 'ę¹éå é¤åÆ¹č±”',
'UI:UserManagement:Action:Stimuli' => 'Stimuli',
'UI:UserManagement:Action:Stimuli+' => '许åÆē (å¤åē) ęä½',
'UI:UserManagement:Action' => 'ęä½',
- 'UI:UserManagement:Action+' => '评ēØę·čæč”ēęä½',
+ 'UI:UserManagement:Action+' => 'ę¤ēØę·čæč”ēęä½',
'UI:UserManagement:TitleActions' => 'ęä½',
'UI:UserManagement:Permission' => '许åÆ',
'UI:UserManagement:Permission+' => 'ēØę·ē许åÆ',
@@ -921,7 +923,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:UserManagement:ActionAllowed:No' => 'å¦',
'UI:UserManagement:AdminProfile+' => 'ē®”ēåę„ęę°ę®åŗäøęę对豔å®ę“ē读/å/访é®ęé.',
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
- 'UI:UserManagement:NoLifeCycleApplicable+' => '评类ęŖå®ä¹ēå½åØę',
+ 'UI:UserManagement:NoLifeCycleApplicable+' => 'ę¤ē±»ęŖå®ä¹ēå½åØę',
'UI:UserManagement:GrantMatrix' => 'ęęē©éµ',
'Menu:AdminTools' => 'ē®”ēå·„å
·',// Duplicated into itop-welcome-itil (will be removed from here...)
@@ -972,7 +974,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI-ContactsMenu-ContactsByType' => 'ęē±»å«ååč系人',
'UI-ContactsMenu-ContactsByStatus' => 'ęē¶ęååč系人',
- 'Menu:CSVImportMenu' => 'CSV 导å
„',// Duplicated into itop-welcome-itil (will be removed from here...)
+ 'Menu:CSVImportMenu' => 'CSV导å
„',// Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:CSVImportMenu+' => 'ę¹éå建ęäæ®ę¹',// Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:DataModelMenu' => 'ę°ę®ęØ”å',// Duplicated into itop-welcome-itil (will be removed from here...)
@@ -1057,7 +1059,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:OpenDocumentInNewWindow_' => 'ęå¼',
'UI:DownloadDocument_' => 'äøč½½',
- 'UI:Document:NoPreview' => '评类ę攣ę ę³é¢č§',
+ 'UI:Document:NoPreview' => 'ę¤ē±»ę攣ę ę³é¢č§',
'UI:Download-CSV' => 'äøč½½ %1$s',
'UI:DeadlineMissedBy_duration' => 'č¶
čæ %1$s',
@@ -1067,7 +1069,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Deadline_Days_Hours_Minutes' => '%1$dd %2$dh %3$dmin',
'UI:Help' => 'åø®å©',
'UI:PasswordConfirm' => '甮认',
- 'UI:BeforeAdding_Class_ObjectsSaveThisObject' => 'åØę·»å ę“å¤ %1$s ä¹å, äæå评对豔.',
+ 'UI:BeforeAdding_Class_ObjectsSaveThisObject' => 'åØę·»å ę“å¤ %1$s ä¹å, äæåę¤åÆ¹č±”.',
'UI:DisplayThisMessageAtStartup' => 'åØåÆåØę¶ę¾ē¤ŗę¤ę¶ęÆ',
'UI:RelationshipGraph' => 'å¾č§',
'UI:RelationshipList' => 'å蔨',
@@ -1082,7 +1084,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Relation:Zoom' => 'ę¾å¤§',
'UI:Relation:ExportAsAttachment' => '导åŗäøŗéä»¶...',
'UI:Relation:DrillDown' => '详ę
...',
- 'UI:Relation:PDFExportOptions' => 'PDF 导åŗé锹',
+ 'UI:Relation:PDFExportOptions' => 'PDF导åŗé锹',
'UI:Relation:AttachmentExportOptions_Name' => 'Options for Attachment to %1$s',
'UI:RelationOption:Untitled' => 'ę ę é¢',
'UI:Relation:Key' => 'Key',
@@ -1123,12 +1125,12 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'Portal:PleaseSelectAServiceSubCategory' => '请éę©åē±»',
'Portal:DescriptionOfTheRequest' => '请č¾å
„ęčæ°:',
'Portal:TitleRequestDetailsFor_Request' => 'éę±čƦę
%1$s:',
- 'Portal:NoOpenRequest' => '评类å«äøę²”ęęå¼ēéę±.',
- 'Portal:NoClosedRequest' => '评åē±»äøę²”ęéę±',
+ 'Portal:NoOpenRequest' => 'ę¤ē±»å«äøę²”ęęå¼ēéę±.',
+ 'Portal:NoClosedRequest' => 'ę¤åē±»äøę²”ęéę±',
'Portal:Button:ReopenTicket' => 'éę°ęå¼čæäøŖå·„å',
'Portal:Button:CloseTicket' => 'å
³éčæäøŖå·„å',
'Portal:Button:UpdateRequest' => 'ę“ę°éę±',
- 'Portal:EnterYourCommentsOnTicket' => '请ē¹čÆčƄ巄åēč§£å³ę¹ę”:',
+ 'Portal:EnterYourCommentsOnTicket' => '请ē¹čÆę¤å·„åēč§£å³ę¹ę”:',
'Portal:ErrorNoContactForThisUser' => 'é误: å½åēØę·ę²”ęäøä»»ä½č系人å
³č. 请č系箔ēå.',
'Portal:Attachments' => 'éä»¶',
'Portal:AddAttachment' => ' ę·»å éä»¶ ',
@@ -1161,7 +1163,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:CaseLogTypeYourTextHere' => '请åØčæéč¾å
„å
容...',
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
'UI:CaseLog:InitialValue' => 'åå§å¼:',
- 'UI:AttemptingToSetASlaveAttribute_Name' => 'åꮵ %1$s äøåÆåļ¼å äøŗå®ē±ę°ę®åę„ē®”ē. å¼ęŖč®¾ē½®.',
+ 'UI:AttemptingToSetASlaveAttribute_Name' => 'åꮵ %1$s äøåÆå,å äøŗå®ē±ę°ę®åę„ē®”ē. å¼ęŖč®¾ē½®.',
'UI:ActionNotAllowed' => 'ęØę ęęä½čæäŗåÆ¹č±”.',
'UI:BulkAction:NoObjectSelected' => '请č³å°éę©äøäøŖåÆ¹č±”čæč”ęä½',
'UI:AttemptingToChangeASlaveAttribute_Name' => 'The field %1$s is not writable because it is mastered by the data synchronization. Value remains unchanged.',
@@ -1177,7 +1179,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:ArchiveMode:Banner' => 'å½ę”£ęØ”å¼',
'UI:ArchiveMode:Banner+' => 'å·²å½ę”£ē对豔åÆč§ä½äøå
许修ę¹',
'UI:FavoriteOrganizations' => 'åæ«é访é®',
- 'UI:FavoriteOrganizations+' => 'čæå
„ē»ē»äøēå蔨ļ¼åÆå®ē°éčæäøęčååæ«é访é®. 请注ęļ¼čæå¹¶äøęÆäøäøŖå®å
Øč®¾ē½®, å
¶ä»ē»ē»ē对豔ä¾ē¶åÆä»„éčæéę© "ęęē»ē»" äøęå蔨ēå°.',
+ 'UI:FavoriteOrganizations+' => 'čæå
„ē»ē»äøēå蔨,åÆå®ē°éčæäøęčååæ«é访é®. 请注ę,čæå¹¶äøęÆäøäøŖå®å
Øč®¾ē½®, å
¶ä»ē»ē»ē对豔ä¾ē¶åÆä»„éčæéę© "ęęē»ē»" äøęå蔨ēå°.',
'UI:FavoriteLanguage' => 'čÆčØ',
'UI:Favorites:SelectYourLanguage' => 'éę©čÆčØ',
'UI:FavoriteOtherSettings' => 'å
¶ä»č®¾ē½®',
@@ -1384,7 +1386,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Menu:ShortcutList' => 'å建快ę·ę¹å¼...',
'UI:ShortcutRenameDlg:Title' => 'éå½ååæ«ę·ę¹å¼',
- 'UI:ShortcutListDlg:Title' => '为评å蔨å建快ę·ę¹å¼',
+ 'UI:ShortcutListDlg:Title' => 'äøŗę¤å蔨å建快ę·ę¹å¼',
'UI:ShortcutDelete:Confirm' => '请甮认ęÆå¦å é¤čæäøŖ(äŗ)åæ«ę·ę¹å¼.',
'Menu:MyShortcuts' => 'ęēåæ«ę·ę¹å¼',// Duplicated into itop-welcome-itil (will be removed from here...)
'Class:Shortcut' => 'åæ«ę·ę¹å¼',
@@ -1446,17 +1448,17 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:About:Extension_Version' => 'ēę¬: %1$s',
'UI:About:RemoteExtensionSource' => 'ę°ę®',
- 'UI:DisconnectedDlgMessage' => 'ęØå·²ęå¼. č¦ē»§ē»ä½æēØļ¼éč¦éę°éŖčÆęØēēØę·åååÆē .',
+ 'UI:DisconnectedDlgMessage' => 'ęØå·²ęå¼. č¦ē»§ē»ä½æēØ,éč¦éę°éŖčÆęØēēØę·åååÆē .',
'UI:DisconnectedDlgTitle' => 'č¦å!',
'UI:LoginAgain' => 'åꬔē»å½',
'UI:StayOnThePage' => 'äæęåØå½å锵é¢',
- 'ExcelExporter:ExportMenu' => 'Excel 导åŗ...',
- 'ExcelExporter:ExportDialogTitle' => 'Excel 导åŗ',
+ 'ExcelExporter:ExportMenu' => 'Excel导åŗ...',
+ 'ExcelExporter:ExportDialogTitle' => 'Excel导åŗ',
'ExcelExporter:ExportButton' => '导åŗ',
'ExcelExporter:DownloadButton' => 'äøč½½ %1$s',
'ExcelExporter:RetrievingData' => 'ę£åØę£ē“¢ę°ę®...',
- 'ExcelExporter:BuildingExcelFile' => 'ę£åØå建Excel ęä»¶...',
+ 'ExcelExporter:BuildingExcelFile' => 'ę£åØå建Excelęä»¶...',
'ExcelExporter:Done' => 'å®ę.',
'ExcelExport:AutoDownload' => '导åŗåå¤å„½ä¹åčŖåØå¼å§äøč½½',
'ExcelExport:PreparingExport' => 'ę£åØåå¤åƼåŗ...',
@@ -1465,7 +1467,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'portal:backoffice' => ITOP_APPLICATION_SHORT.' åå°ēØę·ēé¢',
'UI:CurrentObjectIsLockedBy_User' => '对豔被éä½,å äøŗę£åØäæ®ę¹ %1$s.',
- 'UI:CurrentObjectIsLockedBy_User_Explanation' => '评对豔ę£åØč¢« %1$s äæ®ę¹. ęØēäæ®ę¹ę ę³ęäŗ¤å äøŗå®ä»¬ä¼å²ēŖ.',
+ 'UI:CurrentObjectIsLockedBy_User_Explanation' => 'ę¤åÆ¹č±”ę£åØč¢« %1$s äæ®ę¹. ęØēäæ®ę¹ę ę³ęäŗ¤å äøŗå®ä»¬ä¼å²ēŖ.',
'UI:CurrentObjectIsSoftLockedBy_User' => 'The object is currently being modified by %1$s. You\'ll be able to submit your modifications once they have finished.~~',
'UI:CurrentObjectLockExpired' => 'å¹¶åäæ®ę¹ēéå®ęå·²čæ.',
'UI:CurrentObjectLockExpired_Explanation' => 'The lock to prevent concurrent modifications of the object has expired. You can no longer submit your modification since other users are now allowed to modify this object.',
@@ -1479,9 +1481,9 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:UploadInlineImageLegend' => 'äøä¼ ę°å¾ē',
'UI:SelectInlineImageToUpload' => 'éę©č¦äøä¼ ēå¾ē',
'UI:AvailableInlineImagesLegend' => 'åÆēØēå¾ē',
- 'UI:NoInlineImage' => 'ęå”åØäøę²”ęå¾ē. 使ēØäøé¢ē "ęµč§" ęé®ļ¼ä»ęØēēµčäøéę©å¹¶äøä¼ å°ęå”åØ.',
+ 'UI:NoInlineImage' => 'ęå”åØäøę²”ęå¾ē. 使ēØäøé¢ē "ęµč§" ęé®,ä»ęØēēµčäøéę©å¹¶äøä¼ å°ęå”åØ.',
- 'UI:ToggleFullScreen' => 'åę¢ ę大å / ęå°å',
+ 'UI:ToggleFullScreen' => 'åę¢ ę大å/ęå°å',
'UI:Button:ResetImage' => 'ę¢å¤ä¹åēå¾ē',
'UI:Button:RemoveImage' => 'ē§»é¤å¾ē',
'UI:Button:UploadImage' => 'ä»ē”¬ēäøä¼ å¾å',
@@ -1490,10 +1492,10 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Button:RemoveDocument' => 'ē§»é¤ę攣',
// Search form
- 'UI:Search:Toggle' => 'ęå / å±å¼',
- 'UI:Search:AutoSubmit:DisabledHint' => '评类å«å·²ē¦ēØčŖåØęäŗ¤',
+ 'UI:Search:Toggle' => 'ęå /å±å¼',
+ 'UI:Search:AutoSubmit:DisabledHint' => 'ę¤ē±»å«å·²ē¦ēØčŖåØęäŗ¤',
'UI:Search:Obsolescence:DisabledHint' => 'ę ¹ę®ęØē设置, åŗå¼ēę°ę®ä¼č¢«éč',
- 'UI:Search:NoAutoSubmit:ExplainText' => 'åØęē“¢ę”äøę·»å č§åļ¼ęč
åå»åÆ¹č±”ęé®ę„ē对豔.',
+ 'UI:Search:NoAutoSubmit:ExplainText' => 'åØęē“¢ę”äøę·»å č§å,ęč
åå»åÆ¹č±”ęé®ę„ē对豔.',
'UI:Search:Criterion:MoreMenu:AddCriteria' => 'ę·»å ę”ä»¶',
// - Add new criteria button
'UI:Search:AddCriteria:List:RecentlyUsed:Title' => 'ęčæä½æēØ',
@@ -1502,7 +1504,7 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Search:AddCriteria:List:RecentlyUsed:Placeholder' => 'čæę²”ę.',
// - Criteria header actions
- 'UI:Search:Criteria:Toggle' => 'ęå / å±å¼',
+ 'UI:Search:Criteria:Toggle' => 'ęå /å±å¼',
'UI:Search:Criteria:Remove' => 'ē§»é¤',
'UI:Search:Criteria:Locked' => 'å·²éå®',
@@ -1568,9 +1570,9 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
// - Numeric widget
'UI:Search:Criteria:Operator:Numeric:Equals' => 'ēäŗ',// => '=',
'UI:Search:Criteria:Operator:Numeric:GreaterThan' => '大äŗ',// => '>',
- 'UI:Search:Criteria:Operator:Numeric:GreaterThanOrEquals' => 'å¤§äŗ / ēäŗ',// > '>=',
+ 'UI:Search:Criteria:Operator:Numeric:GreaterThanOrEquals' => '大äŗ/ēäŗ',// > '>=',
'UI:Search:Criteria:Operator:Numeric:LessThan' => 'å°äŗ',// => '<',
- 'UI:Search:Criteria:Operator:Numeric:LessThanOrEquals' => 'å°äŗ / ēäŗ',// > '<=',
+ 'UI:Search:Criteria:Operator:Numeric:LessThanOrEquals' => 'å°äŗ/ēäŗ',// > '<=',
'UI:Search:Criteria:Operator:Numeric:Different' => 'äøå',// => 'ā ',
// - Tag Set Widget
'UI:Search:Criteria:Operator:TagSet:Matches' => 'å¹é
',
@@ -1581,8 +1583,8 @@ We hope youāll enjoy this version as much as we enjoyed imagining and creating
'UI:Search:Value:Autocomplete:StartTyping' => 'å¼å§č¾å
„å¼.',
'UI:Search:Value:Autocomplete:Wait' => '请ēØå...',
'UI:Search:Value:Autocomplete:NoResult' => 'ę²”ęę¾å°ē»ę.',
- 'UI:Search:Value:Toggler:CheckAllNone' => 'å
Øé / äøé',
- 'UI:Search:Value:Toggler:CheckAllNoneFiltered' => 'å
Øé / äøé',
+ 'UI:Search:Value:Toggler:CheckAllNone' => 'å
Øé/äøé',
+ 'UI:Search:Value:Toggler:CheckAllNoneFiltered' => 'å
Øé/äøé',
// - Widget other translations
'UI:Search:Criteria:Numeric:From' => 'ä»',
@@ -1681,22 +1683,6 @@ Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'Menu:ConfigurationTools' => 'é
ē½®',
));
-// OAuth
-Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
- 'Menu:OAuthWizardMenu' => 'OAuth 2.0~~',
- 'core/Operation:Wizard/Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Page:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Panel:Title' => 'OAuth 2.0 Configuration~~',
- 'UI:OAuth:Wizard:Form:Input:ClientId:Label' => 'Client Id~~',
- 'UI:OAuth:Wizard:Form:Input:ClientSecret:Label' => 'Client Secret~~',
- 'UI:OAuth:Wizard:Form:Input:Scope:Label' => 'Scope~~',
- 'UI:OAuth:Wizard:Form:Input:Additional:Label' => 'Additional parameters~~',
- 'UI:OAuth:Wizard:Form:Input:RedirectUri:Label' => 'Redirect Uri~~',
- 'UI:OAuth:Wizard:Form:Button:Submit:Label' => 'Authentication~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Title' => 'Configuration for SMTP~~',
- 'UI:OAuth:Wizard:ResultConf:Panel:Description' => 'Paste this content into your configuration file to use this OAuth connection for your outgoing emails~~',
-));
-
// Additional language entries not present in English dict
Dict::Add('ZH CN', 'Chinese', 'ē®ä½äøę', array(
'UI:Toggle:StandardDashboard' => 'ę å',
diff --git a/js/wizardhelper.js b/js/wizardhelper.js
index c31f8ea87..26933c3c0 100644
--- a/js/wizardhelper.js
+++ b/js/wizardhelper.js
@@ -176,6 +176,9 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
var sString = "$('#"+aRefreshed[i]+"').trigger('change').trigger('update');";
window.setTimeout(sString, 1); // Synchronous 'trigger' does nothing, call it asynchronously
}
+ if($('.blockUI').length == 0) {
+ $('.disabledDuringFieldLoading').prop("disabled", false).removeClass('disabledDuringFieldLoading');
+ }
};
this.UpdateWizard = function () {
@@ -201,6 +204,10 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
function (html) {
$('#ajax_content').html(html);
$('.blockUI').parent().unblock();
+
+ if($('.blockUI').length == 0) {
+ $('.disabledDuringFieldLoading').prop("disabled", false).removeClass('disabledDuringFieldLoading');
+ }
}
);
};
@@ -235,6 +242,7 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
this.ResetQuery();
this.UpdateWizard();
+ var fieldForm=null;
while (index < aFieldNames.length)
{
sAttCode = aFieldNames[index];
@@ -247,11 +255,16 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) {
message: '',
overlayCSS: {backgroundColor: '#f1f1f1', opacity: 0.3}
});
+ fieldForm=$('#field_' + sFieldId).closest('form');
this.RequestAllowedValues(sAttCode);
}
index++;
}
+ if($('.blockUI').length > 0) {
+ fieldForm.find('button[type=submit]:not(:disabled)').prop("disabled", true).addClass('disabledDuringFieldLoading');
+ }
+
if (nbOfFieldsToUpdate > 0)
{
this.AjaxQueryServer();
diff --git a/lib/autoload.php b/lib/autoload.php
index 460e67535..f1eeef5ab 100644
--- a/lib/autoload.php
+++ b/lib/autoload.php
@@ -2,6 +2,11 @@
// autoload.php @generated by Composer
+if (PHP_VERSION_ID < 50600) {
+ echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
+ exit(1);
+}
+
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f::getLoader();
diff --git a/lib/bin/patch-type-declarations b/lib/bin/patch-type-declarations
new file mode 100644
index 000000000..1b0b28230
--- /dev/null
+++ b/lib/bin/patch-type-declarations
@@ -0,0 +1,97 @@
+#!/usr/bin/env php
+handle = fopen($opened_path, $mode);
+ $this->position = 0;
+
+ // remove all traces of this stream wrapper once it has been used
+ stream_wrapper_unregister('composer-bin-proxy');
+
+ 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_tell()
+ {
+ return $this->position;
+ }
+
+ public function stream_eof()
+ {
+ return feof($this->handle);
+ }
+
+ public function stream_stat()
+ {
+ return fstat($this->handle);
+ }
+
+ public function stream_set_option($option, $arg1, $arg2)
+ {
+ return true;
+ }
+ }
+ }
+
+ if (function_exists('stream_wrapper_register') && stream_wrapper_register('composer-bin-proxy', 'Composer\BinProxyWrapper')) {
+ include("composer-bin-proxy://" . $binPath);
+ exit(0);
+ }
+}
+
+include $binPath;
diff --git a/lib/bin/patch-type-declarations.bat b/lib/bin/patch-type-declarations.bat
new file mode 100644
index 000000000..b92a2da31
--- /dev/null
+++ b/lib/bin/patch-type-declarations.bat
@@ -0,0 +1,4 @@
+@ECHO OFF
+setlocal DISABLEDELAYEDEXPANSION
+SET BIN_TARGET=%~dp0/../symfony/error-handler/Resources/bin/patch-type-declarations
+php "%BIN_TARGET%" %*
diff --git a/lib/bin/pscss b/lib/bin/pscss
index f563d0cae..9743992aa 100644
--- a/lib/bin/pscss
+++ b/lib/bin/pscss
@@ -108,7 +108,10 @@ if (PHP_VERSION_ID < 80000) {
}
}
- if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
+ if (
+ (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+ || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+ ) {
include("phpvfscomposer://" . __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss');
exit(0);
}
diff --git a/lib/bin/var-dump-server b/lib/bin/var-dump-server
new file mode 100644
index 000000000..10567b2c7
--- /dev/null
+++ b/lib/bin/var-dump-server
@@ -0,0 +1,97 @@
+#!/usr/bin/env php
+handle = fopen($opened_path, $mode);
+ $this->position = 0;
+
+ // remove all traces of this stream wrapper once it has been used
+ stream_wrapper_unregister('composer-bin-proxy');
+
+ 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_tell()
+ {
+ return $this->position;
+ }
+
+ public function stream_eof()
+ {
+ return feof($this->handle);
+ }
+
+ public function stream_stat()
+ {
+ return fstat($this->handle);
+ }
+
+ public function stream_set_option($option, $arg1, $arg2)
+ {
+ return true;
+ }
+ }
+ }
+
+ if (function_exists('stream_wrapper_register') && stream_wrapper_register('composer-bin-proxy', 'Composer\BinProxyWrapper')) {
+ include("composer-bin-proxy://" . $binPath);
+ exit(0);
+ }
+}
+
+include $binPath;
diff --git a/lib/bin/var-dump-server.bat b/lib/bin/var-dump-server.bat
new file mode 100644
index 000000000..46836b50c
--- /dev/null
+++ b/lib/bin/var-dump-server.bat
@@ -0,0 +1,4 @@
+@ECHO OFF
+setlocal DISABLEDELAYEDEXPANSION
+SET BIN_TARGET=%~dp0/../symfony/var-dumper/Resources/bin/var-dump-server
+php "%BIN_TARGET%" %*
diff --git a/lib/bin/yaml-lint b/lib/bin/yaml-lint
new file mode 100644
index 000000000..182c83f09
--- /dev/null
+++ b/lib/bin/yaml-lint
@@ -0,0 +1,97 @@
+#!/usr/bin/env php
+handle = fopen($opened_path, $mode);
+ $this->position = 0;
+
+ // remove all traces of this stream wrapper once it has been used
+ stream_wrapper_unregister('composer-bin-proxy');
+
+ 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_tell()
+ {
+ return $this->position;
+ }
+
+ public function stream_eof()
+ {
+ return feof($this->handle);
+ }
+
+ public function stream_stat()
+ {
+ return fstat($this->handle);
+ }
+
+ public function stream_set_option($option, $arg1, $arg2)
+ {
+ return true;
+ }
+ }
+ }
+
+ if (function_exists('stream_wrapper_register') && stream_wrapper_register('composer-bin-proxy', 'Composer\BinProxyWrapper')) {
+ include("composer-bin-proxy://" . $binPath);
+ exit(0);
+ }
+}
+
+include $binPath;
diff --git a/lib/bin/yaml-lint.bat b/lib/bin/yaml-lint.bat
new file mode 100644
index 000000000..0474134c6
--- /dev/null
+++ b/lib/bin/yaml-lint.bat
@@ -0,0 +1,4 @@
+@ECHO OFF
+setlocal DISABLEDELAYEDEXPANSION
+SET BIN_TARGET=%~dp0/../symfony/yaml/Resources/bin/yaml-lint
+php "%BIN_TARGET%" %*
diff --git a/lib/composer/ClassLoader.php b/lib/composer/ClassLoader.php
index 0cd6055d1..afef3fa2a 100644
--- a/lib/composer/ClassLoader.php
+++ b/lib/composer/ClassLoader.php
@@ -149,7 +149,7 @@ class ClassLoader
/**
* @return string[] Array of classname => path
- * @psalm-var array
+ * @psalm-return array
*/
public function getClassMap()
{
diff --git a/lib/composer/InstalledVersions.php b/lib/composer/InstalledVersions.php
index 7c5502ca4..e7552a4a9 100644
--- a/lib/composer/InstalledVersions.php
+++ b/lib/composer/InstalledVersions.php
@@ -21,6 +21,8 @@ use Composer\Semver\VersionParser;
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0`
+ *
+ * @final
*/
class InstalledVersions
{
diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php
index 6ff389297..663a96ce8 100644
--- a/lib/composer/autoload_classmap.php
+++ b/lib/composer/autoload_classmap.php
@@ -2,7 +2,7 @@
// autoload_classmap.php @generated by Composer
-$vendorDir = dirname(dirname(__FILE__));
+$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
@@ -18,7 +18,7 @@ return array(
'ActionChecker' => $baseDir . '/core/userrights.class.inc.php',
'ActionEmail' => $baseDir . '/core/action.class.inc.php',
'ActionNotification' => $baseDir . '/core/action.class.inc.php',
- 'AjaxPage' => $baseDir . '/sources/application/WebPage/AjaxPage.php',
+ 'AjaxPage' => $baseDir . '/sources/Application/WebPage/AjaxPage.php',
'ApcService' => $baseDir . '/core/apc-service.class.inc.php',
'ApplicationContext' => $baseDir . '/application/applicationcontext.class.inc.php',
'ApplicationException' => $baseDir . '/application/exceptions/ApplicationException.php',
@@ -26,10 +26,9 @@ return array(
'ApplicationPopupMenuItem' => $baseDir . '/application/applicationextension.inc.php',
'Archive_Tar' => $vendorDir . '/pear/archive_tar/Archive/Tar.php',
'ArchivedObjectException' => $baseDir . '/application/exceptions/ArchivedObjectException.php',
- 'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
- 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
'AsyncSendEmail' => $baseDir . '/core/asynctask.class.inc.php',
'AsyncTask' => $baseDir . '/core/asynctask.class.inc.php',
+ 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
'AttributeApplicationLanguage' => $baseDir . '/core/attributedef.class.inc.php',
'AttributeArchiveDate' => $baseDir . '/core/attributedef.class.inc.php',
'AttributeArchiveFlag' => $baseDir . '/core/attributedef.class.inc.php',
@@ -100,8 +99,8 @@ return array(
'BulkExportMissingParameterException' => $baseDir . '/core/bulkexport.class.inc.php',
'BulkExportResult' => $baseDir . '/core/bulkexport.class.inc.php',
'BulkExportResultGC' => $baseDir . '/core/bulkexport.class.inc.php',
- 'CLILikeWebPage' => $baseDir . '/sources/application/WebPage/CLILikeWebPage.php',
- 'CLIPage' => $baseDir . '/sources/application/WebPage/CLIPage.php',
+ 'CLILikeWebPage' => $baseDir . '/sources/Application/WebPage/CLILikeWebPage.php',
+ 'CLIPage' => $baseDir . '/sources/Application/WebPage/CLIPage.php',
'CMDBChange' => $baseDir . '/core/cmdbchange.class.inc.php',
'CMDBChangeOp' => $baseDir . '/core/cmdbchangeop.class.inc.php',
'CMDBChangeOpCreate' => $baseDir . '/core/cmdbchangeop.class.inc.php',
@@ -126,10 +125,10 @@ return array(
'CMDBObjectSet' => $baseDir . '/core/cmdbobject.class.inc.php',
'CMDBSource' => $baseDir . '/core/cmdbsource.class.inc.php',
'CSVBulkExport' => $baseDir . '/core/csvbulkexport.class.inc.php',
- 'CSVPage' => $baseDir . '/sources/application/WebPage/CSVPage.php',
+ 'CSVPage' => $baseDir . '/sources/Application/WebPage/CSVPage.php',
'CSVParser' => $baseDir . '/core/csvparser.class.inc.php',
'CSVParserException' => $baseDir . '/application/exceptions/CSVParserException.php',
- 'CaptureWebPage' => $baseDir . '/sources/application/WebPage/CaptureWebPage.php',
+ 'CaptureWebPage' => $baseDir . '/sources/Application/WebPage/CaptureWebPage.php',
'CellChangeSpec' => $baseDir . '/core/bulkchange.class.inc.php',
'CellStatus_Ambiguous' => $baseDir . '/core/bulkchange.class.inc.php',
'CellStatus_Issue' => $baseDir . '/core/bulkchange.class.inc.php',
@@ -141,175 +140,171 @@ return array(
'CharConcatWSExpression' => $baseDir . '/core/oql/expression.class.inc.php',
'CheckStopWatchThresholds' => $baseDir . '/core/ormstopwatch.class.inc.php',
'CheckableExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
- 'Combodo\\iTop\\Application\\Branding' => $baseDir . '/sources/application/Branding.php',
- 'Combodo\\iTop\\Application\\Helper\\Session' => $baseDir . '/sources/application/Helper/Session.php',
- 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => $baseDir . '/sources/application/Helper/WebResourcesHelper.php',
- 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => $baseDir . '/sources/application/search/ajaxsearchexception.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => $baseDir . '/sources/application/search/criterionconversionabstract.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => $baseDir . '/sources/application/search/criterionconversion/criteriontooql.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToSearchForm' => $baseDir . '/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionParser' => $baseDir . '/sources/application/search/criterionparser.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\SearchForm' => $baseDir . '/sources/application/search/searchform.class.inc.php',
- 'Combodo\\iTop\\Application\\Status\\Status' => $baseDir . '/sources/application/status/Status.php',
- 'Combodo\\iTop\\Application\\TwigBase\\Controller\\Controller' => $baseDir . '/sources/application/TwigBase/Controller/Controller.php',
+ 'Combodo\\iTop\\Application\\Branding' => $baseDir . '/sources/Application/Branding.php',
+ 'Combodo\\iTop\\Application\\Helper\\Session' => $baseDir . '/sources/Application/Helper/Session.php',
+ 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => $baseDir . '/sources/Application/Helper/WebResourcesHelper.php',
+ 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => $baseDir . '/sources/Application/Search/ajaxsearchexception.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => $baseDir . '/sources/Application/Search/criterionconversionabstract.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => $baseDir . '/sources/Application/Search/CriterionConversion/criteriontooql.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToSearchForm' => $baseDir . '/sources/Application/Search/CriterionConversion/criteriontosearchform.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionParser' => $baseDir . '/sources/Application/Search/criterionparser.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\SearchForm' => $baseDir . '/sources/Application/Search/searchform.class.inc.php',
+ 'Combodo\\iTop\\Application\\Status\\Status' => $baseDir . '/sources/Application/Status/Status.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\Controller\\Controller' => $baseDir . '/sources/Application/TwigBase/Controller/Controller.php',
'Combodo\\iTop\\Application\\TwigBase\\Controller\\PageNotFoundException' => $baseDir . '/application/exceptions/PageNotFoundException.php',
- 'Combodo\\iTop\\Application\\TwigBase\\Twig\\Extension' => $baseDir . '/sources/application/TwigBase/Twig/Extension.php',
- 'Combodo\\iTop\\Application\\TwigBase\\Twig\\TwigHelper' => $baseDir . '/sources/application/TwigBase/Twig/TwigHelper.php',
- 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockExtension' => $baseDir . '/sources/application/TwigBase/UI/UIBlockExtension.php',
- 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockNode' => $baseDir . '/sources/application/TwigBase/UI/UIBlockNode.php',
- 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockParser' => $baseDir . '/sources/application/TwigBase/UI/UIBlockParser.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\AbstractUIBlockFactory' => $baseDir . '/sources/application/UI/Base/AbstractUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\Alert' => $baseDir . '/sources/application/UI/Base/Component/Alert/Alert.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\AlertUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Alert/AlertUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Breadcrumbs\\Breadcrumbs' => $baseDir . '/sources/application/UI/Base/Component/Breadcrumbs/Breadcrumbs.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroup' => $baseDir . '/sources/application/UI/Base/Component/ButtonGroup/ButtonGroup.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroupUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/ButtonGroup/ButtonGroupUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\Button' => $baseDir . '/sources/application/UI/Base/Component/Button/Button.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonJS' => $baseDir . '/sources/application/UI/Base/Component/Button/ButtonJS.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Button/ButtonUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonURL' => $baseDir . '/sources/application/UI/Base/Component/Button/ButtonURL.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSection' => $baseDir . '/sources/application/UI/Base/Component/CollapsibleSection/CollapsibleSection.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSectionUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/CollapsibleSection/CollapsibleSectionUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletBadge' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletBadge.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletContainer' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletContainer.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletFactory' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletHeaderStatic' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletHeaderStatic.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletPlainText' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletPlainText.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTable' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTable.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableSettings' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTableSettings.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTableUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTableRow\\FormTableRow' => $baseDir . '/sources/application/UI/Base/Component/DataTable/StaticTable/FormTableRow/FormTableRow.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTable\\FormTable' => $baseDir . '/sources/application/UI/Base/Component/DataTable/StaticTable/FormTable/FormTable.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\StaticTable' => $baseDir . '/sources/application/UI/Base/Component/DataTable/StaticTable/StaticTable.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadge' => $baseDir . '/sources/application/UI/Base/Component/FieldBadge/FieldBadge.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadgeUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/FieldBadge/FieldBadgeUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSet' => $baseDir . '/sources/application/UI/Base/Component/FieldSet/FieldSet.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSetUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/FieldSet/FieldSetUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\Field' => $baseDir . '/sources/application/UI/Base/Component/Field/Field.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\FieldUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\Form' => $baseDir . '/sources/application/UI/Base/Component/Form/Form.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\FormUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Form/FormUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearch' => $baseDir . '/sources/application/UI/Base/Component/GlobalSearch/GlobalSearch.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchFactory' => $baseDir . '/sources/application/UI/Base/Component/GlobalSearch/GlobalSearchFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchHelper' => $baseDir . '/sources/application/UI/Base/Component/GlobalSearch/GlobalSearchHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\Html' => $baseDir . '/sources/application/UI/Base/Component/Html/Html.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\HtmlFactory' => $baseDir . '/sources/application/UI/Base/Component/Html/HtmlFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\AbstractInput' => $baseDir . '/sources/application/UI/Base/Component/Input/AbstractInput.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelect' => $baseDir . '/sources/application/UI/Base/Component/Input/FileSelect/FileSelect.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelectUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Input/FileSelect/FileSelectUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Input' => $baseDir . '/sources/application/UI/Base/Component/Input/Input.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Input/InputUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputWithLabel' => $baseDir . '/sources/application/UI/Base/Component/Input/InputWithLabel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\RichText\\RichText' => $baseDir . '/sources/application/UI/Base/Component/Input/RichText/RichText.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\SelectUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Input/Select/SelectUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\Select' => $baseDir . '/sources/application/UI/Base/Component/Input/Select/Select.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOption' => $baseDir . '/sources/application/UI/Base/Component/Input/Select/SelectOption.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOptionUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Input/Select/SelectOptionUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\TextArea' => $baseDir . '/sources/application/UI/Base/Component/Input/TextArea.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\tInputLabel' => $baseDir . '/sources/application/UI/Base/Component/Input/tInputLabel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\MedallionIcon\\MedallionIcon' => $baseDir . '/sources/application/UI/Base/Component/MedallionIcon/MedallionIcon.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\Panel' => $baseDir . '/sources/application/UI/Base/Component/Panel/Panel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\PanelUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Panel/PanelUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\Pill' => $baseDir . '/sources/application/UI/Base/Component/Pill/Pill.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\PillFactory' => $baseDir . '/sources/application/UI/Base/Component/Pill/PillFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenu' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenu.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenuFactory' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenu' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenu.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuFactory' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\JsPopoverMenuItem' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/JsPopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItem' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItemFactory' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItemFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\SeparatorPopoverMenuItem' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/SeparatorPopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\UrlPopoverMenuItem' => $baseDir . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/UrlPopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreate' => $baseDir . '/sources/application/UI/Base/Component/QuickCreate/QuickCreate.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateFactory' => $baseDir . '/sources/application/UI/Base/Component/QuickCreate/QuickCreateFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateHelper' => $baseDir . '/sources/application/UI/Base/Component/QuickCreate/QuickCreateHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\Spinner' => $baseDir . '/sources/application/UI/Base/Component/Spinner/Spinner.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\SpinnerUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Spinner/SpinnerUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Text\\Text' => $baseDir . '/sources/application/UI/Base/Component/Text/Text.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\Title' => $baseDir . '/sources/application/UI/Base/Component/Title/Title.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\TitleUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\AbstractSeparator' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/Separator/AbstractSeparator.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\ToolbarSeparatorUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/Separator/ToolbarSeparatorUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\VerticalSeparator' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/Separator/VerticalSeparator.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Toolbar' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/Toolbar.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacer' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacer.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacerUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacerUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/ToolbarUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntry' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntryFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntryFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentAddedFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentAddedFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentRemovedFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentRemovedFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpCreateFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpCreateFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpDeleteFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpDeleteFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeScalarFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeScalarFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CaseLogEntry' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CaseLogEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EditsEntry' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/EditsEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationEmailFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationEmailFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\NotificationEntry' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/NotificationEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\TransitionEntry' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/TransitionEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanel' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanelFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelHelper' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanelHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelPrint' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanelPrint.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryFormFactory\\CaseLogEntryFormFactory' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryFormFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryForm\\CaseLogEntryForm' => $baseDir . '/sources/application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryForm.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardColumn' => $baseDir . '/sources/application/UI/Base/Layout/Dashboard/DashboardColumn.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardLayout' => $baseDir . '/sources/application/UI/Base/Layout/Dashboard/DashboardLayout.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardRow' => $baseDir . '/sources/application/UI/Base/Layout/Dashboard/DashboardRow.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\Column' => $baseDir . '/sources/application/UI/Base/Layout/MultiColumn/Column/Column.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\ColumnUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Layout/MultiColumn/Column/ColumnUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumn' => $baseDir . '/sources/application/UI/Base/Layout/MultiColumn/MultiColumn.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumnUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Layout/MultiColumn/MultiColumnUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenu' => $baseDir . '/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenuFactory' => $baseDir . '/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectDetails' => $baseDir . '/sources/application/UI/Base/Layout/Object/ObjectDetails.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectFactory' => $baseDir . '/sources/application/UI/Base/Layout/Object/ObjectFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContent' => $baseDir . '/sources/application/UI/Base/Layout/PageContent/PageContent.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentFactory' => $baseDir . '/sources/application/UI/Base/Layout/PageContent/PageContentFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentWithSideContent' => $baseDir . '/sources/application/UI/Base/Layout/PageContent/PageContentWithSideContent.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\TabContainer' => $baseDir . '/sources/application/UI/Base/Layout/TabContainer/TabContainer.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\AjaxTab' => $baseDir . '/sources/application/UI/Base/Layout/TabContainer/Tab/AjaxTab.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\Tab' => $baseDir . '/sources/application/UI/Base/Layout/TabContainer/Tab/Tab.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBar' => $baseDir . '/sources/application/UI/Base/Layout/TopBar/TopBar.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarFactory' => $baseDir . '/sources/application/UI/Base/Layout/TopBar/TopBarFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlock' => $baseDir . '/sources/application/UI/Base/Layout/UIContentBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Layout/UIContentBlockUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockWithJSRefreshCallback' => $baseDir . '/sources/application/UI/Base/Layout/UIContentBlockWithJSRefreshCallback .php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\iUIContentBlock' => $baseDir . '/sources/application/UI/Base/Layout/iUIContentBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\UIBlock' => $baseDir . '/sources/application/UI/Base/UIBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\UIException' => $baseDir . '/sources/application/UI/Base/UIException.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlock' => $baseDir . '/sources/application/UI/Base/iUIBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlockFactory' => $baseDir . '/sources/application/UI/Base/iUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\tJSRefreshCallback' => $baseDir . '/sources/application/UI/Base/tJSRefreshCallback.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\tUIContentAreas' => $baseDir . '/sources/application/UI/Base/tUIContentAreas.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxBars\\BlockChartAjaxBars' => $baseDir . '/sources/application/UI/DisplayBlock/BlockChartAjaxBars/BlockChartAjaxBars.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxPie\\BlockChartAjaxPie' => $baseDir . '/sources/application/UI/DisplayBlock/BlockChartAjaxPie/BlockChartAjaxPie.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChart\\BlockChart' => $baseDir . '/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockCsv\\BlockCsv' => $baseDir . '/sources/application/UI/DisplayBlock/BlockCsv/BlockCsv.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockList\\BlockList' => $baseDir . '/sources/application/UI/DisplayBlock/BlockList/BlockList.php',
- 'Combodo\\iTop\\Application\\UI\\Helper\\UIHelper' => $baseDir . '/sources/application/UI/Helper/UIHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockIndirectLinksEdit\\BlockIndirectLinksEdit' => $baseDir . '/sources/application/UI/Links/Indirect/BlockIndirectLinksEdit/BlockIndirectLinksEdit.php',
- 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockObjectPickerDialog\\BlockObjectPickerDialog' => $baseDir . '/sources/application/UI/Links/Indirect/BlockObjectPickerDialog/BlockObjectPickerDialog.php',
- 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => $baseDir . '/sources/application/UI/Preferences/BlockShortcuts/BlockShortcuts.php',
- 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => $baseDir . '/sources/application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\Twig\\Extension' => $baseDir . '/sources/Application/TwigBase/Twig/Extension.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\Twig\\TwigHelper' => $baseDir . '/sources/Application/TwigBase/Twig/TwigHelper.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockExtension' => $baseDir . '/sources/Application/TwigBase/UI/UIBlockExtension.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockNode' => $baseDir . '/sources/Application/TwigBase/UI/UIBlockNode.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockParser' => $baseDir . '/sources/Application/TwigBase/UI/UIBlockParser.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\AbstractUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/AbstractUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\Alert' => $baseDir . '/sources/Application/UI/Base/Component/Alert/Alert.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\AlertUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Alert/AlertUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Breadcrumbs\\Breadcrumbs' => $baseDir . '/sources/Application/UI/Base/Component/Breadcrumbs/Breadcrumbs.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroup' => $baseDir . '/sources/Application/UI/Base/Component/ButtonGroup/ButtonGroup.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroupUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/ButtonGroup/ButtonGroupUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\Button' => $baseDir . '/sources/Application/UI/Base/Component/Button/Button.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonJS' => $baseDir . '/sources/Application/UI/Base/Component/Button/ButtonJS.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Button/ButtonUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonURL' => $baseDir . '/sources/Application/UI/Base/Component/Button/ButtonURL.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSection' => $baseDir . '/sources/Application/UI/Base/Component/CollapsibleSection/CollapsibleSection.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSectionUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/CollapsibleSection/CollapsibleSectionUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletBadge' => $baseDir . '/sources/Application/UI/Base/Component/Dashlet/DashletBadge.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletContainer' => $baseDir . '/sources/Application/UI/Base/Component/Dashlet/DashletContainer.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletFactory' => $baseDir . '/sources/Application/UI/Base/Component/Dashlet/DashletFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletHeaderStatic' => $baseDir . '/sources/Application/UI/Base/Component/Dashlet/DashletHeaderStatic.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletPlainText' => $baseDir . '/sources/Application/UI/Base/Component/Dashlet/DashletPlainText.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTable' => $baseDir . '/sources/Application/UI/Base/Component/DataTable/DataTable.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableSettings' => $baseDir . '/sources/Application/UI/Base/Component/DataTable/DataTableSettings.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/DataTable/DataTableUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTableRow\\FormTableRow' => $baseDir . '/sources/Application/UI/Base/Component/DataTable/StaticTable/FormTableRow/FormTableRow.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTable\\FormTable' => $baseDir . '/sources/Application/UI/Base/Component/DataTable/StaticTable/FormTable/FormTable.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\StaticTable' => $baseDir . '/sources/Application/UI/Base/Component/DataTable/StaticTable/StaticTable.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadge' => $baseDir . '/sources/Application/UI/Base/Component/FieldBadge/FieldBadge.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadgeUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/FieldBadge/FieldBadgeUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSet' => $baseDir . '/sources/Application/UI/Base/Component/FieldSet/FieldSet.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSetUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/FieldSet/FieldSetUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\Field' => $baseDir . '/sources/Application/UI/Base/Component/Field/Field.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\FieldUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Field/FieldUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\Form' => $baseDir . '/sources/Application/UI/Base/Component/Form/Form.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\FormUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Form/FormUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearch' => $baseDir . '/sources/Application/UI/Base/Component/GlobalSearch/GlobalSearch.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchFactory' => $baseDir . '/sources/Application/UI/Base/Component/GlobalSearch/GlobalSearchFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchHelper' => $baseDir . '/sources/Application/UI/Base/Component/GlobalSearch/GlobalSearchHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\Html' => $baseDir . '/sources/Application/UI/Base/Component/Html/Html.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\HtmlFactory' => $baseDir . '/sources/Application/UI/Base/Component/Html/HtmlFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\AbstractInput' => $baseDir . '/sources/Application/UI/Base/Component/Input/AbstractInput.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelect' => $baseDir . '/sources/Application/UI/Base/Component/Input/FileSelect/FileSelect.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelectUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Input/FileSelect/FileSelectUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Input' => $baseDir . '/sources/Application/UI/Base/Component/Input/Input.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Input/InputUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputWithLabel' => $baseDir . '/sources/Application/UI/Base/Component/Input/InputWithLabel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\RichText\\RichText' => $baseDir . '/sources/Application/UI/Base/Component/Input/RichText/RichText.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\SelectUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Input/Select/SelectUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\Select' => $baseDir . '/sources/Application/UI/Base/Component/Input/Select/Select.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOption' => $baseDir . '/sources/Application/UI/Base/Component/Input/Select/SelectOption.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOptionUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Input/Select/SelectOptionUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\TextArea' => $baseDir . '/sources/Application/UI/Base/Component/Input/TextArea.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\tInputLabel' => $baseDir . '/sources/Application/UI/Base/Component/Input/tInputLabel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\MedallionIcon\\MedallionIcon' => $baseDir . '/sources/Application/UI/Base/Component/MedallionIcon/MedallionIcon.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\Panel' => $baseDir . '/sources/Application/UI/Base/Component/Panel/Panel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\PanelUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Panel/PanelUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\Pill' => $baseDir . '/sources/Application/UI/Base/Component/Pill/Pill.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\PillFactory' => $baseDir . '/sources/Application/UI/Base/Component/Pill/PillFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenu' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenu.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenuFactory' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenu' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenu.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuFactory' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\JsPopoverMenuItem' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/JsPopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItem' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItemFactory' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItemFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\SeparatorPopoverMenuItem' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/SeparatorPopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\UrlPopoverMenuItem' => $baseDir . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/UrlPopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreate' => $baseDir . '/sources/Application/UI/Base/Component/QuickCreate/QuickCreate.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateFactory' => $baseDir . '/sources/Application/UI/Base/Component/QuickCreate/QuickCreateFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateHelper' => $baseDir . '/sources/Application/UI/Base/Component/QuickCreate/QuickCreateHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\Spinner' => $baseDir . '/sources/Application/UI/Base/Component/Spinner/Spinner.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\SpinnerUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Spinner/SpinnerUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Text\\Text' => $baseDir . '/sources/Application/UI/Base/Component/Text/Text.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\Title' => $baseDir . '/sources/Application/UI/Base/Component/Title/Title.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\TitleUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Title/TitleUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\AbstractSeparator' => $baseDir . '/sources/Application/UI/Base/Component/Toolbar/Separator/AbstractSeparator.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\ToolbarSeparatorUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Toolbar/Separator/ToolbarSeparatorUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\VerticalSeparator' => $baseDir . '/sources/Application/UI/Base/Component/Toolbar/Separator/VerticalSeparator.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Toolbar' => $baseDir . '/sources/Application/UI/Base/Component/Toolbar/Toolbar.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacer' => $baseDir . '/sources/Application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacer.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacerUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacerUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Toolbar/ToolbarUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntry' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntryFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntryFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentAddedFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentAddedFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentRemovedFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentRemovedFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpCreateFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpCreateFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpDeleteFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpDeleteFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeScalarFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeScalarFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CaseLogEntry' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CaseLogEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EditsEntry' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/EditsEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationEmailFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationEmailFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\NotificationEntry' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/NotificationEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\TransitionEntry' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/TransitionEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanel' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelHelper' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelPrint' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelPrint.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryFormFactory\\CaseLogEntryFormFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryFormFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryForm\\CaseLogEntryForm' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryForm.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardColumn' => $baseDir . '/sources/Application/UI/Base/Layout/Dashboard/DashboardColumn.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardLayout' => $baseDir . '/sources/Application/UI/Base/Layout/Dashboard/DashboardLayout.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardRow' => $baseDir . '/sources/Application/UI/Base/Layout/Dashboard/DashboardRow.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\Column' => $baseDir . '/sources/Application/UI/Base/Layout/MultiColumn/Column/Column.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\ColumnUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Layout/MultiColumn/Column/ColumnUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumn' => $baseDir . '/sources/Application/UI/Base/Layout/MultiColumn/MultiColumn.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumnUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Layout/MultiColumn/MultiColumnUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenu' => $baseDir . '/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenu.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenuFactory' => $baseDir . '/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectDetails' => $baseDir . '/sources/Application/UI/Base/Layout/Object/ObjectDetails.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectFactory' => $baseDir . '/sources/Application/UI/Base/Layout/Object/ObjectFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContent' => $baseDir . '/sources/Application/UI/Base/Layout/PageContent/PageContent.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentFactory' => $baseDir . '/sources/Application/UI/Base/Layout/PageContent/PageContentFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentWithSideContent' => $baseDir . '/sources/Application/UI/Base/Layout/PageContent/PageContentWithSideContent.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\TabContainer' => $baseDir . '/sources/Application/UI/Base/Layout/TabContainer/TabContainer.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\AjaxTab' => $baseDir . '/sources/Application/UI/Base/Layout/TabContainer/Tab/AjaxTab.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\Tab' => $baseDir . '/sources/Application/UI/Base/Layout/TabContainer/Tab/Tab.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBar' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBar.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarFactory' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBarFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlock' => $baseDir . '/sources/Application/UI/Base/Layout/UIContentBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Layout/UIContentBlockUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockWithJSRefreshCallback' => $baseDir . '/sources/Application/UI/Base/Layout/UIContentBlockWithJSRefreshCallback .php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\iUIContentBlock' => $baseDir . '/sources/Application/UI/Base/Layout/iUIContentBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\UIBlock' => $baseDir . '/sources/Application/UI/Base/UIBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\UIException' => $baseDir . '/sources/Application/UI/Base/UIException.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlock' => $baseDir . '/sources/Application/UI/Base/iUIBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/iUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\tJSRefreshCallback' => $baseDir . '/sources/Application/UI/Base/tJSRefreshCallback.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\tUIContentAreas' => $baseDir . '/sources/Application/UI/Base/tUIContentAreas.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxBars\\BlockChartAjaxBars' => $baseDir . '/sources/Application/UI/DisplayBlock/BlockChartAjaxBars/BlockChartAjaxBars.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxPie\\BlockChartAjaxPie' => $baseDir . '/sources/Application/UI/DisplayBlock/BlockChartAjaxPie/BlockChartAjaxPie.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChart\\BlockChart' => $baseDir . '/sources/Application/UI/DisplayBlock/BlockChart/BlockChart.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockCsv\\BlockCsv' => $baseDir . '/sources/Application/UI/DisplayBlock/BlockCsv/BlockCsv.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockList\\BlockList' => $baseDir . '/sources/Application/UI/DisplayBlock/BlockList/BlockList.php',
+ 'Combodo\\iTop\\Application\\UI\\Helper\\UIHelper' => $baseDir . '/sources/Application/UI/Helper/UIHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockIndirectLinksEdit\\BlockIndirectLinksEdit' => $baseDir . '/sources/Application/UI/Links/Indirect/BlockIndirectLinksEdit/BlockIndirectLinksEdit.php',
+ 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockObjectPickerDialog\\BlockObjectPickerDialog' => $baseDir . '/sources/Application/UI/Links/Indirect/BlockObjectPickerDialog/BlockObjectPickerDialog.php',
+ 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => $baseDir . '/sources/Application/UI/Preferences/BlockShortcuts/BlockShortcuts.php',
+ 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => $baseDir . '/sources/Application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php',
'Combodo\\iTop\\Composer\\iTopComposer' => $baseDir . '/sources/Composer/iTopComposer.php',
'Combodo\\iTop\\Controller\\AjaxRenderController' => $baseDir . '/sources/Controller/AjaxRenderController.php',
'Combodo\\iTop\\Controller\\Base\\Layout\\ActivityPanelController' => $baseDir . '/sources/Controller/Base/Layout/ActivityPanelController.php',
- 'Combodo\\iTop\\Controller\\OAuth\\OAuthAjaxController' => $baseDir . '/sources/Controller/OAuth/OAuthAjaxController.php',
'Combodo\\iTop\\Controller\\OAuth\\OAuthLandingController' => $baseDir . '/sources/Controller/OAuth/OAuthLandingController.php',
- 'Combodo\\iTop\\Controller\\OAuth\\OAuthWizardController' => $baseDir . '/sources/Controller/OAuth/OAuthWizardController.php',
'Combodo\\iTop\\Controller\\PreferencesController' => $baseDir . '/sources/Controller/PreferencesController.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientProvider' => $baseDir . '/sources/Core/Authentication/Client/OAuth/IOAuthClientProvider.php',
- 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientResultDisplay' => $baseDir . '/sources/Core/Authentication/Client/OAuth/IOAuthClientResultDisplay.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAbstract' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAbstract.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAzure' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAzure.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderFactory' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderFactory.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderGoogle' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderGoogle.php',
- 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientResultDisplayConf' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientResultDisplayConf.php',
'Combodo\\iTop\\Core\\CMDBChange\\CMDBChangeOrigin' => $baseDir . '/sources/Core/CMDBChange/CMDBChangeOrigin.php',
'Combodo\\iTop\\Core\\DbConnectionWrapper' => $baseDir . '/core/DbConnectionWrapper.php',
'Combodo\\iTop\\Core\\Email\\EmailFactory' => $baseDir . '/sources/Core/Email/EmailFactory.php',
@@ -419,7 +414,7 @@ return array(
'DashletProxy' => $baseDir . '/application/dashlet.class.inc.php',
'DashletUnknown' => $baseDir . '/application/dashlet.class.inc.php',
'DataTable' => $baseDir . '/application/datatable.class.inc.php',
- 'DataTableConfig' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php',
+ 'DataTableConfig' => $baseDir . '/sources/Application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php',
'Datamatrix' => $vendorDir . '/combodo/tcpdf/include/barcodes/datamatrix.php',
'DateTimeFormat' => $baseDir . '/core/datetimeformat.class.inc.php',
'DeadLockLog' => $baseDir . '/core/log.class.inc.php',
@@ -455,12 +450,10 @@ return array(
'DisplayableGroupNode' => $baseDir . '/core/displayablegraph.class.inc.php',
'DisplayableNode' => $baseDir . '/core/displayablegraph.class.inc.php',
'DisplayableRedundancyNode' => $baseDir . '/core/displayablegraph.class.inc.php',
- 'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
- 'DownloadPage' => $baseDir . '/sources/application/WebPage/DownloadPage.php',
+ 'DownloadPage' => $baseDir . '/sources/Application/WebPage/DownloadPage.php',
'EMail' => $baseDir . '/core/email.class.inc.php',
'EMailLaminas' => $baseDir . '/sources/Core/Email/EmailLaminas.php',
- 'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
- 'ErrorPage' => $baseDir . '/sources/application/WebPage/ErrorPage.php',
+ 'ErrorPage' => $baseDir . '/sources/Application/WebPage/ErrorPage.php',
'Event' => $baseDir . '/core/event.class.inc.php',
'EventIssue' => $baseDir . '/core/event.class.inc.php',
'EventLoginUsage' => $baseDir . '/core/event.class.inc.php',
@@ -569,6 +562,7 @@ return array(
'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php',
'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php',
'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php',
+ 'GuzzleHttp\\Psr7\\UriComparator' => $vendorDir . '/guzzlehttp/psr7/src/UriComparator.php',
'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php',
'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php',
'GuzzleHttp\\Psr7\\Utils' => $vendorDir . '/guzzlehttp/psr7/src/Utils.php',
@@ -600,7 +594,8 @@ return array(
'ItopCounter' => $baseDir . '/core/counter.class.inc.php',
'JSButtonItem' => $baseDir . '/application/applicationextension.inc.php',
'JSPopupMenuItem' => $baseDir . '/application/applicationextension.inc.php',
- 'JsonPage' => $baseDir . '/sources/application/WebPage/JsonPage.php',
+ 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
+ 'JsonPage' => $baseDir . '/sources/Application/WebPage/JsonPage.php',
'KeyValueStore' => $baseDir . '/core/counter.class.inc.php',
'Laminas\\Loader\\AutoloaderFactory' => $vendorDir . '/laminas/laminas-loader/src/AutoloaderFactory.php',
'Laminas\\Loader\\ClassMapAutoloader' => $vendorDir . '/laminas/laminas-loader/src/ClassMapAutoloader.php',
@@ -980,7 +975,7 @@ return array(
'NestedQueryOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
'NewObjectMenuNode' => $baseDir . '/application/menunode.class.inc.php',
'NewsroomProviderBase' => $baseDir . '/application/newsroomprovider.class.inc.php',
- 'NiceWebPage' => $baseDir . '/sources/application/WebPage/NiceWebPage.php',
+ 'NiceWebPage' => $baseDir . '/sources/Application/WebPage/NiceWebPage.php',
'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
'NotYetEvaluatedExpression' => $baseDir . '/core/oql/expression.class.inc.php',
'OQLActualClassTreeResolver' => $baseDir . '/core/oqlactualclasstreeresolver.class.inc.php',
@@ -1017,12 +1012,11 @@ return array(
'OqlUnionQuery' => $baseDir . '/core/oql/oqlquery.class.inc.php',
'PDF417' => $vendorDir . '/combodo/tcpdf/include/barcodes/pdf417.php',
'PDFBulkExport' => $baseDir . '/core/pdfbulkexport.class.inc.php',
- 'PDFPage' => $baseDir . '/sources/application/WebPage/PDFPage.php',
+ 'PDFPage' => $baseDir . '/sources/Application/WebPage/PDFPage.php',
'PEAR' => $vendorDir . '/pear/pear-core-minimal/src/PEAR.php',
'PEAR_ErrorStack' => $vendorDir . '/pear/pear-core-minimal/src/PEAR/ErrorStack.php',
'PEAR_Exception' => $vendorDir . '/pear/pear_exception/PEAR/Exception.php',
- 'Page' => $baseDir . '/sources/application/WebPage/Page.php',
- 'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
+ 'Page' => $baseDir . '/sources/Application/WebPage/Page.php',
'Pelago\\Emogrifier' => $vendorDir . '/pelago/emogrifier/src/Emogrifier.php',
'Pelago\\Emogrifier\\CssInliner' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/CssInliner.php',
'Pelago\\Emogrifier\\HtmlProcessor\\AbstractHtmlProcessor' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/AbstractHtmlProcessor.php',
@@ -1280,6 +1274,7 @@ return array(
'PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php',
'PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php',
'PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php',
+ 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
'PluginInstanciationManager' => $baseDir . '/core/plugininstanciationmanager.class.inc.php',
'PluginManager' => $baseDir . '/core/pluginmanager.class.inc.php',
'PortalDispatcher' => $baseDir . '/application/portaldispatcher.class.inc.php',
@@ -1295,6 +1290,9 @@ return array(
'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php',
'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php',
'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php',
+ 'Psr\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/psr/event-dispatcher/src/EventDispatcherInterface.php',
+ 'Psr\\EventDispatcher\\ListenerProviderInterface' => $vendorDir . '/psr/event-dispatcher/src/ListenerProviderInterface.php',
+ 'Psr\\EventDispatcher\\StoppableEventInterface' => $vendorDir . '/psr/event-dispatcher/src/StoppableEventInterface.php',
'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',
@@ -1310,9 +1308,6 @@ return array(
'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
- 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php',
- 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php',
- 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php',
'QRcode' => $vendorDir . '/combodo/tcpdf/include/barcodes/qrcode.php',
'Query' => $baseDir . '/application/query.class.inc.php',
'QueryOQL' => $baseDir . '/application/query.class.inc.php',
@@ -1328,6 +1323,7 @@ return array(
'RestResultWithObjects' => $baseDir . '/core/restservices.class.inc.php',
'RestResultWithRelations' => $baseDir . '/core/restservices.class.inc.php',
'RestUtils' => $baseDir . '/application/applicationextension.inc.php',
+ 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php',
'RotatingLogFileNameBuilder' => $baseDir . '/core/log.class.inc.php',
'RowStatus' => $baseDir . '/core/bulkchange.class.inc.php',
'RowStatus_Disappeared' => $baseDir . '/core/bulkchange.class.inc.php',
@@ -1347,13 +1343,29 @@ return array(
'ScalarOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
'ScssPhp\\ScssPhp\\Base\\Range' => $vendorDir . '/scssphp/scssphp/src/Base/Range.php',
'ScssPhp\\ScssPhp\\Block' => $vendorDir . '/scssphp/scssphp/src/Block.php',
+ 'ScssPhp\\ScssPhp\\Block\\AtRootBlock' => $vendorDir . '/scssphp/scssphp/src/Block/AtRootBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\CallableBlock' => $vendorDir . '/scssphp/scssphp/src/Block/CallableBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ContentBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ContentBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\DirectiveBlock' => $vendorDir . '/scssphp/scssphp/src/Block/DirectiveBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\EachBlock' => $vendorDir . '/scssphp/scssphp/src/Block/EachBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ElseBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ElseBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ElseifBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ElseifBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ForBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ForBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\IfBlock' => $vendorDir . '/scssphp/scssphp/src/Block/IfBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\MediaBlock' => $vendorDir . '/scssphp/scssphp/src/Block/MediaBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\NestedPropertyBlock' => $vendorDir . '/scssphp/scssphp/src/Block/NestedPropertyBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\WhileBlock' => $vendorDir . '/scssphp/scssphp/src/Block/WhileBlock.php',
'ScssPhp\\ScssPhp\\Cache' => $vendorDir . '/scssphp/scssphp/src/Cache.php',
'ScssPhp\\ScssPhp\\Colors' => $vendorDir . '/scssphp/scssphp/src/Colors.php',
+ 'ScssPhp\\ScssPhp\\CompilationResult' => $vendorDir . '/scssphp/scssphp/src/CompilationResult.php',
'ScssPhp\\ScssPhp\\Compiler' => $vendorDir . '/scssphp/scssphp/src/Compiler.php',
+ 'ScssPhp\\ScssPhp\\Compiler\\CachedResult' => $vendorDir . '/scssphp/scssphp/src/Compiler/CachedResult.php',
'ScssPhp\\ScssPhp\\Compiler\\Environment' => $vendorDir . '/scssphp/scssphp/src/Compiler/Environment.php',
'ScssPhp\\ScssPhp\\Exception\\CompilerException' => $vendorDir . '/scssphp/scssphp/src/Exception/CompilerException.php',
'ScssPhp\\ScssPhp\\Exception\\ParserException' => $vendorDir . '/scssphp/scssphp/src/Exception/ParserException.php',
'ScssPhp\\ScssPhp\\Exception\\RangeException' => $vendorDir . '/scssphp/scssphp/src/Exception/RangeException.php',
+ 'ScssPhp\\ScssPhp\\Exception\\SassException' => $vendorDir . '/scssphp/scssphp/src/Exception/SassException.php',
+ 'ScssPhp\\ScssPhp\\Exception\\SassScriptException' => $vendorDir . '/scssphp/scssphp/src/Exception/SassScriptException.php',
'ScssPhp\\ScssPhp\\Exception\\ServerException' => $vendorDir . '/scssphp/scssphp/src/Exception/ServerException.php',
'ScssPhp\\ScssPhp\\Formatter' => $vendorDir . '/scssphp/scssphp/src/Formatter.php',
'ScssPhp\\ScssPhp\\Formatter\\Compact' => $vendorDir . '/scssphp/scssphp/src/Formatter/Compact.php',
@@ -1363,19 +1375,25 @@ return array(
'ScssPhp\\ScssPhp\\Formatter\\Expanded' => $vendorDir . '/scssphp/scssphp/src/Formatter/Expanded.php',
'ScssPhp\\ScssPhp\\Formatter\\Nested' => $vendorDir . '/scssphp/scssphp/src/Formatter/Nested.php',
'ScssPhp\\ScssPhp\\Formatter\\OutputBlock' => $vendorDir . '/scssphp/scssphp/src/Formatter/OutputBlock.php',
+ 'ScssPhp\\ScssPhp\\Logger\\LoggerInterface' => $vendorDir . '/scssphp/scssphp/src/Logger/LoggerInterface.php',
+ 'ScssPhp\\ScssPhp\\Logger\\QuietLogger' => $vendorDir . '/scssphp/scssphp/src/Logger/QuietLogger.php',
+ 'ScssPhp\\ScssPhp\\Logger\\StreamLogger' => $vendorDir . '/scssphp/scssphp/src/Logger/StreamLogger.php',
'ScssPhp\\ScssPhp\\Node' => $vendorDir . '/scssphp/scssphp/src/Node.php',
'ScssPhp\\ScssPhp\\Node\\Number' => $vendorDir . '/scssphp/scssphp/src/Node/Number.php',
+ 'ScssPhp\\ScssPhp\\OutputStyle' => $vendorDir . '/scssphp/scssphp/src/OutputStyle.php',
'ScssPhp\\ScssPhp\\Parser' => $vendorDir . '/scssphp/scssphp/src/Parser.php',
'ScssPhp\\ScssPhp\\SourceMap\\Base64' => $vendorDir . '/scssphp/scssphp/src/SourceMap/Base64.php',
'ScssPhp\\ScssPhp\\SourceMap\\Base64VLQ' => $vendorDir . '/scssphp/scssphp/src/SourceMap/Base64VLQ.php',
'ScssPhp\\ScssPhp\\SourceMap\\SourceMapGenerator' => $vendorDir . '/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php',
'ScssPhp\\ScssPhp\\Type' => $vendorDir . '/scssphp/scssphp/src/Type.php',
'ScssPhp\\ScssPhp\\Util' => $vendorDir . '/scssphp/scssphp/src/Util.php',
+ 'ScssPhp\\ScssPhp\\Util\\Path' => $vendorDir . '/scssphp/scssphp/src/Util/Path.php',
+ 'ScssPhp\\ScssPhp\\ValueConverter' => $vendorDir . '/scssphp/scssphp/src/ValueConverter.php',
'ScssPhp\\ScssPhp\\Version' => $vendorDir . '/scssphp/scssphp/src/Version.php',
+ 'ScssPhp\\ScssPhp\\Warn' => $vendorDir . '/scssphp/scssphp/src/Warn.php',
'SearchMenuNode' => $baseDir . '/application/menunode.class.inc.php',
'SecurityException' => $baseDir . '/application/exceptions/SecurityException.php',
'SeparatorPopupMenuItem' => $baseDir . '/application/applicationextension.inc.php',
- 'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
'SetupLog' => $baseDir . '/core/log.class.inc.php',
'Shortcut' => $baseDir . '/application/shortcut.class.inc.php',
'ShortcutContainerMenuNode' => $baseDir . '/application/menunode.class.inc.php',
@@ -1394,32 +1412,38 @@ return array(
'StimulusInternal' => $baseDir . '/core/stimulus.class.inc.php',
'StimulusUserAction' => $baseDir . '/core/stimulus.class.inc.php',
'Str' => $baseDir . '/core/MyHelpers.class.inc.php',
+ 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
'Symfony\\Bridge\\Twig\\AppVariable' => $vendorDir . '/symfony/twig-bridge/AppVariable.php',
'Symfony\\Bridge\\Twig\\Command\\DebugCommand' => $vendorDir . '/symfony/twig-bridge/Command/DebugCommand.php',
'Symfony\\Bridge\\Twig\\Command\\LintCommand' => $vendorDir . '/symfony/twig-bridge/Command/LintCommand.php',
'Symfony\\Bridge\\Twig\\DataCollector\\TwigDataCollector' => $vendorDir . '/symfony/twig-bridge/DataCollector/TwigDataCollector.php',
+ 'Symfony\\Bridge\\Twig\\ErrorRenderer\\TwigErrorRenderer' => $vendorDir . '/symfony/twig-bridge/ErrorRenderer/TwigErrorRenderer.php',
'Symfony\\Bridge\\Twig\\Extension\\AssetExtension' => $vendorDir . '/symfony/twig-bridge/Extension/AssetExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\CodeExtension' => $vendorDir . '/symfony/twig-bridge/Extension/CodeExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\CsrfExtension' => $vendorDir . '/symfony/twig-bridge/Extension/CsrfExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\CsrfRuntime' => $vendorDir . '/symfony/twig-bridge/Extension/CsrfRuntime.php',
'Symfony\\Bridge\\Twig\\Extension\\DumpExtension' => $vendorDir . '/symfony/twig-bridge/Extension/DumpExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\ExpressionExtension' => $vendorDir . '/symfony/twig-bridge/Extension/ExpressionExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\FormExtension' => $vendorDir . '/symfony/twig-bridge/Extension/FormExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\HttpFoundationExtension' => $vendorDir . '/symfony/twig-bridge/Extension/HttpFoundationExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\HttpKernelExtension' => $vendorDir . '/symfony/twig-bridge/Extension/HttpKernelExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\HttpKernelRuntime' => $vendorDir . '/symfony/twig-bridge/Extension/HttpKernelRuntime.php',
- 'Symfony\\Bridge\\Twig\\Extension\\InitRuntimeInterface' => $vendorDir . '/symfony/twig-bridge/Extension/InitRuntimeInterface.php',
'Symfony\\Bridge\\Twig\\Extension\\LogoutUrlExtension' => $vendorDir . '/symfony/twig-bridge/Extension/LogoutUrlExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension' => $vendorDir . '/symfony/twig-bridge/Extension/ProfilerExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\RoutingExtension' => $vendorDir . '/symfony/twig-bridge/Extension/RoutingExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\SecurityExtension' => $vendorDir . '/symfony/twig-bridge/Extension/SecurityExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\SerializerExtension' => $vendorDir . '/symfony/twig-bridge/Extension/SerializerExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\SerializerRuntime' => $vendorDir . '/symfony/twig-bridge/Extension/SerializerRuntime.php',
'Symfony\\Bridge\\Twig\\Extension\\StopwatchExtension' => $vendorDir . '/symfony/twig-bridge/Extension/StopwatchExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\TranslationExtension' => $vendorDir . '/symfony/twig-bridge/Extension/TranslationExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\WebLinkExtension' => $vendorDir . '/symfony/twig-bridge/Extension/WebLinkExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\WorkflowExtension' => $vendorDir . '/symfony/twig-bridge/Extension/WorkflowExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\YamlExtension' => $vendorDir . '/symfony/twig-bridge/Extension/YamlExtension.php',
- 'Symfony\\Bridge\\Twig\\Form\\TwigRenderer' => $vendorDir . '/symfony/twig-bridge/Form/TwigRenderer.php',
'Symfony\\Bridge\\Twig\\Form\\TwigRendererEngine' => $vendorDir . '/symfony/twig-bridge/Form/TwigRendererEngine.php',
- 'Symfony\\Bridge\\Twig\\Form\\TwigRendererEngineInterface' => $vendorDir . '/symfony/twig-bridge/Form/TwigRendererEngineInterface.php',
- 'Symfony\\Bridge\\Twig\\Form\\TwigRendererInterface' => $vendorDir . '/symfony/twig-bridge/Form/TwigRendererInterface.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\BodyRenderer' => $vendorDir . '/symfony/twig-bridge/Mime/BodyRenderer.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\NotificationEmail' => $vendorDir . '/symfony/twig-bridge/Mime/NotificationEmail.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\TemplatedEmail' => $vendorDir . '/symfony/twig-bridge/Mime/TemplatedEmail.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\WrappedTemplatedEmail' => $vendorDir . '/symfony/twig-bridge/Mime/WrappedTemplatedEmail.php',
'Symfony\\Bridge\\Twig\\NodeVisitor\\Scope' => $vendorDir . '/symfony/twig-bridge/NodeVisitor/Scope.php',
'Symfony\\Bridge\\Twig\\NodeVisitor\\TranslationDefaultDomainNodeVisitor' => $vendorDir . '/symfony/twig-bridge/NodeVisitor/TranslationDefaultDomainNodeVisitor.php',
'Symfony\\Bridge\\Twig\\NodeVisitor\\TranslationNodeVisitor' => $vendorDir . '/symfony/twig-bridge/NodeVisitor/TranslationNodeVisitor.php',
@@ -1433,38 +1457,42 @@ return array(
'Symfony\\Bridge\\Twig\\TokenParser\\DumpTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/DumpTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\FormThemeTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/FormThemeTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\StopwatchTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/StopwatchTokenParser.php',
- 'Symfony\\Bridge\\Twig\\TokenParser\\TransChoiceTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/TransChoiceTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\TransDefaultDomainTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/TransDefaultDomainTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\TransTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/TransTokenParser.php',
'Symfony\\Bridge\\Twig\\Translation\\TwigExtractor' => $vendorDir . '/symfony/twig-bridge/Translation/TwigExtractor.php',
- 'Symfony\\Bridge\\Twig\\TwigEngine' => $vendorDir . '/symfony/twig-bridge/TwigEngine.php',
'Symfony\\Bridge\\Twig\\UndefinedCallableHandler' => $vendorDir . '/symfony/twig-bridge/UndefinedCallableHandler.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AbstractPhpFileCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AnnotationsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ClassCacheCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/ClassCacheCacheWarmer.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\CachePoolClearerCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ConfigBuilderCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\RouterCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\SerializerCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinder' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TemplateFinder.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinderInterface' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplatePathsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TranslationsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ValidatorCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Client' => $vendorDir . '/symfony/framework-bundle/Client.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\AboutCommand' => $vendorDir . '/symfony/framework-bundle/Command/AboutCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\AbstractConfigCommand' => $vendorDir . '/symfony/framework-bundle/Command/AbstractConfigCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\AssetsInstallCommand' => $vendorDir . '/symfony/framework-bundle/Command/AssetsInstallCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\BuildDebugContainerTrait' => $vendorDir . '/symfony/framework-bundle/Command/BuildDebugContainerTrait.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheClearCommand' => $vendorDir . '/symfony/framework-bundle/Command/CacheClearCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolClearCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolClearCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolDeleteCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolDeleteCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolListCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolListCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolPruneCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolPruneCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheWarmupCommand' => $vendorDir . '/symfony/framework-bundle/Command/CacheWarmupCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/ConfigDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDumpReferenceCommand' => $vendorDir . '/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerAwareCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerAwareCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerDebugCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerLintCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerLintCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\DebugAutowiringCommand' => $vendorDir . '/symfony/framework-bundle/Command/DebugAutowiringCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\EventDispatcherDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/RouterDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterMatchCommand' => $vendorDir . '/symfony/framework-bundle/Command/RouterMatchCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsDecryptToLocalCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsEncryptFromLocalCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsGenerateKeysCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsListCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsListCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsRemoveCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsRemoveCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsSetCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsSetCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/TranslationDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationUpdateCommand' => $vendorDir . '/symfony/framework-bundle/Command/TranslationUpdateCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\WorkflowDumpCommand' => $vendorDir . '/symfony/framework-bundle/Command/WorkflowDumpCommand.php',
@@ -1478,89 +1506,46 @@ return array(
'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php',
'Symfony\\Bundle\\FrameworkBundle\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/framework-bundle/Console/Helper/DescriptorHelper.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController' => $vendorDir . '/symfony/framework-bundle/Controller/AbstractController.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller' => $vendorDir . '/symfony/framework-bundle/Controller/Controller.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerNameParser' => $vendorDir . '/symfony/framework-bundle/Controller/ControllerNameParser.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver' => $vendorDir . '/symfony/framework-bundle/Controller/ControllerResolver.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerTrait' => $vendorDir . '/symfony/framework-bundle/Controller/ControllerTrait.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController' => $vendorDir . '/symfony/framework-bundle/Controller/RedirectController.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController' => $vendorDir . '/symfony/framework-bundle/Controller/TemplateController.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/framework-bundle/DataCollector/RequestDataCollector.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\AbstractDataCollector' => $vendorDir . '/symfony/framework-bundle/DataCollector/AbstractDataCollector.php',
'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/framework-bundle/DataCollector/RouterDataCollector.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\TemplateAwareDataCollectorInterface' => $vendorDir . '/symfony/framework-bundle/DataCollector/TemplateAwareDataCollectorInterface.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddAnnotationsCachedReaderPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddCacheClearerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddCacheClearerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddCacheWarmerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddCacheWarmerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddConsoleCommandPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddConsoleCommandPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddConstraintValidatorsPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddConstraintValidatorsPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddDebugLogProcessorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddValidatorInitializersPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddValidatorInitializersPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CacheCollectorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CacheCollectorPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolClearerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolClearerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPrunerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPrunerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CompilerDebugDumpPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/CompilerDebugDumpPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ConfigCachePass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ConfigCachePass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AssetsContextPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AssetsContextPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ContainerBuilderDebugDumpPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ControllerArgumentValueResolverPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ControllerArgumentValueResolverPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\DataCollectorTranslatorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\FormPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/FormPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\LoggingTranslatorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ProfilerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\PropertyInfoPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/PropertyInfoPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\RoutingResolverPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/RoutingResolverPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SerializerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/SerializerPass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\RemoveUnusedSessionMarshallingHandlerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/RemoveUnusedSessionMarshallingHandlerPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SessionPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TemplatingPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TemplatingPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslationDumperPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslationDumperPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslationExtractorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslationExtractorPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslatorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslatorPass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerRealRefPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerWeakRefPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\UnusedTagsPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ValidateWorkflowsPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ValidateWorkflowsPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\WorkflowGuardListenerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Configuration' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Configuration.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\FrameworkExtension' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php',
- 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\ResolveControllerNameSubscriber' => $vendorDir . '/symfony/framework-bundle/EventListener/ResolveControllerNameSubscriber.php',
- 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener' => $vendorDir . '/symfony/framework-bundle/EventListener/SessionListener.php',
- 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListener' => $vendorDir . '/symfony/framework-bundle/EventListener/TestSessionListener.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SuggestMissingPackageSubscriber' => $vendorDir . '/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php',
'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle' => $vendorDir . '/symfony/framework-bundle/FrameworkBundle.php',
'Symfony\\Bundle\\FrameworkBundle\\HttpCache\\HttpCache' => $vendorDir . '/symfony/framework-bundle/HttpCache/HttpCache.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\KernelBrowser' => $vendorDir . '/symfony/framework-bundle/KernelBrowser.php',
'Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait' => $vendorDir . '/symfony/framework-bundle/Kernel/MicroKernelTrait.php',
'Symfony\\Bundle\\FrameworkBundle\\Routing\\AnnotatedRouteControllerLoader' => $vendorDir . '/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php',
'Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader' => $vendorDir . '/symfony/framework-bundle/Routing/DelegatingLoader.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableUrlMatcher' => $vendorDir . '/symfony/framework-bundle/Routing/RedirectableUrlMatcher.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher' => $vendorDir . '/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Routing\\RouteLoaderInterface' => $vendorDir . '/symfony/framework-bundle/Routing/RouteLoaderInterface.php',
'Symfony\\Bundle\\FrameworkBundle\\Routing\\Router' => $vendorDir . '/symfony/framework-bundle/Routing/Router.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\DelegatingEngine' => $vendorDir . '/symfony/framework-bundle/Templating/DelegatingEngine.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\EngineInterface' => $vendorDir . '/symfony/framework-bundle/Templating/EngineInterface.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\GlobalVariables' => $vendorDir . '/symfony/framework-bundle/Templating/GlobalVariables.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\ActionsHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/ActionsHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\AssetsHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/AssetsHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\CodeHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/CodeHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\FormHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/FormHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RequestHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/RequestHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RouterHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/RouterHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\SessionHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/SessionHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\StopwatchHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/StopwatchHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\TranslatorHelper' => $vendorDir . '/symfony/framework-bundle/Templating/Helper/TranslatorHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\FilesystemLoader' => $vendorDir . '/symfony/framework-bundle/Templating/Loader/FilesystemLoader.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\TemplateLocator' => $vendorDir . '/symfony/framework-bundle/Templating/Loader/TemplateLocator.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine' => $vendorDir . '/symfony/framework-bundle/Templating/PhpEngine.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateFilenameParser' => $vendorDir . '/symfony/framework-bundle/Templating/TemplateFilenameParser.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateNameParser' => $vendorDir . '/symfony/framework-bundle/Templating/TemplateNameParser.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateReference' => $vendorDir . '/symfony/framework-bundle/Templating/TemplateReference.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TimedPhpEngine' => $vendorDir . '/symfony/framework-bundle/Templating/TimedPhpEngine.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Translation\\PhpExtractor' => $vendorDir . '/symfony/framework-bundle/Translation/PhpExtractor.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Translation\\PhpStringTokenParser' => $vendorDir . '/symfony/framework-bundle/Translation/PhpStringTokenParser.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Translation\\TranslationLoader' => $vendorDir . '/symfony/framework-bundle/Translation/TranslationLoader.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Secrets\\AbstractVault' => $vendorDir . '/symfony/framework-bundle/Secrets/AbstractVault.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Secrets\\DotenvVault' => $vendorDir . '/symfony/framework-bundle/Secrets/DotenvVault.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Secrets\\SodiumVault' => $vendorDir . '/symfony/framework-bundle/Secrets/SodiumVault.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Session\\DeprecatedSessionFactory' => $vendorDir . '/symfony/framework-bundle/Session/DeprecatedSessionFactory.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Session\\ServiceSessionFactory' => $vendorDir . '/symfony/framework-bundle/Session/ServiceSessionFactory.php',
'Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator' => $vendorDir . '/symfony/framework-bundle/Translation/Translator.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Validator\\ConstraintValidatorFactory' => $vendorDir . '/symfony/framework-bundle/Validator/ConstraintValidatorFactory.php',
- 'Symfony\\Bundle\\TwigBundle\\CacheWarmer\\TemplateCacheCacheWarmer' => $vendorDir . '/symfony/twig-bundle/CacheWarmer/TemplateCacheCacheWarmer.php',
'Symfony\\Bundle\\TwigBundle\\CacheWarmer\\TemplateCacheWarmer' => $vendorDir . '/symfony/twig-bundle/CacheWarmer/TemplateCacheWarmer.php',
- 'Symfony\\Bundle\\TwigBundle\\Command\\DebugCommand' => $vendorDir . '/symfony/twig-bundle/Command/DebugCommand.php',
'Symfony\\Bundle\\TwigBundle\\Command\\LintCommand' => $vendorDir . '/symfony/twig-bundle/Command/LintCommand.php',
- 'Symfony\\Bundle\\TwigBundle\\ContainerAwareRuntimeLoader' => $vendorDir . '/symfony/twig-bundle/ContainerAwareRuntimeLoader.php',
- 'Symfony\\Bundle\\TwigBundle\\Controller\\ExceptionController' => $vendorDir . '/symfony/twig-bundle/Controller/ExceptionController.php',
- 'Symfony\\Bundle\\TwigBundle\\Controller\\PreviewErrorController' => $vendorDir . '/symfony/twig-bundle/Controller/PreviewErrorController.php',
- 'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\ExceptionListenerPass' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/Compiler/ExceptionListenerPass.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\ExtensionPass' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/Compiler/ExtensionPass.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\RuntimeLoaderPass' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/Compiler/RuntimeLoaderPass.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\TwigEnvironmentPass' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/Compiler/TwigEnvironmentPass.php',
@@ -1568,11 +1553,9 @@ return array(
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Configuration' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/Configuration.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Configurator\\EnvironmentConfigurator' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/Configurator/EnvironmentConfigurator.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\TwigExtension' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/TwigExtension.php',
- 'Symfony\\Bundle\\TwigBundle\\Loader\\FilesystemLoader' => $vendorDir . '/symfony/twig-bundle/Loader/FilesystemLoader.php',
'Symfony\\Bundle\\TwigBundle\\TemplateIterator' => $vendorDir . '/symfony/twig-bundle/TemplateIterator.php',
'Symfony\\Bundle\\TwigBundle\\TwigBundle' => $vendorDir . '/symfony/twig-bundle/TwigBundle.php',
- 'Symfony\\Bundle\\TwigBundle\\TwigEngine' => $vendorDir . '/symfony/twig-bundle/TwigEngine.php',
- 'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ExceptionController' => $vendorDir . '/symfony/web-profiler-bundle/Controller/ExceptionController.php',
+ 'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ExceptionPanelController' => $vendorDir . '/symfony/web-profiler-bundle/Controller/ExceptionPanelController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ProfilerController' => $vendorDir . '/symfony/web-profiler-bundle/Controller/ProfilerController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\RouterController' => $vendorDir . '/symfony/web-profiler-bundle/Controller/RouterController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Csp\\ContentSecurityPolicyHandler' => $vendorDir . '/symfony/web-profiler-bundle/Csp/ContentSecurityPolicyHandler.php',
@@ -1584,66 +1567,68 @@ return array(
'Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension' => $vendorDir . '/symfony/web-profiler-bundle/Twig/WebProfilerExtension.php',
'Symfony\\Bundle\\WebProfilerBundle\\WebProfilerBundle' => $vendorDir . '/symfony/web-profiler-bundle/WebProfilerBundle.php',
'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/cache/Adapter/AdapterInterface.php',
'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => $vendorDir . '/symfony/cache/Adapter/ApcuAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/ArrayAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => $vendorDir . '/symfony/cache/Adapter/ChainAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineDbalAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => $vendorDir . '/symfony/cache/Adapter/MemcachedAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => $vendorDir . '/symfony/cache/Adapter/NullAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => $vendorDir . '/symfony/cache/Adapter/ParameterNormalizer.php',
'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => $vendorDir . '/symfony/cache/Adapter/PdoAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpArrayAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpFilesAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => $vendorDir . '/symfony/cache/Adapter/ProxyAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => $vendorDir . '/symfony/cache/Adapter/Psr16Adapter.php',
'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisAdapter.php',
- 'Symfony\\Component\\Cache\\Adapter\\SimpleCacheAdapter' => $vendorDir . '/symfony/cache/Adapter/SimpleCacheAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
'Symfony\\Component\\Cache\\CacheItem' => $vendorDir . '/symfony/cache/CacheItem.php',
'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => $vendorDir . '/symfony/cache/DataCollector/CacheDataCollector.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => $vendorDir . '/symfony/cache/DependencyInjection/CacheCollectorPass.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPass.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php',
'Symfony\\Component\\Cache\\DoctrineProvider' => $vendorDir . '/symfony/cache/DoctrineProvider.php',
'Symfony\\Component\\Cache\\Exception\\CacheException' => $vendorDir . '/symfony/cache/Exception/CacheException.php',
'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/cache/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Cache\\Exception\\LogicException' => $vendorDir . '/symfony/cache/Exception/LogicException.php',
+ 'Symfony\\Component\\Cache\\LockRegistry' => $vendorDir . '/symfony/cache/LockRegistry.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DefaultMarshaller.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DeflateMarshaller.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => $vendorDir . '/symfony/cache/Marshaller/MarshallerInterface.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => $vendorDir . '/symfony/cache/Marshaller/SodiumMarshaller.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => $vendorDir . '/symfony/cache/Marshaller/TagAwareMarshaller.php',
+ 'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php',
+ 'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationHandler.php',
+ 'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationMessage.php',
'Symfony\\Component\\Cache\\PruneableInterface' => $vendorDir . '/symfony/cache/PruneableInterface.php',
+ 'Symfony\\Component\\Cache\\Psr16Cache' => $vendorDir . '/symfony/cache/Psr16Cache.php',
'Symfony\\Component\\Cache\\ResettableInterface' => $vendorDir . '/symfony/cache/ResettableInterface.php',
- 'Symfony\\Component\\Cache\\Simple\\AbstractCache' => $vendorDir . '/symfony/cache/Simple/AbstractCache.php',
- 'Symfony\\Component\\Cache\\Simple\\ApcuCache' => $vendorDir . '/symfony/cache/Simple/ApcuCache.php',
- 'Symfony\\Component\\Cache\\Simple\\ArrayCache' => $vendorDir . '/symfony/cache/Simple/ArrayCache.php',
- 'Symfony\\Component\\Cache\\Simple\\ChainCache' => $vendorDir . '/symfony/cache/Simple/ChainCache.php',
- 'Symfony\\Component\\Cache\\Simple\\DoctrineCache' => $vendorDir . '/symfony/cache/Simple/DoctrineCache.php',
- 'Symfony\\Component\\Cache\\Simple\\FilesystemCache' => $vendorDir . '/symfony/cache/Simple/FilesystemCache.php',
- 'Symfony\\Component\\Cache\\Simple\\MemcachedCache' => $vendorDir . '/symfony/cache/Simple/MemcachedCache.php',
- 'Symfony\\Component\\Cache\\Simple\\NullCache' => $vendorDir . '/symfony/cache/Simple/NullCache.php',
- 'Symfony\\Component\\Cache\\Simple\\PdoCache' => $vendorDir . '/symfony/cache/Simple/PdoCache.php',
- 'Symfony\\Component\\Cache\\Simple\\PhpArrayCache' => $vendorDir . '/symfony/cache/Simple/PhpArrayCache.php',
- 'Symfony\\Component\\Cache\\Simple\\PhpFilesCache' => $vendorDir . '/symfony/cache/Simple/PhpFilesCache.php',
- 'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => $vendorDir . '/symfony/cache/Simple/Psr6Cache.php',
- 'Symfony\\Component\\Cache\\Simple\\RedisCache' => $vendorDir . '/symfony/cache/Simple/RedisCache.php',
- 'Symfony\\Component\\Cache\\Simple\\TraceableCache' => $vendorDir . '/symfony/cache/Simple/TraceableCache.php',
- 'Symfony\\Component\\Cache\\Traits\\AbstractTrait' => $vendorDir . '/symfony/cache/Traits/AbstractTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\ApcuTrait' => $vendorDir . '/symfony/cache/Traits/ApcuTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\ArrayTrait' => $vendorDir . '/symfony/cache/Traits/ArrayTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\DoctrineTrait' => $vendorDir . '/symfony/cache/Traits/DoctrineTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => $vendorDir . '/symfony/cache/Traits/AbstractAdapterTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\ContractsTrait' => $vendorDir . '/symfony/cache/Traits/ContractsTrait.php',
'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemCommonTrait.php',
'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\MemcachedTrait' => $vendorDir . '/symfony/cache/Traits/MemcachedTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\PdoTrait' => $vendorDir . '/symfony/cache/Traits/PdoTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\PhpArrayTrait' => $vendorDir . '/symfony/cache/Traits/PhpArrayTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\PhpFilesTrait' => $vendorDir . '/symfony/cache/Traits/PhpFilesTrait.php',
'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => $vendorDir . '/symfony/cache/Traits/ProxyTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterNodeProxy.php',
+ 'Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterProxy.php',
'Symfony\\Component\\Cache\\Traits\\RedisProxy' => $vendorDir . '/symfony/cache/Traits/RedisProxy.php',
'Symfony\\Component\\Cache\\Traits\\RedisTrait' => $vendorDir . '/symfony/cache/Traits/RedisTrait.php',
- 'Symfony\\Component\\ClassLoader\\ApcClassLoader' => $vendorDir . '/symfony/class-loader/ApcClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\ClassCollectionLoader' => $vendorDir . '/symfony/class-loader/ClassCollectionLoader.php',
- 'Symfony\\Component\\ClassLoader\\ClassLoader' => $vendorDir . '/symfony/class-loader/ClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\ClassMapGenerator' => $vendorDir . '/symfony/class-loader/ClassMapGenerator.php',
- 'Symfony\\Component\\ClassLoader\\MapClassLoader' => $vendorDir . '/symfony/class-loader/MapClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\Psr4ClassLoader' => $vendorDir . '/symfony/class-loader/Psr4ClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\WinCacheClassLoader' => $vendorDir . '/symfony/class-loader/WinCacheClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\XcacheClassLoader' => $vendorDir . '/symfony/class-loader/XcacheClassLoader.php',
+ 'Symfony\\Component\\Config\\Builder\\ClassBuilder' => $vendorDir . '/symfony/config/Builder/ClassBuilder.php',
+ 'Symfony\\Component\\Config\\Builder\\ConfigBuilderGenerator' => $vendorDir . '/symfony/config/Builder/ConfigBuilderGenerator.php',
+ 'Symfony\\Component\\Config\\Builder\\ConfigBuilderGeneratorInterface' => $vendorDir . '/symfony/config/Builder/ConfigBuilderGeneratorInterface.php',
+ 'Symfony\\Component\\Config\\Builder\\ConfigBuilderInterface' => $vendorDir . '/symfony/config/Builder/ConfigBuilderInterface.php',
+ 'Symfony\\Component\\Config\\Builder\\Method' => $vendorDir . '/symfony/config/Builder/Method.php',
+ 'Symfony\\Component\\Config\\Builder\\Property' => $vendorDir . '/symfony/config/Builder/Property.php',
'Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/ConfigCache.php',
'Symfony\\Component\\Config\\ConfigCacheFactory' => $vendorDir . '/symfony/config/ConfigCacheFactory.php',
'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => $vendorDir . '/symfony/config/ConfigCacheFactoryInterface.php',
@@ -1653,6 +1638,7 @@ return array(
'Symfony\\Component\\Config\\Definition\\BooleanNode' => $vendorDir . '/symfony/config/Definition/BooleanNode.php',
'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php',
'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => $vendorDir . '/symfony/config/Definition/Builder/BuilderAwareInterface.php',
'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/EnumNodeDefinition.php',
'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ExprBuilder.php',
'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/FloatNodeDefinition.php',
@@ -1688,10 +1674,9 @@ return array(
'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => $vendorDir . '/symfony/config/Definition/PrototypedArrayNode.php',
'Symfony\\Component\\Config\\Definition\\ScalarNode' => $vendorDir . '/symfony/config/Definition/ScalarNode.php',
'Symfony\\Component\\Config\\Definition\\VariableNode' => $vendorDir . '/symfony/config/Definition/VariableNode.php',
- 'Symfony\\Component\\Config\\DependencyInjection\\ConfigCachePass' => $vendorDir . '/symfony/config/DependencyInjection/ConfigCachePass.php',
'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => $vendorDir . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php',
- 'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => $vendorDir . '/symfony/config/Exception/FileLoaderLoadException.php',
'Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => $vendorDir . '/symfony/config/Exception/FileLocatorFileNotFoundException.php',
+ 'Symfony\\Component\\Config\\Exception\\LoaderLoadException' => $vendorDir . '/symfony/config/Exception/LoaderLoadException.php',
'Symfony\\Component\\Config\\FileLocator' => $vendorDir . '/symfony/config/FileLocator.php',
'Symfony\\Component\\Config\\FileLocatorInterface' => $vendorDir . '/symfony/config/FileLocatorInterface.php',
'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => $vendorDir . '/symfony/config/Loader/DelegatingLoader.php',
@@ -1701,6 +1686,7 @@ return array(
'Symfony\\Component\\Config\\Loader\\LoaderInterface' => $vendorDir . '/symfony/config/Loader/LoaderInterface.php',
'Symfony\\Component\\Config\\Loader\\LoaderResolver' => $vendorDir . '/symfony/config/Loader/LoaderResolver.php',
'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => $vendorDir . '/symfony/config/Loader/LoaderResolverInterface.php',
+ 'Symfony\\Component\\Config\\Loader\\ParamConfigurator' => $vendorDir . '/symfony/config/Loader/ParamConfigurator.php',
'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => $vendorDir . '/symfony/config/ResourceCheckerConfigCache.php',
'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => $vendorDir . '/symfony/config/ResourceCheckerConfigCacheFactory.php',
'Symfony\\Component\\Config\\ResourceCheckerInterface' => $vendorDir . '/symfony/config/ResourceCheckerInterface.php',
@@ -1718,14 +1704,27 @@ return array(
'Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => $vendorDir . '/symfony/config/Util/Exception/XmlParsingException.php',
'Symfony\\Component\\Config\\Util\\XmlUtils' => $vendorDir . '/symfony/config/Util/XmlUtils.php',
'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
+ 'Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php',
+ 'Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php',
+ 'Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php',
'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
+ 'Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php',
+ 'Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php',
'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
+ 'Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php',
'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
'Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php',
+ 'Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php',
+ 'Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php',
+ 'Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php',
+ 'Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php',
+ 'Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php',
+ 'Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php',
'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php',
+ 'Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php',
'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php',
'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php',
@@ -1738,21 +1737,27 @@ return array(
'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php',
'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php',
'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php',
- 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => $vendorDir . '/symfony/console/Event/ConsoleExceptionEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => $vendorDir . '/symfony/console/Event/ConsoleSignalEvent.php',
'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php',
'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php',
'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php',
'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php',
'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php',
'Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php',
+ 'Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php',
+ 'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php',
'Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php',
+ 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
+ 'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php',
'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php',
'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php',
'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php',
'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php',
'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php',
@@ -1765,6 +1770,8 @@ return array(
'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php',
'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php',
'Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php',
+ 'Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php',
+ 'Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php',
'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php',
'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php',
'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php',
@@ -1781,19 +1788,26 @@ return array(
'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php',
'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php',
'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php',
'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php',
'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php',
'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php',
'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php',
+ 'Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php',
'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php',
'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php',
'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php',
+ 'Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php',
+ 'Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php',
'Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php',
'Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php',
'Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php',
'Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php',
'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php',
+ 'Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => $vendorDir . '/symfony/console/Tester/CommandCompletionTester.php',
'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php',
+ 'Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => $vendorDir . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php',
+ 'Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php',
'Symfony\\Component\\CssSelector\\CssSelectorConverter' => $vendorDir . '/symfony/css-selector/CssSelectorConverter.php',
'Symfony\\Component\\CssSelector\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/css-selector/Exception/ExceptionInterface.php',
'Symfony\\Component\\CssSelector\\Exception\\ExpressionErrorException' => $vendorDir . '/symfony/css-selector/Exception/ExpressionErrorException.php',
@@ -1842,72 +1856,67 @@ return array(
'Symfony\\Component\\CssSelector\\XPath\\Translator' => $vendorDir . '/symfony/css-selector/XPath/Translator.php',
'Symfony\\Component\\CssSelector\\XPath\\TranslatorInterface' => $vendorDir . '/symfony/css-selector/XPath/TranslatorInterface.php',
'Symfony\\Component\\CssSelector\\XPath\\XPathExpr' => $vendorDir . '/symfony/css-selector/XPath/XPathExpr.php',
- 'Symfony\\Component\\Debug\\BufferingLogger' => $vendorDir . '/symfony/debug/BufferingLogger.php',
- 'Symfony\\Component\\Debug\\Debug' => $vendorDir . '/symfony/debug/Debug.php',
- 'Symfony\\Component\\Debug\\DebugClassLoader' => $vendorDir . '/symfony/debug/DebugClassLoader.php',
- 'Symfony\\Component\\Debug\\ErrorHandler' => $vendorDir . '/symfony/debug/ErrorHandler.php',
- 'Symfony\\Component\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/debug/ExceptionHandler.php',
- 'Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/debug/Exception/ClassNotFoundException.php',
- 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => $vendorDir . '/symfony/debug/Exception/ContextErrorException.php',
- 'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => $vendorDir . '/symfony/debug/Exception/FatalErrorException.php',
- 'Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => $vendorDir . '/symfony/debug/Exception/FatalThrowableError.php',
- 'Symfony\\Component\\Debug\\Exception\\FlattenException' => $vendorDir . '/symfony/debug/Exception/FlattenException.php',
- 'Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => $vendorDir . '/symfony/debug/Exception/OutOfMemoryException.php',
- 'Symfony\\Component\\Debug\\Exception\\SilencedErrorContext' => $vendorDir . '/symfony/debug/Exception/SilencedErrorContext.php',
- 'Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => $vendorDir . '/symfony/debug/Exception/UndefinedFunctionException.php',
- 'Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => $vendorDir . '/symfony/debug/Exception/UndefinedMethodException.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => $vendorDir . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php',
'Symfony\\Component\\DependencyInjection\\Alias' => $vendorDir . '/symfony/dependency-injection/Alias.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\AbstractArgument' => $vendorDir . '/symfony/dependency-injection/Argument/AbstractArgument.php',
'Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => $vendorDir . '/symfony/dependency-injection/Argument/ArgumentInterface.php',
'Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => $vendorDir . '/symfony/dependency-injection/Argument/BoundArgument.php',
'Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/IteratorArgument.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => $vendorDir . '/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php',
'Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => $vendorDir . '/symfony/dependency-injection/Argument/RewindableGenerator.php',
'Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceClosureArgument.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceLocator.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceLocatorArgument.php',
'Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/TaggedIteratorArgument.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\AsTaggedItem' => $vendorDir . '/symfony/dependency-injection/Attribute/AsTaggedItem.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\Autoconfigure' => $vendorDir . '/symfony/dependency-injection/Attribute/Autoconfigure.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\AutoconfigureTag' => $vendorDir . '/symfony/dependency-injection/Attribute/AutoconfigureTag.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator' => $vendorDir . '/symfony/dependency-injection/Attribute/TaggedIterator.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator' => $vendorDir . '/symfony/dependency-injection/Attribute/TaggedLocator.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\Target' => $vendorDir . '/symfony/dependency-injection/Attribute/Target.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\When' => $vendorDir . '/symfony/dependency-injection/Attribute/When.php',
'Symfony\\Component\\DependencyInjection\\ChildDefinition' => $vendorDir . '/symfony/dependency-injection/ChildDefinition.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AbstractRecursivePass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\AliasDeprecatedPublicServicesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\AttributeAutoconfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AutoAliasServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutoAliasServicePass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireExceptionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireExceptionPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AutowirePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowirePass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredMethodsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredPropertiesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckArgumentsValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\CheckTypeDeclarationsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => $vendorDir . '/symfony/dependency-injection/Compiler/Compiler.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => $vendorDir . '/symfony/dependency-injection/Compiler/CompilerPassInterface.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\DecoratorServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/DecoratorServicePass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\DefinitionErrorExceptionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ExtensionCompilerPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\FactoryReturnTypePass' => $vendorDir . '/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\LoggingFormatter' => $vendorDir . '/symfony/dependency-injection/Compiler/LoggingFormatter.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => $vendorDir . '/symfony/dependency-injection/Compiler/PassConfig.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => $vendorDir . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterAutoconfigureAttributesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterEnvVarProcessorsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterReverseContainerPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterServiceSubscribersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatablePassInterface' => $vendorDir . '/symfony/dependency-injection/Compiler/RepeatablePassInterface.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatedPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RepeatedPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveBindingsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveBindingsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveChildDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveClassPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveClassPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDefinitionTemplatesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveDefinitionTemplatesPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDecoratorStackPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveEnvPlaceholdersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveFactoryClassPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveHotPathPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveHotPathPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInstanceofConditionalsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNamedArgumentsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNoPreloadPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolvePrivatesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php',
@@ -1917,7 +1926,7 @@ return array(
'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php',
- 'Symfony\\Component\\DependencyInjection\\Config\\AutowireServiceResource' => $vendorDir . '/symfony/dependency-injection/Config/AutowireServiceResource.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\ValidateEnvPlaceholdersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php',
'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResource' => $vendorDir . '/symfony/dependency-injection/Config/ContainerParametersResource.php',
'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResourceChecker' => $vendorDir . '/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php',
'Symfony\\Component\\DependencyInjection\\Container' => $vendorDir . '/symfony/dependency-injection/Container.php',
@@ -1926,13 +1935,14 @@ return array(
'Symfony\\Component\\DependencyInjection\\ContainerBuilder' => $vendorDir . '/symfony/dependency-injection/ContainerBuilder.php',
'Symfony\\Component\\DependencyInjection\\ContainerInterface' => $vendorDir . '/symfony/dependency-injection/ContainerInterface.php',
'Symfony\\Component\\DependencyInjection\\Definition' => $vendorDir . '/symfony/dependency-injection/Definition.php',
- 'Symfony\\Component\\DependencyInjection\\DefinitionDecorator' => $vendorDir . '/symfony/dependency-injection/DefinitionDecorator.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => $vendorDir . '/symfony/dependency-injection/Dumper/Dumper.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/Dumper/DumperInterface.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/GraphvizDumper.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/PhpDumper.php',
+ 'Symfony\\Component\\DependencyInjection\\Dumper\\Preloader' => $vendorDir . '/symfony/dependency-injection/Dumper/Preloader.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/XmlDumper.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/YamlDumper.php',
+ 'Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => $vendorDir . '/symfony/dependency-injection/EnvVarLoaderInterface.php',
'Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => $vendorDir . '/symfony/dependency-injection/EnvVarProcessor.php',
'Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => $vendorDir . '/symfony/dependency-injection/EnvVarProcessorInterface.php',
'Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => $vendorDir . '/symfony/dependency-injection/Exception/AutowiringFailedException.php',
@@ -1941,6 +1951,7 @@ return array(
'Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => $vendorDir . '/symfony/dependency-injection/Exception/EnvParameterException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/dependency-injection/Exception/ExceptionInterface.php',
'Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/dependency-injection/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => $vendorDir . '/symfony/dependency-injection/Exception/InvalidParameterTypeException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $vendorDir . '/symfony/dependency-injection/Exception/LogicException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/dependency-injection/Exception/OutOfBoundsException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php',
@@ -1963,8 +1974,10 @@ return array(
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AliasConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php',
+ 'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ClosureReferenceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ContainerConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\DefaultsConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php',
+ 'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\EnvConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InlineServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InstanceofConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ParametersConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php',
@@ -1999,45 +2012,72 @@ return array(
'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/XmlFileLoader.php',
'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/YamlFileLoader.php',
'Symfony\\Component\\DependencyInjection\\Parameter' => $vendorDir . '/symfony/dependency-injection/Parameter.php',
+ 'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ContainerBag.php',
+ 'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBag.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php',
'Symfony\\Component\\DependencyInjection\\Reference' => $vendorDir . '/symfony/dependency-injection/Reference.php',
- 'Symfony\\Component\\DependencyInjection\\ResettableContainerInterface' => $vendorDir . '/symfony/dependency-injection/ResettableContainerInterface.php',
+ 'Symfony\\Component\\DependencyInjection\\ReverseContainer' => $vendorDir . '/symfony/dependency-injection/ReverseContainer.php',
'Symfony\\Component\\DependencyInjection\\ServiceLocator' => $vendorDir . '/symfony/dependency-injection/ServiceLocator.php',
- 'Symfony\\Component\\DependencyInjection\\ServiceSubscriberInterface' => $vendorDir . '/symfony/dependency-injection/ServiceSubscriberInterface.php',
'Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => $vendorDir . '/symfony/dependency-injection/TaggedContainerInterface.php',
'Symfony\\Component\\DependencyInjection\\TypedReference' => $vendorDir . '/symfony/dependency-injection/TypedReference.php',
'Symfony\\Component\\DependencyInjection\\Variable' => $vendorDir . '/symfony/dependency-injection/Variable.php',
+ 'Symfony\\Component\\Dotenv\\Command\\DebugCommand' => $vendorDir . '/symfony/dotenv/Command/DebugCommand.php',
+ 'Symfony\\Component\\Dotenv\\Command\\DotenvDumpCommand' => $vendorDir . '/symfony/dotenv/Command/DotenvDumpCommand.php',
'Symfony\\Component\\Dotenv\\Dotenv' => $vendorDir . '/symfony/dotenv/Dotenv.php',
'Symfony\\Component\\Dotenv\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/dotenv/Exception/ExceptionInterface.php',
'Symfony\\Component\\Dotenv\\Exception\\FormatException' => $vendorDir . '/symfony/dotenv/Exception/FormatException.php',
'Symfony\\Component\\Dotenv\\Exception\\FormatExceptionContext' => $vendorDir . '/symfony/dotenv/Exception/FormatExceptionContext.php',
'Symfony\\Component\\Dotenv\\Exception\\PathException' => $vendorDir . '/symfony/dotenv/Exception/PathException.php',
- 'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ContainerAwareEventDispatcher.php',
+ 'Symfony\\Component\\ErrorHandler\\BufferingLogger' => $vendorDir . '/symfony/error-handler/BufferingLogger.php',
+ 'Symfony\\Component\\ErrorHandler\\Debug' => $vendorDir . '/symfony/error-handler/Debug.php',
+ 'Symfony\\Component\\ErrorHandler\\DebugClassLoader' => $vendorDir . '/symfony/error-handler/DebugClassLoader.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorHandler' => $vendorDir . '/symfony/error-handler/ErrorHandler.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => $vendorDir . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => $vendorDir . '/symfony/error-handler/Error/ClassNotFoundError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\FatalError' => $vendorDir . '/symfony/error-handler/Error/FatalError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => $vendorDir . '/symfony/error-handler/Error/OutOfMemoryError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => $vendorDir . '/symfony/error-handler/Error/UndefinedFunctionError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => $vendorDir . '/symfony/error-handler/Error/UndefinedMethodError.php',
+ 'Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => $vendorDir . '/symfony/error-handler/Exception/FlattenException.php',
+ 'Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => $vendorDir . '/symfony/error-handler/Exception/SilencedErrorContext.php',
+ 'Symfony\\Component\\ErrorHandler\\Internal\\TentativeTypes' => $vendorDir . '/symfony/error-handler/Internal/TentativeTypes.php',
+ 'Symfony\\Component\\ErrorHandler\\ThrowableUtils' => $vendorDir . '/symfony/error-handler/ThrowableUtils.php',
+ 'Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => $vendorDir . '/symfony/event-dispatcher/Attribute/AsEventListener.php',
'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php',
- 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php',
'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php',
+ 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php',
'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php',
- 'Symfony\\Component\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher/Event.php',
'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php',
'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/EventDispatcherInterface.php',
'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php',
'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php',
'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php',
+ 'Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => $vendorDir . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php',
'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php',
'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php',
'Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php',
'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php',
'Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php',
- 'Symfony\\Component\\Filesystem\\LockHandler' => $vendorDir . '/symfony/filesystem/LockHandler.php',
+ 'Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php',
'Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php',
'Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php',
'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php',
'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php',
- 'Symfony\\Component\\Finder\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/finder/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php',
'Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php',
+ 'Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php',
'Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php',
'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php',
@@ -2046,42 +2086,49 @@ return array(
'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php',
- 'Symfony\\Component\\Finder\\Iterator\\FilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilterIterator.php',
+ 'Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php',
'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php',
'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php',
+ 'Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php',
'Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php',
'Symfony\\Component\\HttpFoundation\\AcceptHeader' => $vendorDir . '/symfony/http-foundation/AcceptHeader.php',
'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => $vendorDir . '/symfony/http-foundation/AcceptHeaderItem.php',
- 'Symfony\\Component\\HttpFoundation\\ApacheRequest' => $vendorDir . '/symfony/http-foundation/ApacheRequest.php',
'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => $vendorDir . '/symfony/http-foundation/BinaryFileResponse.php',
'Symfony\\Component\\HttpFoundation\\Cookie' => $vendorDir . '/symfony/http-foundation/Cookie.php',
+ 'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => $vendorDir . '/symfony/http-foundation/Exception/BadRequestException.php',
'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => $vendorDir . '/symfony/http-foundation/Exception/ConflictingHeadersException.php',
+ 'Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => $vendorDir . '/symfony/http-foundation/Exception/JsonException.php',
'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => $vendorDir . '/symfony/http-foundation/Exception/RequestExceptionInterface.php',
+ 'Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException' => $vendorDir . '/symfony/http-foundation/Exception/SessionNotFoundException.php',
'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => $vendorDir . '/symfony/http-foundation/Exception/SuspiciousOperationException.php',
'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => $vendorDir . '/symfony/http-foundation/ExpressionRequestMatcher.php',
'Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/FileBag.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/http-foundation/File/Exception/AccessDeniedException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/ExtensionFileException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileNotFoundException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FormSizeFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/IniSizeFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/PartialFileException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => $vendorDir . '/symfony/http-foundation/File/Exception/UploadException.php',
'Symfony\\Component\\HttpFoundation\\File\\File' => $vendorDir . '/symfony/http-foundation/File/File.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/ExtensionGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesserInterface' => $vendorDir . '/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileBinaryMimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileinfoMimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeExtensionGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesserInterface' => $vendorDir . '/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php',
'Symfony\\Component\\HttpFoundation\\File\\Stream' => $vendorDir . '/symfony/http-foundation/File/Stream.php',
'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => $vendorDir . '/symfony/http-foundation/File/UploadedFile.php',
'Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/HeaderBag.php',
+ 'Symfony\\Component\\HttpFoundation\\HeaderUtils' => $vendorDir . '/symfony/http-foundation/HeaderUtils.php',
+ 'Symfony\\Component\\HttpFoundation\\InputBag' => $vendorDir . '/symfony/http-foundation/InputBag.php',
'Symfony\\Component\\HttpFoundation\\IpUtils' => $vendorDir . '/symfony/http-foundation/IpUtils.php',
'Symfony\\Component\\HttpFoundation\\JsonResponse' => $vendorDir . '/symfony/http-foundation/JsonResponse.php',
'Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/ParameterBag.php',
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => $vendorDir . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php',
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => $vendorDir . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php',
'Symfony\\Component\\HttpFoundation\\RedirectResponse' => $vendorDir . '/symfony/http-foundation/RedirectResponse.php',
'Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Request.php',
'Symfony\\Component\\HttpFoundation\\RequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher.php',
@@ -2099,28 +2146,39 @@ return array(
'Symfony\\Component\\HttpFoundation\\Session\\Session' => $vendorDir . '/symfony/http-foundation/Session/Session.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionBagInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => $vendorDir . '/symfony/http-foundation/Session/SessionBagProxy.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionFactory' => $vendorDir . '/symfony/http-foundation/Session/SessionFactory.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionFactoryInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionFactoryInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => $vendorDir . '/symfony/http-foundation/Session/SessionUtils.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcacheSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\WriteCheckSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => $vendorDir . '/symfony/http-foundation/Session/Storage/MetadataBag.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\NativeProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\ServiceSessionFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/ServiceSessionFactory.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageFactoryInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php',
'Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/StreamedResponse.php',
+ 'Symfony\\Component\\HttpFoundation\\UrlHelper' => $vendorDir . '/symfony/http-foundation/UrlHelper.php',
+ 'Symfony\\Component\\HttpKernel\\Attribute\\ArgumentInterface' => $vendorDir . '/symfony/http-kernel/Attribute/ArgumentInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Attribute\\AsController' => $vendorDir . '/symfony/http-kernel/Attribute/AsController.php',
'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => $vendorDir . '/symfony/http-kernel/Bundle/Bundle.php',
'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => $vendorDir . '/symfony/http-kernel/Bundle/BundleInterface.php',
'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => $vendorDir . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php',
@@ -2130,8 +2188,6 @@ return array(
'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php',
'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php',
'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php',
- 'Symfony\\Component\\HttpKernel\\Client' => $vendorDir . '/symfony/http-kernel/Client.php',
- 'Symfony\\Component\\HttpKernel\\Config\\EnvParametersResource' => $vendorDir . '/symfony/http-kernel/Config/EnvParametersResource.php',
'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => $vendorDir . '/symfony/http-kernel/Config/FileLocator.php',
'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php',
'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php',
@@ -2139,16 +2195,19 @@ return array(
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php',
+ 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php',
+ 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php',
'Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ContainerControllerResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => $vendorDir . '/symfony/http-kernel/Controller/ControllerReference.php',
'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolverInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => $vendorDir . '/symfony/http-kernel/Controller/ErrorController.php',
'Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableControllerResolver.php',
'Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php',
@@ -2164,11 +2223,9 @@ return array(
'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RequestDataCollector.php',
'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RouterDataCollector.php',
'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/TimeDataCollector.php',
- 'Symfony\\Component\\HttpKernel\\DataCollector\\Util\\ValueExporter' => $vendorDir . '/symfony/http-kernel/DataCollector/Util/ValueExporter.php',
'Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => $vendorDir . '/symfony/http-kernel/Debug/FileLinkFormatter.php',
'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php',
- 'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddClassesToCachePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/AddClassesToCachePass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/Extension.php',
@@ -2177,6 +2234,7 @@ return array(
'Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LoggerPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php',
+ 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php',
@@ -2184,35 +2242,37 @@ return array(
'Symfony\\Component\\HttpKernel\\EventListener\\AbstractTestSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/AbstractTestSessionListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => $vendorDir . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => $vendorDir . '/symfony/http-kernel/EventListener/DebugHandlersListener.php',
+ 'Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => $vendorDir . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => $vendorDir . '/symfony/http-kernel/EventListener/DumpListener.php',
- 'Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener' => $vendorDir . '/symfony/http-kernel/EventListener/ExceptionListener.php',
+ 'Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => $vendorDir . '/symfony/http-kernel/EventListener/ErrorListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => $vendorDir . '/symfony/http-kernel/EventListener/FragmentListener.php',
+ 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleAwareListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => $vendorDir . '/symfony/http-kernel/EventListener/ProfilerListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/ResponseListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => $vendorDir . '/symfony/http-kernel/EventListener/RouterListener.php',
- 'Symfony\\Component\\HttpKernel\\EventListener\\SaveSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/SaveSessionListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/SessionListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/StreamedResponseListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => $vendorDir . '/symfony/http-kernel/EventListener/SurrogateListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/TestSessionListener.php',
- 'Symfony\\Component\\HttpKernel\\EventListener\\TranslatorListener' => $vendorDir . '/symfony/http-kernel/EventListener/TranslatorListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => $vendorDir . '/symfony/http-kernel/EventListener/ValidateRequestListener.php',
- 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerArgumentsEvent' => $vendorDir . '/symfony/http-kernel/Event/FilterControllerArgumentsEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent' => $vendorDir . '/symfony/http-kernel/Event/FilterControllerEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/FilterResponseEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => $vendorDir . '/symfony/http-kernel/Event/ExceptionEvent.php',
'Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => $vendorDir . '/symfony/http-kernel/Event/FinishRequestEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/GetResponseEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent' => $vendorDir . '/symfony/http-kernel/Event/GetResponseForControllerResultEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent' => $vendorDir . '/symfony/http-kernel/Event/GetResponseForExceptionEvent.php',
'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => $vendorDir . '/symfony/http-kernel/Event/KernelEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/PostResponseEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => $vendorDir . '/symfony/http-kernel/Event/RequestEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/ResponseEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => $vendorDir . '/symfony/http-kernel/Event/TerminateEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => $vendorDir . '/symfony/http-kernel/Event/ViewEvent.php',
'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Exception/BadRequestHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ConflictHttpException.php',
+ 'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => $vendorDir . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php',
'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Exception/GoneHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Exception/HttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Exception/HttpExceptionInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Exception\\InvalidMetadataException' => $vendorDir . '/symfony/http-kernel/Exception/InvalidMetadataException.php',
'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php',
@@ -2222,12 +2282,15 @@ return array(
'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => $vendorDir . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php',
+ 'Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => $vendorDir . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php',
'Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php',
'Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentHandler.php',
'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGenerator' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentUriGenerator.php',
+ 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGeneratorInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php',
'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php',
@@ -2242,7 +2305,9 @@ return array(
'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/StoreInterface.php',
'Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => $vendorDir . '/symfony/http-kernel/HttpCache/SubRequestHandler.php',
'Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/SurrogateInterface.php',
+ 'Symfony\\Component\\HttpKernel\\HttpClientKernel' => $vendorDir . '/symfony/http-kernel/HttpClientKernel.php',
'Symfony\\Component\\HttpKernel\\HttpKernel' => $vendorDir . '/symfony/http-kernel/HttpKernel.php',
+ 'Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => $vendorDir . '/symfony/http-kernel/HttpKernelBrowser.php',
'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => $vendorDir . '/symfony/http-kernel/HttpKernelInterface.php',
'Symfony\\Component\\HttpKernel\\Kernel' => $vendorDir . '/symfony/http-kernel/Kernel.php',
'Symfony\\Component\\HttpKernel\\KernelEvents' => $vendorDir . '/symfony/http-kernel/KernelEvents.php',
@@ -2256,45 +2321,55 @@ return array(
'Symfony\\Component\\HttpKernel\\RebootableInterface' => $vendorDir . '/symfony/http-kernel/RebootableInterface.php',
'Symfony\\Component\\HttpKernel\\TerminableInterface' => $vendorDir . '/symfony/http-kernel/TerminableInterface.php',
'Symfony\\Component\\HttpKernel\\UriSigner' => $vendorDir . '/symfony/http-kernel/UriSigner.php',
+ 'Symfony\\Component\\Routing\\Alias' => $vendorDir . '/symfony/routing/Alias.php',
'Symfony\\Component\\Routing\\Annotation\\Route' => $vendorDir . '/symfony/routing/Annotation/Route.php',
'Symfony\\Component\\Routing\\CompiledRoute' => $vendorDir . '/symfony/routing/CompiledRoute.php',
'Symfony\\Component\\Routing\\DependencyInjection\\RoutingResolverPass' => $vendorDir . '/symfony/routing/DependencyInjection/RoutingResolverPass.php',
'Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/routing/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Routing\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/routing/Exception/InvalidArgumentException.php',
'Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => $vendorDir . '/symfony/routing/Exception/InvalidParameterException.php',
'Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => $vendorDir . '/symfony/routing/Exception/MethodNotAllowedException.php',
'Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => $vendorDir . '/symfony/routing/Exception/MissingMandatoryParametersException.php',
'Symfony\\Component\\Routing\\Exception\\NoConfigurationException' => $vendorDir . '/symfony/routing/Exception/NoConfigurationException.php',
'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => $vendorDir . '/symfony/routing/Exception/ResourceNotFoundException.php',
+ 'Symfony\\Component\\Routing\\Exception\\RouteCircularReferenceException' => $vendorDir . '/symfony/routing/Exception/RouteCircularReferenceException.php',
'Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => $vendorDir . '/symfony/routing/Exception/RouteNotFoundException.php',
+ 'Symfony\\Component\\Routing\\Exception\\RuntimeException' => $vendorDir . '/symfony/routing/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator' => $vendorDir . '/symfony/routing/Generator/CompiledUrlGenerator.php',
'Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => $vendorDir . '/symfony/routing/Generator/ConfigurableRequirementsInterface.php',
+ 'Symfony\\Component\\Routing\\Generator\\Dumper\\CompiledUrlGeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php',
'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumper.php',
'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php',
- 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php',
'Symfony\\Component\\Routing\\Generator\\UrlGenerator' => $vendorDir . '/symfony/routing/Generator/UrlGenerator.php',
'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => $vendorDir . '/symfony/routing/Generator/UrlGeneratorInterface.php',
'Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationClassLoader.php',
'Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationDirectoryLoader.php',
'Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationFileLoader.php',
'Symfony\\Component\\Routing\\Loader\\ClosureLoader' => $vendorDir . '/symfony/routing/Loader/ClosureLoader.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\AliasConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/AliasConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\CollectionConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/CollectionConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\ImportConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/ImportConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\RouteConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/RouteConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/RoutingConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\AddTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/AddTrait.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\HostTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/HostTrait.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\LocalizedRouteTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\PrefixTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\RouteTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/RouteTrait.php',
- 'Symfony\\Component\\Routing\\Loader\\DependencyInjection\\ServiceRouterLoader' => $vendorDir . '/symfony/routing/Loader/DependencyInjection/ServiceRouterLoader.php',
+ 'Symfony\\Component\\Routing\\Loader\\ContainerLoader' => $vendorDir . '/symfony/routing/Loader/ContainerLoader.php',
'Symfony\\Component\\Routing\\Loader\\DirectoryLoader' => $vendorDir . '/symfony/routing/Loader/DirectoryLoader.php',
'Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/routing/Loader/GlobFileLoader.php',
- 'Symfony\\Component\\Routing\\Loader\\ObjectRouteLoader' => $vendorDir . '/symfony/routing/Loader/ObjectRouteLoader.php',
+ 'Symfony\\Component\\Routing\\Loader\\ObjectLoader' => $vendorDir . '/symfony/routing/Loader/ObjectLoader.php',
'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/routing/Loader/PhpFileLoader.php',
'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/routing/Loader/XmlFileLoader.php',
'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/routing/Loader/YamlFileLoader.php',
- 'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/DumperCollection.php',
- 'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperRoute' => $vendorDir . '/symfony/routing/Matcher/Dumper/DumperRoute.php',
+ 'Symfony\\Component\\Routing\\Matcher\\CompiledUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/CompiledUrlMatcher.php',
+ 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php',
+ 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherTrait' => $vendorDir . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php',
'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumper.php',
'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php',
- 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php',
'Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php',
+ 'Symfony\\Component\\Routing\\Matcher\\ExpressionLanguageProvider' => $vendorDir . '/symfony/routing/Matcher/ExpressionLanguageProvider.php',
'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcher.php',
'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php',
'Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RequestMatcherInterface.php',
@@ -2314,6 +2389,20 @@ return array(
'Symfony\\Component\\Stopwatch\\Stopwatch' => $vendorDir . '/symfony/stopwatch/Stopwatch.php',
'Symfony\\Component\\Stopwatch\\StopwatchEvent' => $vendorDir . '/symfony/stopwatch/StopwatchEvent.php',
'Symfony\\Component\\Stopwatch\\StopwatchPeriod' => $vendorDir . '/symfony/stopwatch/StopwatchPeriod.php',
+ 'Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php',
+ 'Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php',
+ 'Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php',
+ 'Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php',
+ 'Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php',
+ 'Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php',
+ 'Symfony\\Component\\String\\Inflector\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php',
+ 'Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php',
+ 'Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php',
+ 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php',
+ 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php',
+ 'Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php',
'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => $vendorDir . '/symfony/var-dumper/Caster/AmqpCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => $vendorDir . '/symfony/var-dumper/Caster/ArgsStub.php',
'Symfony\\Component\\VarDumper\\Caster\\Caster' => $vendorDir . '/symfony/var-dumper/Caster/Caster.php',
@@ -2324,13 +2413,23 @@ return array(
'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => $vendorDir . '/symfony/var-dumper/Caster/DOMCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => $vendorDir . '/symfony/var-dumper/Caster/DateCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => $vendorDir . '/symfony/var-dumper/Caster/DoctrineCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => $vendorDir . '/symfony/var-dumper/Caster/DsCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => $vendorDir . '/symfony/var-dumper/Caster/DsPairStub.php',
'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => $vendorDir . '/symfony/var-dumper/Caster/EnumStub.php',
'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ExceptionCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\FiberCaster' => $vendorDir . '/symfony/var-dumper/Caster/FiberCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => $vendorDir . '/symfony/var-dumper/Caster/FrameStub.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => $vendorDir . '/symfony/var-dumper/Caster/GmpCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => $vendorDir . '/symfony/var-dumper/Caster/ImagineCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => $vendorDir . '/symfony/var-dumper/Caster/ImgStub.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => $vendorDir . '/symfony/var-dumper/Caster/IntlCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => $vendorDir . '/symfony/var-dumper/Caster/LinkStub.php',
- 'Symfony\\Component\\VarDumper\\Caster\\MongoCaster' => $vendorDir . '/symfony/var-dumper/Caster/MongoCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => $vendorDir . '/symfony/var-dumper/Caster/MemcachedCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\MysqliCaster' => $vendorDir . '/symfony/var-dumper/Caster/MysqliCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => $vendorDir . '/symfony/var-dumper/Caster/PdoCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => $vendorDir . '/symfony/var-dumper/Caster/PgSqlCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => $vendorDir . '/symfony/var-dumper/Caster/ProxyManagerCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => $vendorDir . '/symfony/var-dumper/Caster/RdKafkaCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => $vendorDir . '/symfony/var-dumper/Caster/RedisCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ReflectionCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/ResourceCaster.php',
@@ -2338,6 +2437,7 @@ return array(
'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => $vendorDir . '/symfony/var-dumper/Caster/StubCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => $vendorDir . '/symfony/var-dumper/Caster/SymfonyCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => $vendorDir . '/symfony/var-dumper/Caster/TraceStub.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => $vendorDir . '/symfony/var-dumper/Caster/UuidCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlReaderCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlResourceCaster.php',
'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => $vendorDir . '/symfony/var-dumper/Cloner/AbstractCloner.php',
@@ -2347,12 +2447,34 @@ return array(
'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => $vendorDir . '/symfony/var-dumper/Cloner/DumperInterface.php',
'Symfony\\Component\\VarDumper\\Cloner\\Stub' => $vendorDir . '/symfony/var-dumper/Cloner/Stub.php',
'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => $vendorDir . '/symfony/var-dumper/Cloner/VarCloner.php',
+ 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php',
+ 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php',
+ 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php',
+ 'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => $vendorDir . '/symfony/var-dumper/Command/ServerDumpCommand.php',
'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => $vendorDir . '/symfony/var-dumper/Dumper/AbstractDumper.php',
'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => $vendorDir . '/symfony/var-dumper/Dumper/CliDumper.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ContextualizedDumper.php',
'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => $vendorDir . '/symfony/var-dumper/Dumper/DataDumperInterface.php',
'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => $vendorDir . '/symfony/var-dumper/Dumper/HtmlDumper.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ServerDumper.php',
'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => $vendorDir . '/symfony/var-dumper/Exception/ThrowingCasterException.php',
+ 'Symfony\\Component\\VarDumper\\Server\\Connection' => $vendorDir . '/symfony/var-dumper/Server/Connection.php',
+ 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => $vendorDir . '/symfony/var-dumper/Server/DumpServer.php',
'Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.php',
+ 'Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/var-exporter/Exception/ClassNotFoundException.php',
+ 'Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/var-exporter/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => $vendorDir . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php',
+ 'Symfony\\Component\\VarExporter\\Instantiator' => $vendorDir . '/symfony/var-exporter/Instantiator.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Exporter' => $vendorDir . '/symfony/var-exporter/Internal/Exporter.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Hydrator' => $vendorDir . '/symfony/var-exporter/Internal/Hydrator.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Reference' => $vendorDir . '/symfony/var-exporter/Internal/Reference.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Registry' => $vendorDir . '/symfony/var-exporter/Internal/Registry.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Values' => $vendorDir . '/symfony/var-exporter/Internal/Values.php',
+ 'Symfony\\Component\\VarExporter\\VarExporter' => $vendorDir . '/symfony/var-exporter/VarExporter.php',
'Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php',
'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php',
'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php',
@@ -2365,25 +2487,37 @@ return array(
'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php',
'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php',
'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php',
- 'Symfony\\Polyfill\\Apcu\\Apcu' => $vendorDir . '/symfony/polyfill-apcu/Apcu.php',
+ 'Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/cache-contracts/CacheInterface.php',
+ 'Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/cache-contracts/CacheTrait.php',
+ 'Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/cache-contracts/CallbackInterface.php',
+ 'Symfony\\Contracts\\Cache\\ItemInterface' => $vendorDir . '/symfony/cache-contracts/ItemInterface.php',
+ 'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => $vendorDir . '/symfony/cache-contracts/TagAwareCacheInterface.php',
+ 'Symfony\\Contracts\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher-contracts/Event.php',
+ 'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php',
+ 'Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php',
+ 'Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php',
+ 'Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php',
+ 'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php',
+ 'Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php',
+ 'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php',
+ 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php',
+ 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/translation-contracts/LocaleAwareInterface.php',
+ 'Symfony\\Contracts\\Translation\\TranslatableInterface' => $vendorDir . '/symfony/translation-contracts/TranslatableInterface.php',
+ 'Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation-contracts/TranslatorInterface.php',
+ 'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php',
'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php',
'Symfony\\Polyfill\\Intl\\Idn\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php',
'Symfony\\Polyfill\\Intl\\Idn\\Info' => $vendorDir . '/symfony/polyfill-intl-idn/Info.php',
'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php',
'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php',
'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php',
'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
- 'Symfony\\Polyfill\\Php56\\Php56' => $vendorDir . '/symfony/polyfill-php56/Php56.php',
- 'Symfony\\Polyfill\\Php70\\Php70' => $vendorDir . '/symfony/polyfill-php70/Php70.php',
'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php',
- 'Symfony\\Polyfill\\Util\\Binary' => $vendorDir . '/symfony/polyfill-util/Binary.php',
- 'Symfony\\Polyfill\\Util\\BinaryNoFuncOverload' => $vendorDir . '/symfony/polyfill-util/BinaryNoFuncOverload.php',
- 'Symfony\\Polyfill\\Util\\BinaryOnFuncOverload' => $vendorDir . '/symfony/polyfill-util/BinaryOnFuncOverload.php',
- 'Symfony\\Polyfill\\Util\\TestListener' => $vendorDir . '/symfony/polyfill-util/TestListener.php',
- 'Symfony\\Polyfill\\Util\\TestListenerForV5' => $vendorDir . '/symfony/polyfill-util/TestListenerForV5.php',
- 'Symfony\\Polyfill\\Util\\TestListenerForV6' => $vendorDir . '/symfony/polyfill-util/TestListenerForV6.php',
- 'Symfony\\Polyfill\\Util\\TestListenerForV7' => $vendorDir . '/symfony/polyfill-util/TestListenerForV7.php',
- 'Symfony\\Polyfill\\Util\\TestListenerTrait' => $vendorDir . '/symfony/polyfill-util/TestListenerTrait.php',
+ 'Symfony\\Polyfill\\Php73\\Php73' => $vendorDir . '/symfony/polyfill-php73/Php73.php',
+ 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php',
+ 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php',
+ 'Symfony\\Polyfill\\Php81\\Php81' => $vendorDir . '/symfony/polyfill-php81/Php81.php',
'SynchroExceptionNotStarted' => $baseDir . '/application/exceptions/SynchroExceptionNotStarted.php',
'System' => $vendorDir . '/pear/pear-core-minimal/src/System.php',
'TCPDF' => $vendorDir . '/combodo/tcpdf/tcpdf.php',
@@ -2397,7 +2531,7 @@ return array(
'TCPDF_IMPORT' => $vendorDir . '/combodo/tcpdf/tcpdf_import.php',
'TCPDF_PARSER' => $vendorDir . '/combodo/tcpdf/tcpdf_parser.php',
'TCPDF_STATIC' => $vendorDir . '/combodo/tcpdf/include/tcpdf_static.php',
- 'TabManager' => $baseDir . '/sources/application/WebPage/TabManager.php',
+ 'TabManager' => $baseDir . '/sources/Application/WebPage/TabManager.php',
'TabularBulkExport' => $baseDir . '/core/tabularbulkexport.class.inc.php',
'TagSetFieldData' => $baseDir . '/core/tagsetfield.class.inc.php',
'TemplateMenuNode' => $baseDir . '/application/menunode.class.inc.php',
@@ -2436,13 +2570,13 @@ return array(
'Twig\\Error\\RuntimeError' => $vendorDir . '/twig/twig/src/Error/RuntimeError.php',
'Twig\\Error\\SyntaxError' => $vendorDir . '/twig/twig/src/Error/SyntaxError.php',
'Twig\\ExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser.php',
+ 'Twig\\ExtensionSet' => $vendorDir . '/twig/twig/src/ExtensionSet.php',
'Twig\\Extension\\AbstractExtension' => $vendorDir . '/twig/twig/src/Extension/AbstractExtension.php',
'Twig\\Extension\\CoreExtension' => $vendorDir . '/twig/twig/src/Extension/CoreExtension.php',
'Twig\\Extension\\DebugExtension' => $vendorDir . '/twig/twig/src/Extension/DebugExtension.php',
'Twig\\Extension\\EscaperExtension' => $vendorDir . '/twig/twig/src/Extension/EscaperExtension.php',
'Twig\\Extension\\ExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/ExtensionInterface.php',
'Twig\\Extension\\GlobalsInterface' => $vendorDir . '/twig/twig/src/Extension/GlobalsInterface.php',
- 'Twig\\Extension\\InitRuntimeInterface' => $vendorDir . '/twig/twig/src/Extension/InitRuntimeInterface.php',
'Twig\\Extension\\OptimizerExtension' => $vendorDir . '/twig/twig/src/Extension/OptimizerExtension.php',
'Twig\\Extension\\ProfilerExtension' => $vendorDir . '/twig/twig/src/Extension/ProfilerExtension.php',
'Twig\\Extension\\RuntimeExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
@@ -2453,14 +2587,13 @@ return array(
'Twig\\Lexer' => $vendorDir . '/twig/twig/src/Lexer.php',
'Twig\\Loader\\ArrayLoader' => $vendorDir . '/twig/twig/src/Loader/ArrayLoader.php',
'Twig\\Loader\\ChainLoader' => $vendorDir . '/twig/twig/src/Loader/ChainLoader.php',
- 'Twig\\Loader\\ExistsLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/ExistsLoaderInterface.php',
'Twig\\Loader\\FilesystemLoader' => $vendorDir . '/twig/twig/src/Loader/FilesystemLoader.php',
'Twig\\Loader\\LoaderInterface' => $vendorDir . '/twig/twig/src/Loader/LoaderInterface.php',
- 'Twig\\Loader\\SourceContextLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/SourceContextLoaderInterface.php',
'Twig\\Markup' => $vendorDir . '/twig/twig/src/Markup.php',
'Twig\\NodeTraverser' => $vendorDir . '/twig/twig/src/NodeTraverser.php',
'Twig\\NodeVisitor\\AbstractNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
'Twig\\NodeVisitor\\EscaperNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
+ 'Twig\\NodeVisitor\\MacroAutoImportNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php',
'Twig\\NodeVisitor\\NodeVisitorInterface' => $vendorDir . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
'Twig\\NodeVisitor\\OptimizerNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
@@ -2469,6 +2602,7 @@ return array(
'Twig\\Node\\BlockNode' => $vendorDir . '/twig/twig/src/Node/BlockNode.php',
'Twig\\Node\\BlockReferenceNode' => $vendorDir . '/twig/twig/src/Node/BlockReferenceNode.php',
'Twig\\Node\\BodyNode' => $vendorDir . '/twig/twig/src/Node/BodyNode.php',
+ 'Twig\\Node\\CheckSecurityCallNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityCallNode.php',
'Twig\\Node\\CheckSecurityNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityNode.php',
'Twig\\Node\\CheckToStringNode' => $vendorDir . '/twig/twig/src/Node/CheckToStringNode.php',
'Twig\\Node\\DeprecatedNode' => $vendorDir . '/twig/twig/src/Node/DeprecatedNode.php',
@@ -2502,6 +2636,7 @@ return array(
'Twig\\Node\\Expression\\Binary\\OrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
'Twig\\Node\\Expression\\Binary\\PowerBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
'Twig\\Node\\Expression\\Binary\\RangeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php',
'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
'Twig\\Node\\Expression\\Binary\\SubBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
'Twig\\Node\\Expression\\BlockReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
@@ -2530,6 +2665,7 @@ return array(
'Twig\\Node\\Expression\\Unary\\NegUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
'Twig\\Node\\Expression\\Unary\\NotUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
'Twig\\Node\\Expression\\Unary\\PosUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
+ 'Twig\\Node\\Expression\\VariadicExpression' => $vendorDir . '/twig/twig/src/Node/Expression/VariadicExpression.php',
'Twig\\Node\\FlushNode' => $vendorDir . '/twig/twig/src/Node/FlushNode.php',
'Twig\\Node\\ForLoopNode' => $vendorDir . '/twig/twig/src/Node/ForLoopNode.php',
'Twig\\Node\\ForNode' => $vendorDir . '/twig/twig/src/Node/ForNode.php',
@@ -2543,10 +2679,7 @@ return array(
'Twig\\Node\\NodeOutputInterface' => $vendorDir . '/twig/twig/src/Node/NodeOutputInterface.php',
'Twig\\Node\\PrintNode' => $vendorDir . '/twig/twig/src/Node/PrintNode.php',
'Twig\\Node\\SandboxNode' => $vendorDir . '/twig/twig/src/Node/SandboxNode.php',
- 'Twig\\Node\\SandboxedPrintNode' => $vendorDir . '/twig/twig/src/Node/SandboxedPrintNode.php',
'Twig\\Node\\SetNode' => $vendorDir . '/twig/twig/src/Node/SetNode.php',
- 'Twig\\Node\\SetTempNode' => $vendorDir . '/twig/twig/src/Node/SetTempNode.php',
- 'Twig\\Node\\SpacelessNode' => $vendorDir . '/twig/twig/src/Node/SpacelessNode.php',
'Twig\\Node\\TextNode' => $vendorDir . '/twig/twig/src/Node/TextNode.php',
'Twig\\Node\\WithNode' => $vendorDir . '/twig/twig/src/Node/WithNode.php',
'Twig\\Parser' => $vendorDir . '/twig/twig/src/Parser.php',
@@ -2581,7 +2714,6 @@ return array(
'Twig\\TokenParser\\DoTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DoTokenParser.php',
'Twig\\TokenParser\\EmbedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
'Twig\\TokenParser\\ExtendsTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
- 'Twig\\TokenParser\\FilterTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FilterTokenParser.php',
'Twig\\TokenParser\\FlushTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FlushTokenParser.php',
'Twig\\TokenParser\\ForTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ForTokenParser.php',
'Twig\\TokenParser\\FromTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FromTokenParser.php',
@@ -2591,7 +2723,6 @@ return array(
'Twig\\TokenParser\\MacroTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/MacroTokenParser.php',
'Twig\\TokenParser\\SandboxTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
'Twig\\TokenParser\\SetTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SetTokenParser.php',
- 'Twig\\TokenParser\\SpacelessTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SpacelessTokenParser.php',
'Twig\\TokenParser\\TokenParserInterface' => $vendorDir . '/twig/twig/src/TokenParser/TokenParserInterface.php',
'Twig\\TokenParser\\UseTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/UseTokenParser.php',
'Twig\\TokenParser\\WithTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/WithTokenParser.php',
@@ -2601,202 +2732,6 @@ return array(
'Twig\\TwigTest' => $vendorDir . '/twig/twig/src/TwigTest.php',
'Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php',
'Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php',
- 'Twig_Autoloader' => $vendorDir . '/twig/twig/lib/Twig/Autoloader.php',
- 'Twig_BaseNodeVisitor' => $vendorDir . '/twig/twig/lib/Twig/BaseNodeVisitor.php',
- 'Twig_CacheInterface' => $vendorDir . '/twig/twig/lib/Twig/CacheInterface.php',
- 'Twig_Cache_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Cache/Filesystem.php',
- 'Twig_Cache_Null' => $vendorDir . '/twig/twig/lib/Twig/Cache/Null.php',
- 'Twig_Compiler' => $vendorDir . '/twig/twig/lib/Twig/Compiler.php',
- 'Twig_CompilerInterface' => $vendorDir . '/twig/twig/lib/Twig/CompilerInterface.php',
- 'Twig_ContainerRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php',
- 'Twig_Environment' => $vendorDir . '/twig/twig/lib/Twig/Environment.php',
- 'Twig_Error' => $vendorDir . '/twig/twig/lib/Twig/Error.php',
- 'Twig_Error_Loader' => $vendorDir . '/twig/twig/lib/Twig/Error/Loader.php',
- 'Twig_Error_Runtime' => $vendorDir . '/twig/twig/lib/Twig/Error/Runtime.php',
- 'Twig_Error_Syntax' => $vendorDir . '/twig/twig/lib/Twig/Error/Syntax.php',
- 'Twig_ExistsLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/ExistsLoaderInterface.php',
- 'Twig_ExpressionParser' => $vendorDir . '/twig/twig/lib/Twig/ExpressionParser.php',
- 'Twig_Extension' => $vendorDir . '/twig/twig/lib/Twig/Extension.php',
- 'Twig_ExtensionInterface' => $vendorDir . '/twig/twig/lib/Twig/ExtensionInterface.php',
- 'Twig_Extension_Core' => $vendorDir . '/twig/twig/lib/Twig/Extension/Core.php',
- 'Twig_Extension_Debug' => $vendorDir . '/twig/twig/lib/Twig/Extension/Debug.php',
- 'Twig_Extension_Escaper' => $vendorDir . '/twig/twig/lib/Twig/Extension/Escaper.php',
- 'Twig_Extension_GlobalsInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php',
- 'Twig_Extension_InitRuntimeInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php',
- 'Twig_Extension_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/Extension/Optimizer.php',
- 'Twig_Extension_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Extension/Profiler.php',
- 'Twig_Extension_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Extension/Sandbox.php',
- 'Twig_Extension_Staging' => $vendorDir . '/twig/twig/lib/Twig/Extension/Staging.php',
- 'Twig_Extension_StringLoader' => $vendorDir . '/twig/twig/lib/Twig/Extension/StringLoader.php',
- 'Twig_FactoryRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php',
- 'Twig_FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php',
- 'Twig_Filter' => $vendorDir . '/twig/twig/lib/Twig/Filter.php',
- 'Twig_FilterCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterCallableInterface.php',
- 'Twig_FilterInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterInterface.php',
- 'Twig_Filter_Function' => $vendorDir . '/twig/twig/lib/Twig/Filter/Function.php',
- 'Twig_Filter_Method' => $vendorDir . '/twig/twig/lib/Twig/Filter/Method.php',
- 'Twig_Filter_Node' => $vendorDir . '/twig/twig/lib/Twig/Filter/Node.php',
- 'Twig_Function' => $vendorDir . '/twig/twig/lib/Twig/Function.php',
- 'Twig_FunctionCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionCallableInterface.php',
- 'Twig_FunctionInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionInterface.php',
- 'Twig_Function_Function' => $vendorDir . '/twig/twig/lib/Twig/Function/Function.php',
- 'Twig_Function_Method' => $vendorDir . '/twig/twig/lib/Twig/Function/Method.php',
- 'Twig_Function_Node' => $vendorDir . '/twig/twig/lib/Twig/Function/Node.php',
- 'Twig_Lexer' => $vendorDir . '/twig/twig/lib/Twig/Lexer.php',
- 'Twig_LexerInterface' => $vendorDir . '/twig/twig/lib/Twig/LexerInterface.php',
- 'Twig_LoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/LoaderInterface.php',
- 'Twig_Loader_Array' => $vendorDir . '/twig/twig/lib/Twig/Loader/Array.php',
- 'Twig_Loader_Chain' => $vendorDir . '/twig/twig/lib/Twig/Loader/Chain.php',
- 'Twig_Loader_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Loader/Filesystem.php',
- 'Twig_Loader_String' => $vendorDir . '/twig/twig/lib/Twig/Loader/String.php',
- 'Twig_Markup' => $vendorDir . '/twig/twig/lib/Twig/Markup.php',
- 'Twig_Node' => $vendorDir . '/twig/twig/lib/Twig/Node.php',
- 'Twig_NodeCaptureInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeCaptureInterface.php',
- 'Twig_NodeInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeInterface.php',
- 'Twig_NodeOutputInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeOutputInterface.php',
- 'Twig_NodeTraverser' => $vendorDir . '/twig/twig/lib/Twig/NodeTraverser.php',
- 'Twig_NodeVisitorInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitorInterface.php',
- 'Twig_NodeVisitor_Escaper' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php',
- 'Twig_NodeVisitor_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php',
- 'Twig_NodeVisitor_SafeAnalysis' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php',
- 'Twig_NodeVisitor_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php',
- 'Twig_Node_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/Node/AutoEscape.php',
- 'Twig_Node_Block' => $vendorDir . '/twig/twig/lib/Twig/Node/Block.php',
- 'Twig_Node_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/BlockReference.php',
- 'Twig_Node_Body' => $vendorDir . '/twig/twig/lib/Twig/Node/Body.php',
- 'Twig_Node_CheckSecurity' => $vendorDir . '/twig/twig/lib/Twig/Node/CheckSecurity.php',
- 'Twig_Node_Deprecated' => $vendorDir . '/twig/twig/lib/Twig/Node/Deprecated.php',
- 'Twig_Node_Do' => $vendorDir . '/twig/twig/lib/Twig/Node/Do.php',
- 'Twig_Node_Embed' => $vendorDir . '/twig/twig/lib/Twig/Node/Embed.php',
- 'Twig_Node_Expression' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression.php',
- 'Twig_Node_Expression_Array' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Array.php',
- 'Twig_Node_Expression_AssignName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/AssignName.php',
- 'Twig_Node_Expression_Binary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary.php',
- 'Twig_Node_Expression_Binary_Add' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php',
- 'Twig_Node_Expression_Binary_And' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php',
- 'Twig_Node_Expression_Binary_BitwiseAnd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php',
- 'Twig_Node_Expression_Binary_BitwiseOr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php',
- 'Twig_Node_Expression_Binary_BitwiseXor' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php',
- 'Twig_Node_Expression_Binary_Concat' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php',
- 'Twig_Node_Expression_Binary_Div' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php',
- 'Twig_Node_Expression_Binary_EndsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php',
- 'Twig_Node_Expression_Binary_Equal' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php',
- 'Twig_Node_Expression_Binary_FloorDiv' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php',
- 'Twig_Node_Expression_Binary_Greater' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php',
- 'Twig_Node_Expression_Binary_GreaterEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php',
- 'Twig_Node_Expression_Binary_In' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php',
- 'Twig_Node_Expression_Binary_Less' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php',
- 'Twig_Node_Expression_Binary_LessEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php',
- 'Twig_Node_Expression_Binary_Matches' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php',
- 'Twig_Node_Expression_Binary_Mod' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php',
- 'Twig_Node_Expression_Binary_Mul' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php',
- 'Twig_Node_Expression_Binary_NotEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php',
- 'Twig_Node_Expression_Binary_NotIn' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php',
- 'Twig_Node_Expression_Binary_Or' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php',
- 'Twig_Node_Expression_Binary_Power' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php',
- 'Twig_Node_Expression_Binary_Range' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php',
- 'Twig_Node_Expression_Binary_StartsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php',
- 'Twig_Node_Expression_Binary_Sub' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php',
- 'Twig_Node_Expression_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php',
- 'Twig_Node_Expression_Call' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Call.php',
- 'Twig_Node_Expression_Conditional' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Conditional.php',
- 'Twig_Node_Expression_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Constant.php',
- 'Twig_Node_Expression_ExtensionReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php',
- 'Twig_Node_Expression_Filter' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter.php',
- 'Twig_Node_Expression_Filter_Default' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php',
- 'Twig_Node_Expression_Function' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Function.php',
- 'Twig_Node_Expression_GetAttr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php',
- 'Twig_Node_Expression_MethodCall' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php',
- 'Twig_Node_Expression_Name' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Name.php',
- 'Twig_Node_Expression_NullCoalesce' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php',
- 'Twig_Node_Expression_Parent' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Parent.php',
- 'Twig_Node_Expression_TempName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/TempName.php',
- 'Twig_Node_Expression_Test' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test.php',
- 'Twig_Node_Expression_Test_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php',
- 'Twig_Node_Expression_Test_Defined' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php',
- 'Twig_Node_Expression_Test_Divisibleby' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php',
- 'Twig_Node_Expression_Test_Even' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php',
- 'Twig_Node_Expression_Test_Null' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php',
- 'Twig_Node_Expression_Test_Odd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php',
- 'Twig_Node_Expression_Test_Sameas' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php',
- 'Twig_Node_Expression_Unary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary.php',
- 'Twig_Node_Expression_Unary_Neg' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php',
- 'Twig_Node_Expression_Unary_Not' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php',
- 'Twig_Node_Expression_Unary_Pos' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php',
- 'Twig_Node_Flush' => $vendorDir . '/twig/twig/lib/Twig/Node/Flush.php',
- 'Twig_Node_For' => $vendorDir . '/twig/twig/lib/Twig/Node/For.php',
- 'Twig_Node_ForLoop' => $vendorDir . '/twig/twig/lib/Twig/Node/ForLoop.php',
- 'Twig_Node_If' => $vendorDir . '/twig/twig/lib/Twig/Node/If.php',
- 'Twig_Node_Import' => $vendorDir . '/twig/twig/lib/Twig/Node/Import.php',
- 'Twig_Node_Include' => $vendorDir . '/twig/twig/lib/Twig/Node/Include.php',
- 'Twig_Node_Macro' => $vendorDir . '/twig/twig/lib/Twig/Node/Macro.php',
- 'Twig_Node_Module' => $vendorDir . '/twig/twig/lib/Twig/Node/Module.php',
- 'Twig_Node_Print' => $vendorDir . '/twig/twig/lib/Twig/Node/Print.php',
- 'Twig_Node_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Node/Sandbox.php',
- 'Twig_Node_SandboxedPrint' => $vendorDir . '/twig/twig/lib/Twig/Node/SandboxedPrint.php',
- 'Twig_Node_Set' => $vendorDir . '/twig/twig/lib/Twig/Node/Set.php',
- 'Twig_Node_SetTemp' => $vendorDir . '/twig/twig/lib/Twig/Node/SetTemp.php',
- 'Twig_Node_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/Node/Spaceless.php',
- 'Twig_Node_Text' => $vendorDir . '/twig/twig/lib/Twig/Node/Text.php',
- 'Twig_Node_With' => $vendorDir . '/twig/twig/lib/Twig/Node/With.php',
- 'Twig_Parser' => $vendorDir . '/twig/twig/lib/Twig/Parser.php',
- 'Twig_ParserInterface' => $vendorDir . '/twig/twig/lib/Twig/ParserInterface.php',
- 'Twig_Profiler_Dumper_Base' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php',
- 'Twig_Profiler_Dumper_Blackfire' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php',
- 'Twig_Profiler_Dumper_Html' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php',
- 'Twig_Profiler_Dumper_Text' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php',
- 'Twig_Profiler_NodeVisitor_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php',
- 'Twig_Profiler_Node_EnterProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php',
- 'Twig_Profiler_Node_LeaveProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php',
- 'Twig_Profiler_Profile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Profile.php',
- 'Twig_RuntimeLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php',
- 'Twig_Sandbox_SecurityError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityError.php',
- 'Twig_Sandbox_SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php',
- 'Twig_Sandbox_SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php',
- 'Twig_Sandbox_SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php',
- 'Twig_Sandbox_SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php',
- 'Twig_Sandbox_SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php',
- 'Twig_Sandbox_SecurityPolicy' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php',
- 'Twig_Sandbox_SecurityPolicyInterface' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php',
- 'Twig_SimpleFilter' => $vendorDir . '/twig/twig/lib/Twig/SimpleFilter.php',
- 'Twig_SimpleFunction' => $vendorDir . '/twig/twig/lib/Twig/SimpleFunction.php',
- 'Twig_SimpleTest' => $vendorDir . '/twig/twig/lib/Twig/SimpleTest.php',
- 'Twig_Source' => $vendorDir . '/twig/twig/lib/Twig/Source.php',
- 'Twig_SourceContextLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php',
- 'Twig_Template' => $vendorDir . '/twig/twig/lib/Twig/Template.php',
- 'Twig_TemplateInterface' => $vendorDir . '/twig/twig/lib/Twig/TemplateInterface.php',
- 'Twig_TemplateWrapper' => $vendorDir . '/twig/twig/lib/Twig/TemplateWrapper.php',
- 'Twig_Test' => $vendorDir . '/twig/twig/lib/Twig/Test.php',
- 'Twig_TestCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/TestCallableInterface.php',
- 'Twig_TestInterface' => $vendorDir . '/twig/twig/lib/Twig/TestInterface.php',
- 'Twig_Token' => $vendorDir . '/twig/twig/lib/Twig/Token.php',
- 'Twig_TokenParser' => $vendorDir . '/twig/twig/lib/Twig/TokenParser.php',
- 'Twig_TokenParserBroker' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBroker.php',
- 'Twig_TokenParserBrokerInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBrokerInterface.php',
- 'Twig_TokenParserInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserInterface.php',
- 'Twig_TokenParser_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php',
- 'Twig_TokenParser_Block' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Block.php',
- 'Twig_TokenParser_Deprecated' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Deprecated.php',
- 'Twig_TokenParser_Do' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Do.php',
- 'Twig_TokenParser_Embed' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Embed.php',
- 'Twig_TokenParser_Extends' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Extends.php',
- 'Twig_TokenParser_Filter' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Filter.php',
- 'Twig_TokenParser_Flush' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Flush.php',
- 'Twig_TokenParser_For' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/For.php',
- 'Twig_TokenParser_From' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/From.php',
- 'Twig_TokenParser_If' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/If.php',
- 'Twig_TokenParser_Import' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Import.php',
- 'Twig_TokenParser_Include' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Include.php',
- 'Twig_TokenParser_Macro' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Macro.php',
- 'Twig_TokenParser_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Sandbox.php',
- 'Twig_TokenParser_Set' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Set.php',
- 'Twig_TokenParser_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Spaceless.php',
- 'Twig_TokenParser_Use' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Use.php',
- 'Twig_TokenParser_With' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/With.php',
- 'Twig_TokenStream' => $vendorDir . '/twig/twig/lib/Twig/TokenStream.php',
- 'Twig_Util_DeprecationCollector' => $vendorDir . '/twig/twig/lib/Twig/Util/DeprecationCollector.php',
- 'Twig_Util_TemplateDirIterator' => $vendorDir . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php',
- 'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
'UIExtKeyWidget' => $baseDir . '/application/ui.extkeywidget.class.inc.php',
'UIHTMLEditorWidget' => $baseDir . '/application/ui.htmleditorwidget.class.inc.php',
'UILinksWidget' => $baseDir . '/application/ui.linkswidget.class.inc.php',
@@ -2807,7 +2742,8 @@ return array(
'URLButtonItem' => $baseDir . '/application/applicationextension.inc.php',
'URLPopupMenuItem' => $baseDir . '/application/applicationextension.inc.php',
'UnaryExpression' => $baseDir . '/core/oql/expression.class.inc.php',
- 'UnauthenticatedWebPage' => $baseDir . '/sources/application/WebPage/UnauthenticatedWebPage.php',
+ 'UnauthenticatedWebPage' => $baseDir . '/sources/Application/WebPage/UnauthenticatedWebPage.php',
+ 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'UnknownClassOqlException' => $baseDir . '/core/oql/oqlinterpreter.class.inc.php',
'User' => $baseDir . '/core/userrights.class.inc.php',
'UserDashboard' => $baseDir . '/application/user.dashboard.class.inc.php',
@@ -2815,6 +2751,7 @@ return array(
'UserRightException' => $baseDir . '/application/exceptions/UserRightException.php',
'UserRights' => $baseDir . '/core/userrights.class.inc.php',
'UserRightsAddOnAPI' => $baseDir . '/core/userrights.class.inc.php',
+ 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
'ValueSetDefinition' => $baseDir . '/core/valuesetdef.class.inc.php',
'ValueSetEnum' => $baseDir . '/core/valuesetdef.class.inc.php',
'ValueSetEnumClasses' => $baseDir . '/core/valuesetdef.class.inc.php',
@@ -2823,13 +2760,13 @@ return array(
'ValueSetRange' => $baseDir . '/core/valuesetdef.class.inc.php',
'VariableExpression' => $baseDir . '/core/oql/expression.class.inc.php',
'VariableOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
- 'WebPage' => $baseDir . '/sources/application/WebPage/WebPage.php',
+ 'WebPage' => $baseDir . '/sources/Application/WebPage/WebPage.php',
'WebPageMenuNode' => $baseDir . '/application/menunode.class.inc.php',
'WeeklyRotatingLogFileNameBuilder' => $baseDir . '/core/log.class.inc.php',
'WizardHelper' => $baseDir . '/application/wizardhelper.class.inc.php',
'XLSXWriter' => $baseDir . '/application/xlsxwriter.class.php',
'XMLBulkExport' => $baseDir . '/core/xmlbulkexport.class.inc.php',
- 'XMLPage' => $baseDir . '/sources/application/WebPage/XMLPage.php',
+ 'XMLPage' => $baseDir . '/sources/Application/WebPage/XMLPage.php',
'ajax_page' => $baseDir . '/application/ajaxwebpage.class.inc.php',
'appUserPreferences' => $baseDir . '/application/user.preferences.class.inc.php',
'cmdbAbstractObject' => $baseDir . '/application/cmdbabstract.class.inc.php',
@@ -2851,7 +2788,7 @@ return array(
'iDBObjectSetIterator' => $baseDir . '/core/dbobjectiterator.php',
'iDBObjectURLMaker' => $baseDir . '/application/applicationcontext.class.inc.php',
'iDisplay' => $baseDir . '/core/dbobject.class.php',
- 'iKeyboardShortcut' => $baseDir . '/sources/application/UI/Hook/iKeyboardShortcut.php',
+ 'iKeyboardShortcut' => $baseDir . '/sources/Application/UI/Hook/iKeyboardShortcut.php',
'iLogFileNameBuilder' => $baseDir . '/core/log.class.inc.php',
'iLoginExtension' => $baseDir . '/application/applicationextension.inc.php',
'iLoginFSMExtension' => $baseDir . '/application/applicationextension.inc.php',
@@ -2871,15 +2808,15 @@ return array(
'iRestServiceProvider' => $baseDir . '/application/applicationextension.inc.php',
'iScheduledProcess' => $baseDir . '/core/backgroundprocess.inc.php',
'iSelfRegister' => $baseDir . '/core/userrights.class.inc.php',
- 'iTabbedPage' => $baseDir . '/sources/application/WebPage/iTabbedPage.php',
+ 'iTabbedPage' => $baseDir . '/sources/Application/WebPage/iTabbedPage.php',
'iTopConfigParser' => $baseDir . '/core/iTopConfigParser.php',
'iTopMutex' => $baseDir . '/core/mutex.class.inc.php',
'iTopOwnershipLock' => $baseDir . '/core/ownershiplock.class.inc.php',
'iTopOwnershipToken' => $baseDir . '/core/ownershiplock.class.inc.php',
- 'iTopPDF' => $baseDir . '/sources/application/WebPage/iTopPDF.php',
+ 'iTopPDF' => $baseDir . '/sources/Application/WebPage/iTopPDF.php',
'iTopStandardURLMaker' => $baseDir . '/application/applicationcontext.class.inc.php',
- 'iTopWebPage' => $baseDir . '/sources/application/WebPage/iTopWebPage.php',
- 'iTopWizardWebPage' => $baseDir . '/sources/application/WebPage/iTopWizardWebPage.php',
+ 'iTopWebPage' => $baseDir . '/sources/Application/WebPage/iTopWebPage.php',
+ 'iTopWizardWebPage' => $baseDir . '/sources/Application/WebPage/iTopWizardWebPage.php',
'iWorkingTimeComputer' => $baseDir . '/core/computing.inc.php',
'lnkTriggerAction' => $baseDir . '/core/trigger.class.inc.php',
'ormCaseLog' => $baseDir . '/core/ormcaselog.class.inc.php',
diff --git a/lib/composer/autoload_files.php b/lib/composer/autoload_files.php
index 316c670f4..9423c7385 100644
--- a/lib/composer/autoload_files.php
+++ b/lib/composer/autoload_files.php
@@ -2,23 +2,25 @@
// autoload_files.php @generated by Composer
-$vendorDir = dirname(dirname(__FILE__));
+$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
- '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
+ 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
+ '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
- '5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
- '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
- '32dcc8afd4335739640db7d200c1971d' => $vendorDir . '/symfony/polyfill-apcu/bootstrap.php',
- '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
- 'bd9634f2d41831496de0d3dfe4c94881' => $vendorDir . '/symfony/polyfill-php56/bootstrap.php',
+ '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
'7e9bd612cc444b3eed788ebbe46263a0' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php',
- '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
+ '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
+ '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
+ '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
+ '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
+ '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
+ 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
);
diff --git a/lib/composer/autoload_namespaces.php b/lib/composer/autoload_namespaces.php
index d12922d08..6629b7e09 100644
--- a/lib/composer/autoload_namespaces.php
+++ b/lib/composer/autoload_namespaces.php
@@ -2,11 +2,10 @@
// autoload_namespaces.php @generated by Composer
-$vendorDir = dirname(dirname(__FILE__));
+$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
- 'Twig_' => array($vendorDir . '/twig/twig/lib'),
'Console' => array($vendorDir . '/pear/console_getopt'),
'Archive_Tar' => array($vendorDir . '/pear/archive_tar'),
'' => array($vendorDir . '/pear/pear-core-minimal/src'),
diff --git a/lib/composer/autoload_psr4.php b/lib/composer/autoload_psr4.php
index 00354f093..0a7d4ce20 100644
--- a/lib/composer/autoload_psr4.php
+++ b/lib/composer/autoload_psr4.php
@@ -2,24 +2,30 @@
// autoload_psr4.php @generated by Composer
-$vendorDir = dirname(dirname(__FILE__));
+$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Twig\\' => array($vendorDir . '/twig/twig/src'),
'TrueBV\\' => array($vendorDir . '/true/punycode/src'),
'TheNetworg\\OAuth2\\Client\\' => array($vendorDir . '/thenetworg/oauth2-azure/src'),
- 'Symfony\\Polyfill\\Util\\' => array($vendorDir . '/symfony/polyfill-util'),
+ 'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'),
+ 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
+ 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'),
'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
- 'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'),
- 'Symfony\\Polyfill\\Php56\\' => array($vendorDir . '/symfony/polyfill-php56'),
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),
'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'),
'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
- 'Symfony\\Polyfill\\Apcu\\' => array($vendorDir . '/symfony/polyfill-apcu'),
+ 'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'),
+ 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
+ 'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'),
+ 'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'),
'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
+ 'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'),
'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
+ 'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
'Symfony\\Component\\Stopwatch\\' => array($vendorDir . '/symfony/stopwatch'),
'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
@@ -27,22 +33,21 @@ return array(
'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
+ 'Symfony\\Component\\ErrorHandler\\' => array($vendorDir . '/symfony/error-handler'),
'Symfony\\Component\\Dotenv\\' => array($vendorDir . '/symfony/dotenv'),
'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'),
- 'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
- 'Symfony\\Component\\ClassLoader\\' => array($vendorDir . '/symfony/class-loader'),
'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
'Symfony\\Bundle\\WebProfilerBundle\\' => array($vendorDir . '/symfony/web-profiler-bundle'),
'Symfony\\Bundle\\TwigBundle\\' => array($vendorDir . '/symfony/twig-bundle'),
'Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'),
'Symfony\\Bridge\\Twig\\' => array($vendorDir . '/symfony/twig-bridge'),
'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'),
- 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
+ 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'),
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
diff --git a/lib/composer/autoload_real.php b/lib/composer/autoload_real.php
index cc554d8d1..dda4f956d 100644
--- a/lib/composer/autoload_real.php
+++ b/lib/composer/autoload_real.php
@@ -25,33 +25,20 @@ class ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f
require __DIR__ . '/platform_check.php';
spl_autoload_register(array('ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f', 'loadClassLoader'), true, true);
- self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f', 'loadClassLoader'));
$includePaths = require __DIR__ . '/include_paths.php';
$includePaths[] = get_include_path();
set_include_path(implode(PATH_SEPARATOR, $includePaths));
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
- if ($useStaticLoader) {
- require __DIR__ . '/autoload_static.php';
-
- call_user_func(\Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::getInitializer($loader));
- } else {
- $classMap = require __DIR__ . '/autoload_classmap.php';
- if ($classMap) {
- $loader->addClassMap($classMap);
- }
- }
+ require __DIR__ . '/autoload_static.php';
+ call_user_func(\Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
- if ($useStaticLoader) {
- $includeFiles = Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$files;
- } else {
- $includeFiles = require __DIR__ . '/autoload_files.php';
- }
+ $includeFiles = \Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire7f81b4a2a468a061c306af5e447a9a9f($fileIdentifier, $file);
}
@@ -60,11 +47,16 @@ class ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f
}
}
+/**
+ * @param string $fileIdentifier
+ * @param string $file
+ * @return void
+ */
function composerRequire7f81b4a2a468a061c306af5e447a9a9f($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
- require $file;
-
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+
+ require $file;
}
}
diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php
index 630dbacbd..c3ca0c398 100644
--- a/lib/composer/autoload_static.php
+++ b/lib/composer/autoload_static.php
@@ -7,21 +7,23 @@ namespace Composer\Autoload;
class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
{
public static $files = array (
- '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
+ 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
+ '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
- '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
- '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
- '32dcc8afd4335739640db7d200c1971d' => __DIR__ . '/..' . '/symfony/polyfill-apcu/bootstrap.php',
- '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
- 'bd9634f2d41831496de0d3dfe4c94881' => __DIR__ . '/..' . '/symfony/polyfill-php56/bootstrap.php',
+ '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
'7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php',
- '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
+ '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
+ '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
+ '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
+ '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
+ '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
+ 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
);
public static $prefixLengthsPsr4 = array (
@@ -33,17 +35,23 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
),
'S' =>
array (
- 'Symfony\\Polyfill\\Util\\' => 22,
+ 'Symfony\\Polyfill\\Php81\\' => 23,
+ 'Symfony\\Polyfill\\Php80\\' => 23,
+ 'Symfony\\Polyfill\\Php73\\' => 23,
'Symfony\\Polyfill\\Php72\\' => 23,
- 'Symfony\\Polyfill\\Php70\\' => 23,
- 'Symfony\\Polyfill\\Php56\\' => 23,
'Symfony\\Polyfill\\Mbstring\\' => 26,
'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33,
'Symfony\\Polyfill\\Intl\\Idn\\' => 26,
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31,
'Symfony\\Polyfill\\Ctype\\' => 23,
- 'Symfony\\Polyfill\\Apcu\\' => 22,
+ 'Symfony\\Contracts\\Translation\\' => 30,
+ 'Symfony\\Contracts\\Service\\' => 26,
+ 'Symfony\\Contracts\\EventDispatcher\\' => 34,
+ 'Symfony\\Contracts\\Cache\\' => 24,
'Symfony\\Component\\Yaml\\' => 23,
+ 'Symfony\\Component\\VarExporter\\' => 30,
'Symfony\\Component\\VarDumper\\' => 28,
+ 'Symfony\\Component\\String\\' => 25,
'Symfony\\Component\\Stopwatch\\' => 28,
'Symfony\\Component\\Routing\\' => 26,
'Symfony\\Component\\HttpKernel\\' => 29,
@@ -51,13 +59,12 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Finder\\' => 25,
'Symfony\\Component\\Filesystem\\' => 29,
'Symfony\\Component\\EventDispatcher\\' => 34,
+ 'Symfony\\Component\\ErrorHandler\\' => 31,
'Symfony\\Component\\Dotenv\\' => 25,
'Symfony\\Component\\DependencyInjection\\' => 38,
- 'Symfony\\Component\\Debug\\' => 24,
'Symfony\\Component\\CssSelector\\' => 30,
'Symfony\\Component\\Console\\' => 26,
'Symfony\\Component\\Config\\' => 25,
- 'Symfony\\Component\\ClassLoader\\' => 30,
'Symfony\\Component\\Cache\\' => 24,
'Symfony\\Bundle\\WebProfilerBundle\\' => 33,
'Symfony\\Bundle\\TwigBundle\\' => 26,
@@ -67,9 +74,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
),
'P' =>
array (
- 'Psr\\SimpleCache\\' => 16,
'Psr\\Log\\' => 8,
'Psr\\Http\\Message\\' => 17,
+ 'Psr\\EventDispatcher\\' => 20,
'Psr\\Container\\' => 14,
'Psr\\Cache\\' => 10,
'PhpParser\\' => 10,
@@ -115,22 +122,22 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/thenetworg/oauth2-azure/src',
),
- 'Symfony\\Polyfill\\Util\\' =>
+ 'Symfony\\Polyfill\\Php81\\' =>
array (
- 0 => __DIR__ . '/..' . '/symfony/polyfill-util',
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-php81',
+ ),
+ 'Symfony\\Polyfill\\Php80\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
+ ),
+ 'Symfony\\Polyfill\\Php73\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-php73',
),
'Symfony\\Polyfill\\Php72\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
),
- 'Symfony\\Polyfill\\Php70\\' =>
- array (
- 0 => __DIR__ . '/..' . '/symfony/polyfill-php70',
- ),
- 'Symfony\\Polyfill\\Php56\\' =>
- array (
- 0 => __DIR__ . '/..' . '/symfony/polyfill-php56',
- ),
'Symfony\\Polyfill\\Mbstring\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
@@ -143,22 +150,46 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn',
),
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme',
+ ),
'Symfony\\Polyfill\\Ctype\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
),
- 'Symfony\\Polyfill\\Apcu\\' =>
+ 'Symfony\\Contracts\\Translation\\' =>
array (
- 0 => __DIR__ . '/..' . '/symfony/polyfill-apcu',
+ 0 => __DIR__ . '/..' . '/symfony/translation-contracts',
+ ),
+ 'Symfony\\Contracts\\Service\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/service-contracts',
+ ),
+ 'Symfony\\Contracts\\EventDispatcher\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts',
+ ),
+ 'Symfony\\Contracts\\Cache\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/cache-contracts',
),
'Symfony\\Component\\Yaml\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/yaml',
),
+ 'Symfony\\Component\\VarExporter\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/var-exporter',
+ ),
'Symfony\\Component\\VarDumper\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/var-dumper',
),
+ 'Symfony\\Component\\String\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/string',
+ ),
'Symfony\\Component\\Stopwatch\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/stopwatch',
@@ -187,6 +218,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/symfony/event-dispatcher',
),
+ 'Symfony\\Component\\ErrorHandler\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/error-handler',
+ ),
'Symfony\\Component\\Dotenv\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/dotenv',
@@ -195,10 +230,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/symfony/dependency-injection',
),
- 'Symfony\\Component\\Debug\\' =>
- array (
- 0 => __DIR__ . '/..' . '/symfony/debug',
- ),
'Symfony\\Component\\CssSelector\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/css-selector',
@@ -211,10 +242,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/symfony/config',
),
- 'Symfony\\Component\\ClassLoader\\' =>
- array (
- 0 => __DIR__ . '/..' . '/symfony/class-loader',
- ),
'Symfony\\Component\\Cache\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/cache',
@@ -239,10 +266,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/scssphp/scssphp/src',
),
- 'Psr\\SimpleCache\\' =>
- array (
- 0 => __DIR__ . '/..' . '/psr/simple-cache/src',
- ),
'Psr\\Log\\' =>
array (
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
@@ -251,6 +274,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/psr/http-message/src',
),
+ 'Psr\\EventDispatcher\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src',
+ ),
'Psr\\Container\\' =>
array (
0 => __DIR__ . '/..' . '/psr/container/src',
@@ -323,13 +350,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
);
public static $prefixesPsr0 = array (
- 'T' =>
- array (
- 'Twig_' =>
- array (
- 0 => __DIR__ . '/..' . '/twig/twig/lib',
- ),
- ),
'C' =>
array (
'Console' =>
@@ -363,7 +383,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'ActionChecker' => __DIR__ . '/../..' . '/core/userrights.class.inc.php',
'ActionEmail' => __DIR__ . '/../..' . '/core/action.class.inc.php',
'ActionNotification' => __DIR__ . '/../..' . '/core/action.class.inc.php',
- 'AjaxPage' => __DIR__ . '/../..' . '/sources/application/WebPage/AjaxPage.php',
+ 'AjaxPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/AjaxPage.php',
'ApcService' => __DIR__ . '/../..' . '/core/apc-service.class.inc.php',
'ApplicationContext' => __DIR__ . '/../..' . '/application/applicationcontext.class.inc.php',
'ApplicationException' => __DIR__ . '/../..' . '/application/exceptions/ApplicationException.php',
@@ -371,10 +391,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'ApplicationPopupMenuItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
'Archive_Tar' => __DIR__ . '/..' . '/pear/archive_tar/Archive/Tar.php',
'ArchivedObjectException' => __DIR__ . '/../..' . '/application/exceptions/ArchivedObjectException.php',
- 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
- 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
'AsyncSendEmail' => __DIR__ . '/../..' . '/core/asynctask.class.inc.php',
'AsyncTask' => __DIR__ . '/../..' . '/core/asynctask.class.inc.php',
+ 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
'AttributeApplicationLanguage' => __DIR__ . '/../..' . '/core/attributedef.class.inc.php',
'AttributeArchiveDate' => __DIR__ . '/../..' . '/core/attributedef.class.inc.php',
'AttributeArchiveFlag' => __DIR__ . '/../..' . '/core/attributedef.class.inc.php',
@@ -445,8 +464,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'BulkExportMissingParameterException' => __DIR__ . '/../..' . '/core/bulkexport.class.inc.php',
'BulkExportResult' => __DIR__ . '/../..' . '/core/bulkexport.class.inc.php',
'BulkExportResultGC' => __DIR__ . '/../..' . '/core/bulkexport.class.inc.php',
- 'CLILikeWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/CLILikeWebPage.php',
- 'CLIPage' => __DIR__ . '/../..' . '/sources/application/WebPage/CLIPage.php',
+ 'CLILikeWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/CLILikeWebPage.php',
+ 'CLIPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/CLIPage.php',
'CMDBChange' => __DIR__ . '/../..' . '/core/cmdbchange.class.inc.php',
'CMDBChangeOp' => __DIR__ . '/../..' . '/core/cmdbchangeop.class.inc.php',
'CMDBChangeOpCreate' => __DIR__ . '/../..' . '/core/cmdbchangeop.class.inc.php',
@@ -471,10 +490,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'CMDBObjectSet' => __DIR__ . '/../..' . '/core/cmdbobject.class.inc.php',
'CMDBSource' => __DIR__ . '/../..' . '/core/cmdbsource.class.inc.php',
'CSVBulkExport' => __DIR__ . '/../..' . '/core/csvbulkexport.class.inc.php',
- 'CSVPage' => __DIR__ . '/../..' . '/sources/application/WebPage/CSVPage.php',
+ 'CSVPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/CSVPage.php',
'CSVParser' => __DIR__ . '/../..' . '/core/csvparser.class.inc.php',
'CSVParserException' => __DIR__ . '/../..' . '/application/exceptions/CSVParserException.php',
- 'CaptureWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/CaptureWebPage.php',
+ 'CaptureWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/CaptureWebPage.php',
'CellChangeSpec' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php',
'CellStatus_Ambiguous' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php',
'CellStatus_Issue' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php',
@@ -486,175 +505,171 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'CharConcatWSExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php',
'CheckStopWatchThresholds' => __DIR__ . '/../..' . '/core/ormstopwatch.class.inc.php',
'CheckableExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
- 'Combodo\\iTop\\Application\\Branding' => __DIR__ . '/../..' . '/sources/application/Branding.php',
- 'Combodo\\iTop\\Application\\Helper\\Session' => __DIR__ . '/../..' . '/sources/application/Helper/Session.php',
- 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => __DIR__ . '/../..' . '/sources/application/Helper/WebResourcesHelper.php',
- 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => __DIR__ . '/../..' . '/sources/application/search/ajaxsearchexception.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => __DIR__ . '/../..' . '/sources/application/search/criterionconversionabstract.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => __DIR__ . '/../..' . '/sources/application/search/criterionconversion/criteriontooql.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToSearchForm' => __DIR__ . '/../..' . '/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\CriterionParser' => __DIR__ . '/../..' . '/sources/application/search/criterionparser.class.inc.php',
- 'Combodo\\iTop\\Application\\Search\\SearchForm' => __DIR__ . '/../..' . '/sources/application/search/searchform.class.inc.php',
- 'Combodo\\iTop\\Application\\Status\\Status' => __DIR__ . '/../..' . '/sources/application/status/Status.php',
- 'Combodo\\iTop\\Application\\TwigBase\\Controller\\Controller' => __DIR__ . '/../..' . '/sources/application/TwigBase/Controller/Controller.php',
+ 'Combodo\\iTop\\Application\\Branding' => __DIR__ . '/../..' . '/sources/Application/Branding.php',
+ 'Combodo\\iTop\\Application\\Helper\\Session' => __DIR__ . '/../..' . '/sources/Application/Helper/Session.php',
+ 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/WebResourcesHelper.php',
+ 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => __DIR__ . '/../..' . '/sources/Application/Search/ajaxsearchexception.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => __DIR__ . '/../..' . '/sources/Application/Search/criterionconversionabstract.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => __DIR__ . '/../..' . '/sources/Application/Search/CriterionConversion/criteriontooql.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToSearchForm' => __DIR__ . '/../..' . '/sources/Application/Search/CriterionConversion/criteriontosearchform.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\CriterionParser' => __DIR__ . '/../..' . '/sources/Application/Search/criterionparser.class.inc.php',
+ 'Combodo\\iTop\\Application\\Search\\SearchForm' => __DIR__ . '/../..' . '/sources/Application/Search/searchform.class.inc.php',
+ 'Combodo\\iTop\\Application\\Status\\Status' => __DIR__ . '/../..' . '/sources/Application/Status/Status.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\Controller\\Controller' => __DIR__ . '/../..' . '/sources/Application/TwigBase/Controller/Controller.php',
'Combodo\\iTop\\Application\\TwigBase\\Controller\\PageNotFoundException' => __DIR__ . '/../..' . '/application/exceptions/PageNotFoundException.php',
- 'Combodo\\iTop\\Application\\TwigBase\\Twig\\Extension' => __DIR__ . '/../..' . '/sources/application/TwigBase/Twig/Extension.php',
- 'Combodo\\iTop\\Application\\TwigBase\\Twig\\TwigHelper' => __DIR__ . '/../..' . '/sources/application/TwigBase/Twig/TwigHelper.php',
- 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockExtension' => __DIR__ . '/../..' . '/sources/application/TwigBase/UI/UIBlockExtension.php',
- 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockNode' => __DIR__ . '/../..' . '/sources/application/TwigBase/UI/UIBlockNode.php',
- 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockParser' => __DIR__ . '/../..' . '/sources/application/TwigBase/UI/UIBlockParser.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\AbstractUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/AbstractUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\Alert' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Alert/Alert.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\AlertUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Alert/AlertUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Breadcrumbs\\Breadcrumbs' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Breadcrumbs/Breadcrumbs.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroup' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/ButtonGroup/ButtonGroup.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroupUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/ButtonGroup/ButtonGroupUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\Button' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Button/Button.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonJS' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Button/ButtonJS.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Button/ButtonUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonURL' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Button/ButtonURL.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSection' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/CollapsibleSection/CollapsibleSection.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSectionUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/CollapsibleSection/CollapsibleSectionUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletBadge' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletBadge.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletContainer' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletContainer.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletHeaderStatic' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletHeaderStatic.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletPlainText' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletPlainText.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTable' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTable.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableSettings' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTableSettings.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTableUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTableRow\\FormTableRow' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/StaticTable/FormTableRow/FormTableRow.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTable\\FormTable' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/StaticTable/FormTable/FormTable.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\StaticTable' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/StaticTable/StaticTable.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadge' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/FieldBadge/FieldBadge.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadgeUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/FieldBadge/FieldBadgeUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSet' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/FieldSet/FieldSet.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSetUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/FieldSet/FieldSetUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\Field' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Field/Field.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\FieldUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\Form' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Form/Form.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\FormUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Form/FormUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearch' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/GlobalSearch/GlobalSearch.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/GlobalSearch/GlobalSearchFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchHelper' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/GlobalSearch/GlobalSearchHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\Html' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Html/Html.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\HtmlFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Html/HtmlFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\AbstractInput' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/AbstractInput.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelect' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/FileSelect/FileSelect.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelectUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/FileSelect/FileSelectUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Input' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/Input.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/InputUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputWithLabel' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/InputWithLabel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\RichText\\RichText' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/RichText/RichText.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\SelectUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/Select/SelectUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\Select' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/Select/Select.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOption' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/Select/SelectOption.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOptionUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/Select/SelectOptionUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\TextArea' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/TextArea.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\tInputLabel' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Input/tInputLabel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\MedallionIcon\\MedallionIcon' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/MedallionIcon/MedallionIcon.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\Panel' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Panel/Panel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\PanelUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Panel/PanelUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\Pill' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Pill/Pill.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\PillFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Pill/PillFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenu' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenu.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenuFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenu' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenu.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\JsPopoverMenuItem' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/JsPopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItem' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItemFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItemFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\SeparatorPopoverMenuItem' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/SeparatorPopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\UrlPopoverMenuItem' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuItem/UrlPopoverMenuItem.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreate' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/QuickCreate/QuickCreate.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/QuickCreate/QuickCreateFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateHelper' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/QuickCreate/QuickCreateHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\Spinner' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Spinner/Spinner.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\SpinnerUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Spinner/SpinnerUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Text\\Text' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Text/Text.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\Title' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Title/Title.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\TitleUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\AbstractSeparator' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/Separator/AbstractSeparator.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\ToolbarSeparatorUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/Separator/ToolbarSeparatorUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\VerticalSeparator' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/Separator/VerticalSeparator.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Toolbar' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/Toolbar.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacer' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacer.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacerUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacerUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/ToolbarUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntry' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntryFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntryFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentAddedFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentAddedFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentRemovedFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentRemovedFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpCreateFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpCreateFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpDeleteFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpDeleteFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeScalarFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeScalarFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CaseLogEntry' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/CaseLogEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EditsEntry' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/EditsEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationEmailFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationEmailFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\NotificationEntry' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/NotificationEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\TransitionEntry' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityEntry/TransitionEntry.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanel' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanel.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanelFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelHelper' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanelHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelPrint' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/ActivityPanelPrint.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryFormFactory\\CaseLogEntryFormFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryFormFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryForm\\CaseLogEntryForm' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryForm.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardColumn' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/Dashboard/DashboardColumn.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardLayout' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/Dashboard/DashboardLayout.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardRow' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/Dashboard/DashboardRow.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\Column' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/MultiColumn/Column/Column.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\ColumnUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/MultiColumn/Column/ColumnUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumn' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/MultiColumn/MultiColumn.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumnUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/MultiColumn/MultiColumnUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenu' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenuFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectDetails' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/Object/ObjectDetails.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/Object/ObjectFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContent' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/PageContent/PageContent.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/PageContent/PageContentFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentWithSideContent' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/PageContent/PageContentWithSideContent.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\TabContainer' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/TabContainer/TabContainer.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\AjaxTab' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/TabContainer/Tab/AjaxTab.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\Tab' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/TabContainer/Tab/Tab.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBar' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/TopBar/TopBar.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/TopBar/TopBarFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlock' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/UIContentBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/UIContentBlockUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockWithJSRefreshCallback' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/UIContentBlockWithJSRefreshCallback .php',
- 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\iUIContentBlock' => __DIR__ . '/../..' . '/sources/application/UI/Base/Layout/iUIContentBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\UIBlock' => __DIR__ . '/../..' . '/sources/application/UI/Base/UIBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\UIException' => __DIR__ . '/../..' . '/sources/application/UI/Base/UIException.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlock' => __DIR__ . '/../..' . '/sources/application/UI/Base/iUIBlock.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/iUIBlockFactory.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\tJSRefreshCallback' => __DIR__ . '/../..' . '/sources/application/UI/Base/tJSRefreshCallback.php',
- 'Combodo\\iTop\\Application\\UI\\Base\\tUIContentAreas' => __DIR__ . '/../..' . '/sources/application/UI/Base/tUIContentAreas.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxBars\\BlockChartAjaxBars' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockChartAjaxBars/BlockChartAjaxBars.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxPie\\BlockChartAjaxPie' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockChartAjaxPie/BlockChartAjaxPie.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChart\\BlockChart' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockCsv\\BlockCsv' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockCsv/BlockCsv.php',
- 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockList\\BlockList' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockList/BlockList.php',
- 'Combodo\\iTop\\Application\\UI\\Helper\\UIHelper' => __DIR__ . '/../..' . '/sources/application/UI/Helper/UIHelper.php',
- 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockIndirectLinksEdit\\BlockIndirectLinksEdit' => __DIR__ . '/../..' . '/sources/application/UI/Links/Indirect/BlockIndirectLinksEdit/BlockIndirectLinksEdit.php',
- 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockObjectPickerDialog\\BlockObjectPickerDialog' => __DIR__ . '/../..' . '/sources/application/UI/Links/Indirect/BlockObjectPickerDialog/BlockObjectPickerDialog.php',
- 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => __DIR__ . '/../..' . '/sources/application/UI/Preferences/BlockShortcuts/BlockShortcuts.php',
- 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => __DIR__ . '/../..' . '/sources/application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\Twig\\Extension' => __DIR__ . '/../..' . '/sources/Application/TwigBase/Twig/Extension.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\Twig\\TwigHelper' => __DIR__ . '/../..' . '/sources/Application/TwigBase/Twig/TwigHelper.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockExtension' => __DIR__ . '/../..' . '/sources/Application/TwigBase/UI/UIBlockExtension.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockNode' => __DIR__ . '/../..' . '/sources/Application/TwigBase/UI/UIBlockNode.php',
+ 'Combodo\\iTop\\Application\\TwigBase\\UI\\UIBlockParser' => __DIR__ . '/../..' . '/sources/Application/TwigBase/UI/UIBlockParser.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\AbstractUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/AbstractUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\Alert' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Alert/Alert.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Alert\\AlertUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Alert/AlertUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Breadcrumbs\\Breadcrumbs' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Breadcrumbs/Breadcrumbs.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroup' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/ButtonGroup/ButtonGroup.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroupUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/ButtonGroup/ButtonGroupUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\Button' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/Button.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonJS' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/ButtonJS.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/ButtonUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonURL' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/ButtonURL.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSection' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/CollapsibleSection/CollapsibleSection.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSectionUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/CollapsibleSection/CollapsibleSectionUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletBadge' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Dashlet/DashletBadge.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletContainer' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Dashlet/DashletContainer.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Dashlet/DashletFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletHeaderStatic' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Dashlet/DashletHeaderStatic.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletPlainText' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Dashlet/DashletPlainText.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTable' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/DataTable/DataTable.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableSettings' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/DataTable/DataTableSettings.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/DataTable/DataTableUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTableRow\\FormTableRow' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/DataTable/StaticTable/FormTableRow/FormTableRow.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTable\\FormTable' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/DataTable/StaticTable/FormTable/FormTable.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\StaticTable' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/DataTable/StaticTable/StaticTable.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadge' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/FieldBadge/FieldBadge.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldBadge\\FieldBadgeUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/FieldBadge/FieldBadgeUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSet' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/FieldSet/FieldSet.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\FieldSet\\FieldSetUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/FieldSet/FieldSetUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\Field' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Field/Field.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\FieldUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Field/FieldUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\Form' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Form/Form.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Form\\FormUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Form/FormUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearch' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/GlobalSearch/GlobalSearch.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/GlobalSearch/GlobalSearchFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\GlobalSearch\\GlobalSearchHelper' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/GlobalSearch/GlobalSearchHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\Html' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Html/Html.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Html\\HtmlFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Html/HtmlFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\AbstractInput' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/AbstractInput.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelect' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/FileSelect/FileSelect.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\FileSelect\\FileSelectUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/FileSelect/FileSelectUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Input' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/Input.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/InputUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\InputWithLabel' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/InputWithLabel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\RichText\\RichText' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/RichText/RichText.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\SelectUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/Select/SelectUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\Select' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/Select/Select.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOption' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/Select/SelectOption.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\Select\\SelectOptionUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/Select/SelectOptionUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\TextArea' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/TextArea.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Input\\tInputLabel' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Input/tInputLabel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\MedallionIcon\\MedallionIcon' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/MedallionIcon/MedallionIcon.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\Panel' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Panel/Panel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Panel\\PanelUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Panel/PanelUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\Pill' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Pill/Pill.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Pill\\PillFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Pill/PillFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenu' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenu.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\NewsroomMenu\\NewsroomMenuFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenu' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenu.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\JsPopoverMenuItem' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/JsPopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItem' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\PopoverMenuItemFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/PopoverMenuItemFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\SeparatorPopoverMenuItem' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/SeparatorPopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\PopoverMenu\\PopoverMenuItem\\UrlPopoverMenuItem' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/PopoverMenu/PopoverMenuItem/UrlPopoverMenuItem.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreate' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/QuickCreate/QuickCreate.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/QuickCreate/QuickCreateFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateHelper' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/QuickCreate/QuickCreateHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\Spinner' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Spinner/Spinner.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\SpinnerUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Spinner/SpinnerUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Text\\Text' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Text/Text.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\Title' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Title/Title.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\TitleUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Title/TitleUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\AbstractSeparator' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Toolbar/Separator/AbstractSeparator.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\ToolbarSeparatorUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Toolbar/Separator/ToolbarSeparatorUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Separator\\VerticalSeparator' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Toolbar/Separator/VerticalSeparator.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Toolbar' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Toolbar/Toolbar.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacer' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacer.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarSpacer\\ToolbarSpacerUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Toolbar/ToolbarSpacer/ToolbarSpacerUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\ToolbarUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Toolbar/ToolbarUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntry' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\ActivityEntryFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/ActivityEntryFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentAddedFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentAddedFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpAttachmentRemovedFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpAttachmentRemovedFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpCreateFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpCreateFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpDeleteFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpDeleteFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CMDBChangeOp\\CMDBChangeOpSetAttributeScalarFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CMDBChangeOp/CMDBChangeOpSetAttributeScalarFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\CaseLogEntry' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/CaseLogEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EditsEntry' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/EditsEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationEmailFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationEmailFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\EventNotification\\EventNotificationFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/EventNotification/EventNotificationFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\NotificationEntry' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/NotificationEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityEntry\\TransitionEntry' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityEntry/TransitionEntry.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanel' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanel.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelHelper' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelPrint' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelPrint.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryFormFactory\\CaseLogEntryFormFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryFormFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\CaseLogEntryForm\\CaseLogEntryForm' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/CaseLogEntryForm/CaseLogEntryForm.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardColumn' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/Dashboard/DashboardColumn.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardLayout' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/Dashboard/DashboardLayout.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Dashboard\\DashboardRow' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/Dashboard/DashboardRow.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\Column' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/MultiColumn/Column/Column.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\Column\\ColumnUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/MultiColumn/Column/ColumnUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumn' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/MultiColumn/MultiColumn.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\MultiColumn\\MultiColumnUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/MultiColumn/MultiColumnUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenu' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenu.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\NavigationMenu\\NavigationMenuFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectDetails' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/Object/ObjectDetails.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\Object\\ObjectFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/Object/ObjectFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContent' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/PageContent/PageContent.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/PageContent/PageContentFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\PageContent\\PageContentWithSideContent' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/PageContent/PageContentWithSideContent.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\TabContainer' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TabContainer/TabContainer.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\AjaxTab' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TabContainer/Tab/AjaxTab.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TabContainer\\Tab\\Tab' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TabContainer/Tab/Tab.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBar' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBar.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBarFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlock' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/UIContentBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/UIContentBlockUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlockWithJSRefreshCallback' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/UIContentBlockWithJSRefreshCallback .php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\iUIContentBlock' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/iUIContentBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\UIBlock' => __DIR__ . '/../..' . '/sources/Application/UI/Base/UIBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\UIException' => __DIR__ . '/../..' . '/sources/Application/UI/Base/UIException.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlock' => __DIR__ . '/../..' . '/sources/Application/UI/Base/iUIBlock.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\iUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/iUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\tJSRefreshCallback' => __DIR__ . '/../..' . '/sources/Application/UI/Base/tJSRefreshCallback.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\tUIContentAreas' => __DIR__ . '/../..' . '/sources/Application/UI/Base/tUIContentAreas.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxBars\\BlockChartAjaxBars' => __DIR__ . '/../..' . '/sources/Application/UI/DisplayBlock/BlockChartAjaxBars/BlockChartAjaxBars.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxPie\\BlockChartAjaxPie' => __DIR__ . '/../..' . '/sources/Application/UI/DisplayBlock/BlockChartAjaxPie/BlockChartAjaxPie.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChart\\BlockChart' => __DIR__ . '/../..' . '/sources/Application/UI/DisplayBlock/BlockChart/BlockChart.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockCsv\\BlockCsv' => __DIR__ . '/../..' . '/sources/Application/UI/DisplayBlock/BlockCsv/BlockCsv.php',
+ 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockList\\BlockList' => __DIR__ . '/../..' . '/sources/Application/UI/DisplayBlock/BlockList/BlockList.php',
+ 'Combodo\\iTop\\Application\\UI\\Helper\\UIHelper' => __DIR__ . '/../..' . '/sources/Application/UI/Helper/UIHelper.php',
+ 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockIndirectLinksEdit\\BlockIndirectLinksEdit' => __DIR__ . '/../..' . '/sources/Application/UI/Links/Indirect/BlockIndirectLinksEdit/BlockIndirectLinksEdit.php',
+ 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockObjectPickerDialog\\BlockObjectPickerDialog' => __DIR__ . '/../..' . '/sources/Application/UI/Links/Indirect/BlockObjectPickerDialog/BlockObjectPickerDialog.php',
+ 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => __DIR__ . '/../..' . '/sources/Application/UI/Preferences/BlockShortcuts/BlockShortcuts.php',
+ 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => __DIR__ . '/../..' . '/sources/Application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php',
'Combodo\\iTop\\Composer\\iTopComposer' => __DIR__ . '/../..' . '/sources/Composer/iTopComposer.php',
'Combodo\\iTop\\Controller\\AjaxRenderController' => __DIR__ . '/../..' . '/sources/Controller/AjaxRenderController.php',
'Combodo\\iTop\\Controller\\Base\\Layout\\ActivityPanelController' => __DIR__ . '/../..' . '/sources/Controller/Base/Layout/ActivityPanelController.php',
- 'Combodo\\iTop\\Controller\\OAuth\\OAuthAjaxController' => __DIR__ . '/../..' . '/sources/Controller/OAuth/OAuthAjaxController.php',
'Combodo\\iTop\\Controller\\OAuth\\OAuthLandingController' => __DIR__ . '/../..' . '/sources/Controller/OAuth/OAuthLandingController.php',
- 'Combodo\\iTop\\Controller\\OAuth\\OAuthWizardController' => __DIR__ . '/../..' . '/sources/Controller/OAuth/OAuthWizardController.php',
'Combodo\\iTop\\Controller\\PreferencesController' => __DIR__ . '/../..' . '/sources/Controller/PreferencesController.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientProvider' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/IOAuthClientProvider.php',
- 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientResultDisplay' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/IOAuthClientResultDisplay.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAbstract' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAbstract.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAzure' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAzure.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderFactory' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderFactory.php',
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderGoogle' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderGoogle.php',
- 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientResultDisplayConf' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientResultDisplayConf.php',
'Combodo\\iTop\\Core\\CMDBChange\\CMDBChangeOrigin' => __DIR__ . '/../..' . '/sources/Core/CMDBChange/CMDBChangeOrigin.php',
'Combodo\\iTop\\Core\\DbConnectionWrapper' => __DIR__ . '/../..' . '/core/DbConnectionWrapper.php',
'Combodo\\iTop\\Core\\Email\\EmailFactory' => __DIR__ . '/../..' . '/sources/Core/Email/EmailFactory.php',
@@ -764,7 +779,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'DashletProxy' => __DIR__ . '/../..' . '/application/dashlet.class.inc.php',
'DashletUnknown' => __DIR__ . '/../..' . '/application/dashlet.class.inc.php',
'DataTable' => __DIR__ . '/../..' . '/application/datatable.class.inc.php',
- 'DataTableConfig' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php',
+ 'DataTableConfig' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php',
'Datamatrix' => __DIR__ . '/..' . '/combodo/tcpdf/include/barcodes/datamatrix.php',
'DateTimeFormat' => __DIR__ . '/../..' . '/core/datetimeformat.class.inc.php',
'DeadLockLog' => __DIR__ . '/../..' . '/core/log.class.inc.php',
@@ -800,12 +815,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'DisplayableGroupNode' => __DIR__ . '/../..' . '/core/displayablegraph.class.inc.php',
'DisplayableNode' => __DIR__ . '/../..' . '/core/displayablegraph.class.inc.php',
'DisplayableRedundancyNode' => __DIR__ . '/../..' . '/core/displayablegraph.class.inc.php',
- 'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
- 'DownloadPage' => __DIR__ . '/../..' . '/sources/application/WebPage/DownloadPage.php',
+ 'DownloadPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/DownloadPage.php',
'EMail' => __DIR__ . '/../..' . '/core/email.class.inc.php',
'EMailLaminas' => __DIR__ . '/../..' . '/sources/Core/Email/EmailLaminas.php',
- 'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
- 'ErrorPage' => __DIR__ . '/../..' . '/sources/application/WebPage/ErrorPage.php',
+ 'ErrorPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/ErrorPage.php',
'Event' => __DIR__ . '/../..' . '/core/event.class.inc.php',
'EventIssue' => __DIR__ . '/../..' . '/core/event.class.inc.php',
'EventLoginUsage' => __DIR__ . '/../..' . '/core/event.class.inc.php',
@@ -914,6 +927,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php',
'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php',
'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php',
+ 'GuzzleHttp\\Psr7\\UriComparator' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriComparator.php',
'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php',
'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php',
'GuzzleHttp\\Psr7\\Utils' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Utils.php',
@@ -945,7 +959,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'ItopCounter' => __DIR__ . '/../..' . '/core/counter.class.inc.php',
'JSButtonItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
'JSPopupMenuItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
- 'JsonPage' => __DIR__ . '/../..' . '/sources/application/WebPage/JsonPage.php',
+ 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
+ 'JsonPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/JsonPage.php',
'KeyValueStore' => __DIR__ . '/../..' . '/core/counter.class.inc.php',
'Laminas\\Loader\\AutoloaderFactory' => __DIR__ . '/..' . '/laminas/laminas-loader/src/AutoloaderFactory.php',
'Laminas\\Loader\\ClassMapAutoloader' => __DIR__ . '/..' . '/laminas/laminas-loader/src/ClassMapAutoloader.php',
@@ -1325,7 +1340,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'NestedQueryOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
'NewObjectMenuNode' => __DIR__ . '/../..' . '/application/menunode.class.inc.php',
'NewsroomProviderBase' => __DIR__ . '/../..' . '/application/newsroomprovider.class.inc.php',
- 'NiceWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/NiceWebPage.php',
+ 'NiceWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/NiceWebPage.php',
'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
'NotYetEvaluatedExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php',
'OQLActualClassTreeResolver' => __DIR__ . '/../..' . '/core/oqlactualclasstreeresolver.class.inc.php',
@@ -1362,12 +1377,11 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'OqlUnionQuery' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
'PDF417' => __DIR__ . '/..' . '/combodo/tcpdf/include/barcodes/pdf417.php',
'PDFBulkExport' => __DIR__ . '/../..' . '/core/pdfbulkexport.class.inc.php',
- 'PDFPage' => __DIR__ . '/../..' . '/sources/application/WebPage/PDFPage.php',
+ 'PDFPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/PDFPage.php',
'PEAR' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/PEAR.php',
'PEAR_ErrorStack' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/PEAR/ErrorStack.php',
'PEAR_Exception' => __DIR__ . '/..' . '/pear/pear_exception/PEAR/Exception.php',
- 'Page' => __DIR__ . '/../..' . '/sources/application/WebPage/Page.php',
- 'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
+ 'Page' => __DIR__ . '/../..' . '/sources/Application/WebPage/Page.php',
'Pelago\\Emogrifier' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier.php',
'Pelago\\Emogrifier\\CssInliner' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/CssInliner.php',
'Pelago\\Emogrifier\\HtmlProcessor\\AbstractHtmlProcessor' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/AbstractHtmlProcessor.php',
@@ -1625,6 +1639,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php',
'PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php',
'PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php',
+ 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
'PluginInstanciationManager' => __DIR__ . '/../..' . '/core/plugininstanciationmanager.class.inc.php',
'PluginManager' => __DIR__ . '/../..' . '/core/pluginmanager.class.inc.php',
'PortalDispatcher' => __DIR__ . '/../..' . '/application/portaldispatcher.class.inc.php',
@@ -1640,6 +1655,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php',
'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',
'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php',
+ 'Psr\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/EventDispatcherInterface.php',
+ 'Psr\\EventDispatcher\\ListenerProviderInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/ListenerProviderInterface.php',
+ 'Psr\\EventDispatcher\\StoppableEventInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/StoppableEventInterface.php',
'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',
@@ -1655,9 +1673,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
- 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php',
- 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php',
- 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php',
'QRcode' => __DIR__ . '/..' . '/combodo/tcpdf/include/barcodes/qrcode.php',
'Query' => __DIR__ . '/../..' . '/application/query.class.inc.php',
'QueryOQL' => __DIR__ . '/../..' . '/application/query.class.inc.php',
@@ -1673,6 +1688,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'RestResultWithObjects' => __DIR__ . '/../..' . '/core/restservices.class.inc.php',
'RestResultWithRelations' => __DIR__ . '/../..' . '/core/restservices.class.inc.php',
'RestUtils' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
+ 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php',
'RotatingLogFileNameBuilder' => __DIR__ . '/../..' . '/core/log.class.inc.php',
'RowStatus' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php',
'RowStatus_Disappeared' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php',
@@ -1692,13 +1708,29 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'ScalarOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
'ScssPhp\\ScssPhp\\Base\\Range' => __DIR__ . '/..' . '/scssphp/scssphp/src/Base/Range.php',
'ScssPhp\\ScssPhp\\Block' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block.php',
+ 'ScssPhp\\ScssPhp\\Block\\AtRootBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/AtRootBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\CallableBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/CallableBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ContentBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ContentBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\DirectiveBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/DirectiveBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\EachBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/EachBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ElseBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ElseBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ElseifBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ElseifBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\ForBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ForBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\IfBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/IfBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\MediaBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/MediaBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\NestedPropertyBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/NestedPropertyBlock.php',
+ 'ScssPhp\\ScssPhp\\Block\\WhileBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/WhileBlock.php',
'ScssPhp\\ScssPhp\\Cache' => __DIR__ . '/..' . '/scssphp/scssphp/src/Cache.php',
'ScssPhp\\ScssPhp\\Colors' => __DIR__ . '/..' . '/scssphp/scssphp/src/Colors.php',
+ 'ScssPhp\\ScssPhp\\CompilationResult' => __DIR__ . '/..' . '/scssphp/scssphp/src/CompilationResult.php',
'ScssPhp\\ScssPhp\\Compiler' => __DIR__ . '/..' . '/scssphp/scssphp/src/Compiler.php',
+ 'ScssPhp\\ScssPhp\\Compiler\\CachedResult' => __DIR__ . '/..' . '/scssphp/scssphp/src/Compiler/CachedResult.php',
'ScssPhp\\ScssPhp\\Compiler\\Environment' => __DIR__ . '/..' . '/scssphp/scssphp/src/Compiler/Environment.php',
'ScssPhp\\ScssPhp\\Exception\\CompilerException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/CompilerException.php',
'ScssPhp\\ScssPhp\\Exception\\ParserException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/ParserException.php',
'ScssPhp\\ScssPhp\\Exception\\RangeException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/RangeException.php',
+ 'ScssPhp\\ScssPhp\\Exception\\SassException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/SassException.php',
+ 'ScssPhp\\ScssPhp\\Exception\\SassScriptException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/SassScriptException.php',
'ScssPhp\\ScssPhp\\Exception\\ServerException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/ServerException.php',
'ScssPhp\\ScssPhp\\Formatter' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter.php',
'ScssPhp\\ScssPhp\\Formatter\\Compact' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Compact.php',
@@ -1708,19 +1740,25 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'ScssPhp\\ScssPhp\\Formatter\\Expanded' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Expanded.php',
'ScssPhp\\ScssPhp\\Formatter\\Nested' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Nested.php',
'ScssPhp\\ScssPhp\\Formatter\\OutputBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/OutputBlock.php',
+ 'ScssPhp\\ScssPhp\\Logger\\LoggerInterface' => __DIR__ . '/..' . '/scssphp/scssphp/src/Logger/LoggerInterface.php',
+ 'ScssPhp\\ScssPhp\\Logger\\QuietLogger' => __DIR__ . '/..' . '/scssphp/scssphp/src/Logger/QuietLogger.php',
+ 'ScssPhp\\ScssPhp\\Logger\\StreamLogger' => __DIR__ . '/..' . '/scssphp/scssphp/src/Logger/StreamLogger.php',
'ScssPhp\\ScssPhp\\Node' => __DIR__ . '/..' . '/scssphp/scssphp/src/Node.php',
'ScssPhp\\ScssPhp\\Node\\Number' => __DIR__ . '/..' . '/scssphp/scssphp/src/Node/Number.php',
+ 'ScssPhp\\ScssPhp\\OutputStyle' => __DIR__ . '/..' . '/scssphp/scssphp/src/OutputStyle.php',
'ScssPhp\\ScssPhp\\Parser' => __DIR__ . '/..' . '/scssphp/scssphp/src/Parser.php',
'ScssPhp\\ScssPhp\\SourceMap\\Base64' => __DIR__ . '/..' . '/scssphp/scssphp/src/SourceMap/Base64.php',
'ScssPhp\\ScssPhp\\SourceMap\\Base64VLQ' => __DIR__ . '/..' . '/scssphp/scssphp/src/SourceMap/Base64VLQ.php',
'ScssPhp\\ScssPhp\\SourceMap\\SourceMapGenerator' => __DIR__ . '/..' . '/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php',
'ScssPhp\\ScssPhp\\Type' => __DIR__ . '/..' . '/scssphp/scssphp/src/Type.php',
'ScssPhp\\ScssPhp\\Util' => __DIR__ . '/..' . '/scssphp/scssphp/src/Util.php',
+ 'ScssPhp\\ScssPhp\\Util\\Path' => __DIR__ . '/..' . '/scssphp/scssphp/src/Util/Path.php',
+ 'ScssPhp\\ScssPhp\\ValueConverter' => __DIR__ . '/..' . '/scssphp/scssphp/src/ValueConverter.php',
'ScssPhp\\ScssPhp\\Version' => __DIR__ . '/..' . '/scssphp/scssphp/src/Version.php',
+ 'ScssPhp\\ScssPhp\\Warn' => __DIR__ . '/..' . '/scssphp/scssphp/src/Warn.php',
'SearchMenuNode' => __DIR__ . '/../..' . '/application/menunode.class.inc.php',
'SecurityException' => __DIR__ . '/../..' . '/application/exceptions/SecurityException.php',
'SeparatorPopupMenuItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
- 'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
'SetupLog' => __DIR__ . '/../..' . '/core/log.class.inc.php',
'Shortcut' => __DIR__ . '/../..' . '/application/shortcut.class.inc.php',
'ShortcutContainerMenuNode' => __DIR__ . '/../..' . '/application/menunode.class.inc.php',
@@ -1739,32 +1777,38 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'StimulusInternal' => __DIR__ . '/../..' . '/core/stimulus.class.inc.php',
'StimulusUserAction' => __DIR__ . '/../..' . '/core/stimulus.class.inc.php',
'Str' => __DIR__ . '/../..' . '/core/MyHelpers.class.inc.php',
+ 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
'Symfony\\Bridge\\Twig\\AppVariable' => __DIR__ . '/..' . '/symfony/twig-bridge/AppVariable.php',
'Symfony\\Bridge\\Twig\\Command\\DebugCommand' => __DIR__ . '/..' . '/symfony/twig-bridge/Command/DebugCommand.php',
'Symfony\\Bridge\\Twig\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/twig-bridge/Command/LintCommand.php',
'Symfony\\Bridge\\Twig\\DataCollector\\TwigDataCollector' => __DIR__ . '/..' . '/symfony/twig-bridge/DataCollector/TwigDataCollector.php',
+ 'Symfony\\Bridge\\Twig\\ErrorRenderer\\TwigErrorRenderer' => __DIR__ . '/..' . '/symfony/twig-bridge/ErrorRenderer/TwigErrorRenderer.php',
'Symfony\\Bridge\\Twig\\Extension\\AssetExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/AssetExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\CodeExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/CodeExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\CsrfExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/CsrfExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\CsrfRuntime' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/CsrfRuntime.php',
'Symfony\\Bridge\\Twig\\Extension\\DumpExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/DumpExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\ExpressionExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/ExpressionExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\FormExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/FormExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\HttpFoundationExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/HttpFoundationExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\HttpKernelExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/HttpKernelExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\HttpKernelRuntime' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/HttpKernelRuntime.php',
- 'Symfony\\Bridge\\Twig\\Extension\\InitRuntimeInterface' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/InitRuntimeInterface.php',
'Symfony\\Bridge\\Twig\\Extension\\LogoutUrlExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/LogoutUrlExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/ProfilerExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\RoutingExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/RoutingExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\SecurityExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/SecurityExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\SerializerExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/SerializerExtension.php',
+ 'Symfony\\Bridge\\Twig\\Extension\\SerializerRuntime' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/SerializerRuntime.php',
'Symfony\\Bridge\\Twig\\Extension\\StopwatchExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/StopwatchExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\TranslationExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/TranslationExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\WebLinkExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/WebLinkExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\WorkflowExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/WorkflowExtension.php',
'Symfony\\Bridge\\Twig\\Extension\\YamlExtension' => __DIR__ . '/..' . '/symfony/twig-bridge/Extension/YamlExtension.php',
- 'Symfony\\Bridge\\Twig\\Form\\TwigRenderer' => __DIR__ . '/..' . '/symfony/twig-bridge/Form/TwigRenderer.php',
'Symfony\\Bridge\\Twig\\Form\\TwigRendererEngine' => __DIR__ . '/..' . '/symfony/twig-bridge/Form/TwigRendererEngine.php',
- 'Symfony\\Bridge\\Twig\\Form\\TwigRendererEngineInterface' => __DIR__ . '/..' . '/symfony/twig-bridge/Form/TwigRendererEngineInterface.php',
- 'Symfony\\Bridge\\Twig\\Form\\TwigRendererInterface' => __DIR__ . '/..' . '/symfony/twig-bridge/Form/TwigRendererInterface.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\BodyRenderer' => __DIR__ . '/..' . '/symfony/twig-bridge/Mime/BodyRenderer.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\NotificationEmail' => __DIR__ . '/..' . '/symfony/twig-bridge/Mime/NotificationEmail.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\TemplatedEmail' => __DIR__ . '/..' . '/symfony/twig-bridge/Mime/TemplatedEmail.php',
+ 'Symfony\\Bridge\\Twig\\Mime\\WrappedTemplatedEmail' => __DIR__ . '/..' . '/symfony/twig-bridge/Mime/WrappedTemplatedEmail.php',
'Symfony\\Bridge\\Twig\\NodeVisitor\\Scope' => __DIR__ . '/..' . '/symfony/twig-bridge/NodeVisitor/Scope.php',
'Symfony\\Bridge\\Twig\\NodeVisitor\\TranslationDefaultDomainNodeVisitor' => __DIR__ . '/..' . '/symfony/twig-bridge/NodeVisitor/TranslationDefaultDomainNodeVisitor.php',
'Symfony\\Bridge\\Twig\\NodeVisitor\\TranslationNodeVisitor' => __DIR__ . '/..' . '/symfony/twig-bridge/NodeVisitor/TranslationNodeVisitor.php',
@@ -1778,38 +1822,42 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Bridge\\Twig\\TokenParser\\DumpTokenParser' => __DIR__ . '/..' . '/symfony/twig-bridge/TokenParser/DumpTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\FormThemeTokenParser' => __DIR__ . '/..' . '/symfony/twig-bridge/TokenParser/FormThemeTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\StopwatchTokenParser' => __DIR__ . '/..' . '/symfony/twig-bridge/TokenParser/StopwatchTokenParser.php',
- 'Symfony\\Bridge\\Twig\\TokenParser\\TransChoiceTokenParser' => __DIR__ . '/..' . '/symfony/twig-bridge/TokenParser/TransChoiceTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\TransDefaultDomainTokenParser' => __DIR__ . '/..' . '/symfony/twig-bridge/TokenParser/TransDefaultDomainTokenParser.php',
'Symfony\\Bridge\\Twig\\TokenParser\\TransTokenParser' => __DIR__ . '/..' . '/symfony/twig-bridge/TokenParser/TransTokenParser.php',
'Symfony\\Bridge\\Twig\\Translation\\TwigExtractor' => __DIR__ . '/..' . '/symfony/twig-bridge/Translation/TwigExtractor.php',
- 'Symfony\\Bridge\\Twig\\TwigEngine' => __DIR__ . '/..' . '/symfony/twig-bridge/TwigEngine.php',
'Symfony\\Bridge\\Twig\\UndefinedCallableHandler' => __DIR__ . '/..' . '/symfony/twig-bridge/UndefinedCallableHandler.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AbstractPhpFileCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AnnotationsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ClassCacheCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/ClassCacheCacheWarmer.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\CachePoolClearerCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ConfigBuilderCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\RouterCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\SerializerCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinder' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TemplateFinder.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplateFinderInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php',
- 'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TemplatePathsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TranslationsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php',
'Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ValidatorCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Client' => __DIR__ . '/..' . '/symfony/framework-bundle/Client.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\AboutCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AboutCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\AbstractConfigCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AbstractConfigCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\AssetsInstallCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AssetsInstallCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\BuildDebugContainerTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/BuildDebugContainerTrait.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheClearCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CacheClearCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolClearCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolClearCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolDeleteCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolDeleteCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolListCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolListCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolPruneCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolPruneCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\CacheWarmupCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CacheWarmupCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ConfigDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDumpReferenceCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerAwareCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerAwareCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerDebugCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerLintCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerLintCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\DebugAutowiringCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/DebugAutowiringCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\EventDispatcherDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/RouterDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\RouterMatchCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/RouterMatchCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsDecryptToLocalCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsEncryptFromLocalCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsGenerateKeysCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsListCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsListCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsRemoveCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsRemoveCommand.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsSetCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsSetCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/TranslationDebugCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationUpdateCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/TranslationUpdateCommand.php',
'Symfony\\Bundle\\FrameworkBundle\\Command\\WorkflowDumpCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/WorkflowDumpCommand.php',
@@ -1823,89 +1871,46 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php',
'Symfony\\Bundle\\FrameworkBundle\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Helper/DescriptorHelper.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/AbstractController.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/Controller.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerNameParser' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/ControllerNameParser.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/ControllerResolver.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/ControllerTrait.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/RedirectController.php',
'Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/TemplateController.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RequestDataCollector' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/RequestDataCollector.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\AbstractDataCollector' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/AbstractDataCollector.php',
'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RouterDataCollector' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/RouterDataCollector.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DataCollector\\TemplateAwareDataCollectorInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/TemplateAwareDataCollectorInterface.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddAnnotationsCachedReaderPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddCacheClearerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddCacheClearerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddCacheWarmerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddCacheWarmerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddConsoleCommandPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddConstraintValidatorsPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddConstraintValidatorsPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddDebugLogProcessorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddValidatorInitializersPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddValidatorInitializersPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CacheCollectorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CacheCollectorPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolClearerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CachePoolPrunerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\CompilerDebugDumpPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/CompilerDebugDumpPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ConfigCachePass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ConfigCachePass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AssetsContextPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AssetsContextPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ContainerBuilderDebugDumpPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ControllerArgumentValueResolverPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ControllerArgumentValueResolverPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\DataCollectorTranslatorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\FormPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/FormPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\LoggingTranslatorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ProfilerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\PropertyInfoPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/PropertyInfoPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\RoutingResolverPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/RoutingResolverPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SerializerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/SerializerPass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\RemoveUnusedSessionMarshallingHandlerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/RemoveUnusedSessionMarshallingHandlerPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\SessionPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TemplatingPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TemplatingPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslationDumperPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslationDumperPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslationExtractorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslationExtractorPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslatorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslatorPass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerRealRefPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerWeakRefPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\UnusedTagsPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php',
- 'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ValidateWorkflowsPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ValidateWorkflowsPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\WorkflowGuardListenerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Configuration' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Configuration.php',
'Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\FrameworkExtension' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php',
- 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\ResolveControllerNameSubscriber' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/ResolveControllerNameSubscriber.php',
- 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/SessionListener.php',
- 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\TestSessionListener' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/TestSessionListener.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SuggestMissingPackageSubscriber' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php',
'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle' => __DIR__ . '/..' . '/symfony/framework-bundle/FrameworkBundle.php',
'Symfony\\Bundle\\FrameworkBundle\\HttpCache\\HttpCache' => __DIR__ . '/..' . '/symfony/framework-bundle/HttpCache/HttpCache.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\KernelBrowser' => __DIR__ . '/..' . '/symfony/framework-bundle/KernelBrowser.php',
'Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Kernel/MicroKernelTrait.php',
'Symfony\\Bundle\\FrameworkBundle\\Routing\\AnnotatedRouteControllerLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php',
'Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/DelegatingLoader.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableUrlMatcher' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RedirectableUrlMatcher.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Routing\\RouteLoaderInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RouteLoaderInterface.php',
'Symfony\\Bundle\\FrameworkBundle\\Routing\\Router' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/Router.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\DelegatingEngine' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/DelegatingEngine.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\EngineInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/EngineInterface.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\GlobalVariables' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/GlobalVariables.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\ActionsHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/ActionsHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\AssetsHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/AssetsHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\CodeHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/CodeHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\FormHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/FormHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RequestHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/RequestHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RouterHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/RouterHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\SessionHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/SessionHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\StopwatchHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/StopwatchHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\TranslatorHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Helper/TranslatorHelper.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Loader/FilesystemLoader.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\TemplateLocator' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/Loader/TemplateLocator.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/PhpEngine.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateFilenameParser' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TemplateFilenameParser.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateNameParser' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TemplateNameParser.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateReference' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TemplateReference.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Templating\\TimedPhpEngine' => __DIR__ . '/..' . '/symfony/framework-bundle/Templating/TimedPhpEngine.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Translation\\PhpExtractor' => __DIR__ . '/..' . '/symfony/framework-bundle/Translation/PhpExtractor.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Translation\\PhpStringTokenParser' => __DIR__ . '/..' . '/symfony/framework-bundle/Translation/PhpStringTokenParser.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Translation\\TranslationLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Translation/TranslationLoader.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Secrets\\AbstractVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/AbstractVault.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Secrets\\DotenvVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/DotenvVault.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Secrets\\SodiumVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/SodiumVault.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Session\\DeprecatedSessionFactory' => __DIR__ . '/..' . '/symfony/framework-bundle/Session/DeprecatedSessionFactory.php',
+ 'Symfony\\Bundle\\FrameworkBundle\\Session\\ServiceSessionFactory' => __DIR__ . '/..' . '/symfony/framework-bundle/Session/ServiceSessionFactory.php',
'Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/framework-bundle/Translation/Translator.php',
- 'Symfony\\Bundle\\FrameworkBundle\\Validator\\ConstraintValidatorFactory' => __DIR__ . '/..' . '/symfony/framework-bundle/Validator/ConstraintValidatorFactory.php',
- 'Symfony\\Bundle\\TwigBundle\\CacheWarmer\\TemplateCacheCacheWarmer' => __DIR__ . '/..' . '/symfony/twig-bundle/CacheWarmer/TemplateCacheCacheWarmer.php',
'Symfony\\Bundle\\TwigBundle\\CacheWarmer\\TemplateCacheWarmer' => __DIR__ . '/..' . '/symfony/twig-bundle/CacheWarmer/TemplateCacheWarmer.php',
- 'Symfony\\Bundle\\TwigBundle\\Command\\DebugCommand' => __DIR__ . '/..' . '/symfony/twig-bundle/Command/DebugCommand.php',
'Symfony\\Bundle\\TwigBundle\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/twig-bundle/Command/LintCommand.php',
- 'Symfony\\Bundle\\TwigBundle\\ContainerAwareRuntimeLoader' => __DIR__ . '/..' . '/symfony/twig-bundle/ContainerAwareRuntimeLoader.php',
- 'Symfony\\Bundle\\TwigBundle\\Controller\\ExceptionController' => __DIR__ . '/..' . '/symfony/twig-bundle/Controller/ExceptionController.php',
- 'Symfony\\Bundle\\TwigBundle\\Controller\\PreviewErrorController' => __DIR__ . '/..' . '/symfony/twig-bundle/Controller/PreviewErrorController.php',
- 'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\ExceptionListenerPass' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/Compiler/ExceptionListenerPass.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\ExtensionPass' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/Compiler/ExtensionPass.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\RuntimeLoaderPass' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/Compiler/RuntimeLoaderPass.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Compiler\\TwigEnvironmentPass' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/Compiler/TwigEnvironmentPass.php',
@@ -1913,11 +1918,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Configuration' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/Configuration.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\Configurator\\EnvironmentConfigurator' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/Configurator/EnvironmentConfigurator.php',
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\TwigExtension' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/TwigExtension.php',
- 'Symfony\\Bundle\\TwigBundle\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/symfony/twig-bundle/Loader/FilesystemLoader.php',
'Symfony\\Bundle\\TwigBundle\\TemplateIterator' => __DIR__ . '/..' . '/symfony/twig-bundle/TemplateIterator.php',
'Symfony\\Bundle\\TwigBundle\\TwigBundle' => __DIR__ . '/..' . '/symfony/twig-bundle/TwigBundle.php',
- 'Symfony\\Bundle\\TwigBundle\\TwigEngine' => __DIR__ . '/..' . '/symfony/twig-bundle/TwigEngine.php',
- 'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ExceptionController' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Controller/ExceptionController.php',
+ 'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ExceptionPanelController' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Controller/ExceptionPanelController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ProfilerController' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Controller/ProfilerController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\RouterController' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Controller/RouterController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Csp\\ContentSecurityPolicyHandler' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Csp/ContentSecurityPolicyHandler.php',
@@ -1929,66 +1932,68 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Twig/WebProfilerExtension.php',
'Symfony\\Bundle\\WebProfilerBundle\\WebProfilerBundle' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/WebProfilerBundle.php',
'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/AdapterInterface.php',
'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ApcuAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ArrayAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ChainAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineDbalAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/MemcachedAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/NullAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => __DIR__ . '/..' . '/symfony/cache/Adapter/ParameterNormalizer.php',
'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PdoAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpArrayAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpFilesAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ProxyAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/Psr16Adapter.php',
'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisAdapter.php',
- 'Symfony\\Component\\Cache\\Adapter\\SimpleCacheAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/SimpleCacheAdapter.php',
+ 'Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
'Symfony\\Component\\Cache\\CacheItem' => __DIR__ . '/..' . '/symfony/cache/CacheItem.php',
'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => __DIR__ . '/..' . '/symfony/cache/DataCollector/CacheDataCollector.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CacheCollectorPass.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPass.php',
+ 'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php',
'Symfony\\Component\\Cache\\DoctrineProvider' => __DIR__ . '/..' . '/symfony/cache/DoctrineProvider.php',
'Symfony\\Component\\Cache\\Exception\\CacheException' => __DIR__ . '/..' . '/symfony/cache/Exception/CacheException.php',
'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/cache/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Cache\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/cache/Exception/LogicException.php',
+ 'Symfony\\Component\\Cache\\LockRegistry' => __DIR__ . '/..' . '/symfony/cache/LockRegistry.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DefaultMarshaller.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DeflateMarshaller.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => __DIR__ . '/..' . '/symfony/cache/Marshaller/MarshallerInterface.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/SodiumMarshaller.php',
+ 'Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/TagAwareMarshaller.php',
+ 'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php',
+ 'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationHandler.php',
+ 'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationMessage.php',
'Symfony\\Component\\Cache\\PruneableInterface' => __DIR__ . '/..' . '/symfony/cache/PruneableInterface.php',
+ 'Symfony\\Component\\Cache\\Psr16Cache' => __DIR__ . '/..' . '/symfony/cache/Psr16Cache.php',
'Symfony\\Component\\Cache\\ResettableInterface' => __DIR__ . '/..' . '/symfony/cache/ResettableInterface.php',
- 'Symfony\\Component\\Cache\\Simple\\AbstractCache' => __DIR__ . '/..' . '/symfony/cache/Simple/AbstractCache.php',
- 'Symfony\\Component\\Cache\\Simple\\ApcuCache' => __DIR__ . '/..' . '/symfony/cache/Simple/ApcuCache.php',
- 'Symfony\\Component\\Cache\\Simple\\ArrayCache' => __DIR__ . '/..' . '/symfony/cache/Simple/ArrayCache.php',
- 'Symfony\\Component\\Cache\\Simple\\ChainCache' => __DIR__ . '/..' . '/symfony/cache/Simple/ChainCache.php',
- 'Symfony\\Component\\Cache\\Simple\\DoctrineCache' => __DIR__ . '/..' . '/symfony/cache/Simple/DoctrineCache.php',
- 'Symfony\\Component\\Cache\\Simple\\FilesystemCache' => __DIR__ . '/..' . '/symfony/cache/Simple/FilesystemCache.php',
- 'Symfony\\Component\\Cache\\Simple\\MemcachedCache' => __DIR__ . '/..' . '/symfony/cache/Simple/MemcachedCache.php',
- 'Symfony\\Component\\Cache\\Simple\\NullCache' => __DIR__ . '/..' . '/symfony/cache/Simple/NullCache.php',
- 'Symfony\\Component\\Cache\\Simple\\PdoCache' => __DIR__ . '/..' . '/symfony/cache/Simple/PdoCache.php',
- 'Symfony\\Component\\Cache\\Simple\\PhpArrayCache' => __DIR__ . '/..' . '/symfony/cache/Simple/PhpArrayCache.php',
- 'Symfony\\Component\\Cache\\Simple\\PhpFilesCache' => __DIR__ . '/..' . '/symfony/cache/Simple/PhpFilesCache.php',
- 'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => __DIR__ . '/..' . '/symfony/cache/Simple/Psr6Cache.php',
- 'Symfony\\Component\\Cache\\Simple\\RedisCache' => __DIR__ . '/..' . '/symfony/cache/Simple/RedisCache.php',
- 'Symfony\\Component\\Cache\\Simple\\TraceableCache' => __DIR__ . '/..' . '/symfony/cache/Simple/TraceableCache.php',
- 'Symfony\\Component\\Cache\\Traits\\AbstractTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\ApcuTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ApcuTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\ArrayTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ArrayTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\DoctrineTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/DoctrineTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractAdapterTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\ContractsTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ContractsTrait.php',
'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemCommonTrait.php',
'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\MemcachedTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/MemcachedTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\PdoTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/PdoTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\PhpArrayTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/PhpArrayTrait.php',
- 'Symfony\\Component\\Cache\\Traits\\PhpFilesTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/PhpFilesTrait.php',
'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ProxyTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterNodeProxy.php',
+ 'Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterProxy.php',
'Symfony\\Component\\Cache\\Traits\\RedisProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisProxy.php',
'Symfony\\Component\\Cache\\Traits\\RedisTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisTrait.php',
- 'Symfony\\Component\\ClassLoader\\ApcClassLoader' => __DIR__ . '/..' . '/symfony/class-loader/ApcClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\ClassCollectionLoader' => __DIR__ . '/..' . '/symfony/class-loader/ClassCollectionLoader.php',
- 'Symfony\\Component\\ClassLoader\\ClassLoader' => __DIR__ . '/..' . '/symfony/class-loader/ClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\ClassMapGenerator' => __DIR__ . '/..' . '/symfony/class-loader/ClassMapGenerator.php',
- 'Symfony\\Component\\ClassLoader\\MapClassLoader' => __DIR__ . '/..' . '/symfony/class-loader/MapClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\Psr4ClassLoader' => __DIR__ . '/..' . '/symfony/class-loader/Psr4ClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\WinCacheClassLoader' => __DIR__ . '/..' . '/symfony/class-loader/WinCacheClassLoader.php',
- 'Symfony\\Component\\ClassLoader\\XcacheClassLoader' => __DIR__ . '/..' . '/symfony/class-loader/XcacheClassLoader.php',
+ 'Symfony\\Component\\Config\\Builder\\ClassBuilder' => __DIR__ . '/..' . '/symfony/config/Builder/ClassBuilder.php',
+ 'Symfony\\Component\\Config\\Builder\\ConfigBuilderGenerator' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderGenerator.php',
+ 'Symfony\\Component\\Config\\Builder\\ConfigBuilderGeneratorInterface' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderGeneratorInterface.php',
+ 'Symfony\\Component\\Config\\Builder\\ConfigBuilderInterface' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderInterface.php',
+ 'Symfony\\Component\\Config\\Builder\\Method' => __DIR__ . '/..' . '/symfony/config/Builder/Method.php',
+ 'Symfony\\Component\\Config\\Builder\\Property' => __DIR__ . '/..' . '/symfony/config/Builder/Property.php',
'Symfony\\Component\\Config\\ConfigCache' => __DIR__ . '/..' . '/symfony/config/ConfigCache.php',
'Symfony\\Component\\Config\\ConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactory.php',
'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactoryInterface.php',
@@ -1998,6 +2003,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Config\\Definition\\BooleanNode' => __DIR__ . '/..' . '/symfony/config/Definition/BooleanNode.php',
'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php',
'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BuilderAwareInterface.php',
'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/EnumNodeDefinition.php',
'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ExprBuilder.php',
'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/FloatNodeDefinition.php',
@@ -2033,10 +2039,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypedArrayNode.php',
'Symfony\\Component\\Config\\Definition\\ScalarNode' => __DIR__ . '/..' . '/symfony/config/Definition/ScalarNode.php',
'Symfony\\Component\\Config\\Definition\\VariableNode' => __DIR__ . '/..' . '/symfony/config/Definition/VariableNode.php',
- 'Symfony\\Component\\Config\\DependencyInjection\\ConfigCachePass' => __DIR__ . '/..' . '/symfony/config/DependencyInjection/ConfigCachePass.php',
'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php',
- 'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderLoadException.php',
'Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLocatorFileNotFoundException.php',
+ 'Symfony\\Component\\Config\\Exception\\LoaderLoadException' => __DIR__ . '/..' . '/symfony/config/Exception/LoaderLoadException.php',
'Symfony\\Component\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/config/FileLocator.php',
'Symfony\\Component\\Config\\FileLocatorInterface' => __DIR__ . '/..' . '/symfony/config/FileLocatorInterface.php',
'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/config/Loader/DelegatingLoader.php',
@@ -2046,6 +2051,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Config\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderInterface.php',
'Symfony\\Component\\Config\\Loader\\LoaderResolver' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolver.php',
'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolverInterface.php',
+ 'Symfony\\Component\\Config\\Loader\\ParamConfigurator' => __DIR__ . '/..' . '/symfony/config/Loader/ParamConfigurator.php',
'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCache.php',
'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCacheFactory.php',
'Symfony\\Component\\Config\\ResourceCheckerInterface' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerInterface.php',
@@ -2063,14 +2069,27 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => __DIR__ . '/..' . '/symfony/config/Util/Exception/XmlParsingException.php',
'Symfony\\Component\\Config\\Util\\XmlUtils' => __DIR__ . '/..' . '/symfony/config/Util/XmlUtils.php',
'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
+ 'Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php',
+ 'Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php',
+ 'Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php',
'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',
+ 'Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php',
+ 'Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php',
'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',
+ 'Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php',
'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',
'Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php',
+ 'Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php',
+ 'Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php',
+ 'Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php',
+ 'Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php',
+ 'Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php',
+ 'Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php',
'Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php',
+ 'Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php',
'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php',
'Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php',
@@ -2083,21 +2102,27 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php',
'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php',
'Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php',
- 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleExceptionEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleSignalEvent.php',
'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php',
'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php',
'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php',
'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php',
'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php',
'Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php',
+ 'Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php',
+ 'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php',
'Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php',
+ 'Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
+ 'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php',
'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php',
'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php',
'Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php',
'Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php',
'Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php',
@@ -2110,6 +2135,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php',
'Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php',
'Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php',
+ 'Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php',
+ 'Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php',
'Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php',
'Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php',
'Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php',
@@ -2126,19 +2153,26 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php',
'Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php',
'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php',
'Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php',
'Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php',
'Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php',
'Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php',
+ 'Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php',
'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php',
'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php',
'Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php',
+ 'Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php',
+ 'Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php',
'Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php',
'Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php',
'Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php',
'Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php',
'Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php',
+ 'Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandCompletionTester.php',
'Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php',
+ 'Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => __DIR__ . '/..' . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php',
+ 'Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php',
'Symfony\\Component\\CssSelector\\CssSelectorConverter' => __DIR__ . '/..' . '/symfony/css-selector/CssSelectorConverter.php',
'Symfony\\Component\\CssSelector\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/css-selector/Exception/ExceptionInterface.php',
'Symfony\\Component\\CssSelector\\Exception\\ExpressionErrorException' => __DIR__ . '/..' . '/symfony/css-selector/Exception/ExpressionErrorException.php',
@@ -2187,72 +2221,67 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\CssSelector\\XPath\\Translator' => __DIR__ . '/..' . '/symfony/css-selector/XPath/Translator.php',
'Symfony\\Component\\CssSelector\\XPath\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/css-selector/XPath/TranslatorInterface.php',
'Symfony\\Component\\CssSelector\\XPath\\XPathExpr' => __DIR__ . '/..' . '/symfony/css-selector/XPath/XPathExpr.php',
- 'Symfony\\Component\\Debug\\BufferingLogger' => __DIR__ . '/..' . '/symfony/debug/BufferingLogger.php',
- 'Symfony\\Component\\Debug\\Debug' => __DIR__ . '/..' . '/symfony/debug/Debug.php',
- 'Symfony\\Component\\Debug\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/debug/DebugClassLoader.php',
- 'Symfony\\Component\\Debug\\ErrorHandler' => __DIR__ . '/..' . '/symfony/debug/ErrorHandler.php',
- 'Symfony\\Component\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/symfony/debug/ExceptionHandler.php',
- 'Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/debug/Exception/ClassNotFoundException.php',
- 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/ContextErrorException.php',
- 'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalErrorException.php',
- 'Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalThrowableError.php',
- 'Symfony\\Component\\Debug\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/debug/Exception/FlattenException.php',
- 'Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => __DIR__ . '/..' . '/symfony/debug/Exception/OutOfMemoryException.php',
- 'Symfony\\Component\\Debug\\Exception\\SilencedErrorContext' => __DIR__ . '/..' . '/symfony/debug/Exception/SilencedErrorContext.php',
- 'Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedFunctionException.php',
- 'Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedMethodException.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php',
- 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php',
'Symfony\\Component\\DependencyInjection\\Alias' => __DIR__ . '/..' . '/symfony/dependency-injection/Alias.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\AbstractArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/AbstractArgument.php',
'Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ArgumentInterface.php',
'Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/BoundArgument.php',
'Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/IteratorArgument.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php',
'Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/RewindableGenerator.php',
'Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceClosureArgument.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceLocator.php',
+ 'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceLocatorArgument.php',
'Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/TaggedIteratorArgument.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\AsTaggedItem' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AsTaggedItem.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\Autoconfigure' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Autoconfigure.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\AutoconfigureTag' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutoconfigureTag.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/TaggedIterator.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/TaggedLocator.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\Target' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Target.php',
+ 'Symfony\\Component\\DependencyInjection\\Attribute\\When' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/When.php',
'Symfony\\Component\\DependencyInjection\\ChildDefinition' => __DIR__ . '/..' . '/symfony/dependency-injection/ChildDefinition.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AbstractRecursivePass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\AliasDeprecatedPublicServicesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\AttributeAutoconfigurationPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AutoAliasServicePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutoAliasServicePass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireExceptionPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireExceptionPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AutowirePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowirePass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredMethodsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredPropertiesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckArgumentsValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\CheckTypeDeclarationsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/Compiler.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CompilerPassInterface.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\DecoratorServicePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/DecoratorServicePass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\DefinitionErrorExceptionPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ExtensionCompilerPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\FactoryReturnTypePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\LoggingFormatter' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/LoggingFormatter.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PassConfig.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterAutoconfigureAttributesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterEnvVarProcessorsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterReverseContainerPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterServiceSubscribersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatablePassInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RepeatablePassInterface.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatedPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RepeatedPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveBindingsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveBindingsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveChildDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveClassPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveClassPass.php',
- 'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDefinitionTemplatesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveDefinitionTemplatesPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDecoratorStackPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveEnvPlaceholdersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveFactoryClassPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveHotPathPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveHotPathPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInstanceofConditionalsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNamedArgumentsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNoPreloadPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolvePrivatesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php',
@@ -2262,7 +2291,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php',
'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php',
- 'Symfony\\Component\\DependencyInjection\\Config\\AutowireServiceResource' => __DIR__ . '/..' . '/symfony/dependency-injection/Config/AutowireServiceResource.php',
+ 'Symfony\\Component\\DependencyInjection\\Compiler\\ValidateEnvPlaceholdersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php',
'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResource' => __DIR__ . '/..' . '/symfony/dependency-injection/Config/ContainerParametersResource.php',
'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResourceChecker' => __DIR__ . '/..' . '/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php',
'Symfony\\Component\\DependencyInjection\\Container' => __DIR__ . '/..' . '/symfony/dependency-injection/Container.php',
@@ -2271,13 +2300,14 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\DependencyInjection\\ContainerBuilder' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerBuilder.php',
'Symfony\\Component\\DependencyInjection\\ContainerInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerInterface.php',
'Symfony\\Component\\DependencyInjection\\Definition' => __DIR__ . '/..' . '/symfony/dependency-injection/Definition.php',
- 'Symfony\\Component\\DependencyInjection\\DefinitionDecorator' => __DIR__ . '/..' . '/symfony/dependency-injection/DefinitionDecorator.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/Dumper.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/DumperInterface.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/GraphvizDumper.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/PhpDumper.php',
+ 'Symfony\\Component\\DependencyInjection\\Dumper\\Preloader' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/Preloader.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/XmlDumper.php',
'Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/YamlDumper.php',
+ 'Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarLoaderInterface.php',
'Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarProcessor.php',
'Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarProcessorInterface.php',
'Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/AutowiringFailedException.php',
@@ -2286,6 +2316,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/EnvParameterException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ExceptionInterface.php',
'Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/InvalidParameterTypeException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/LogicException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/OutOfBoundsException.php',
'Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php',
@@ -2308,8 +2339,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AliasConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php',
+ 'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ClosureReferenceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ContainerConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\DefaultsConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php',
+ 'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\EnvConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InlineServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InstanceofConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php',
'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ParametersConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php',
@@ -2344,45 +2377,72 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/XmlFileLoader.php',
'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/YamlFileLoader.php',
'Symfony\\Component\\DependencyInjection\\Parameter' => __DIR__ . '/..' . '/symfony/dependency-injection/Parameter.php',
+ 'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ContainerBag.php',
+ 'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ParameterBag.php',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php',
'Symfony\\Component\\DependencyInjection\\Reference' => __DIR__ . '/..' . '/symfony/dependency-injection/Reference.php',
- 'Symfony\\Component\\DependencyInjection\\ResettableContainerInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ResettableContainerInterface.php',
+ 'Symfony\\Component\\DependencyInjection\\ReverseContainer' => __DIR__ . '/..' . '/symfony/dependency-injection/ReverseContainer.php',
'Symfony\\Component\\DependencyInjection\\ServiceLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/ServiceLocator.php',
- 'Symfony\\Component\\DependencyInjection\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ServiceSubscriberInterface.php',
'Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/TaggedContainerInterface.php',
'Symfony\\Component\\DependencyInjection\\TypedReference' => __DIR__ . '/..' . '/symfony/dependency-injection/TypedReference.php',
'Symfony\\Component\\DependencyInjection\\Variable' => __DIR__ . '/..' . '/symfony/dependency-injection/Variable.php',
+ 'Symfony\\Component\\Dotenv\\Command\\DebugCommand' => __DIR__ . '/..' . '/symfony/dotenv/Command/DebugCommand.php',
+ 'Symfony\\Component\\Dotenv\\Command\\DotenvDumpCommand' => __DIR__ . '/..' . '/symfony/dotenv/Command/DotenvDumpCommand.php',
'Symfony\\Component\\Dotenv\\Dotenv' => __DIR__ . '/..' . '/symfony/dotenv/Dotenv.php',
'Symfony\\Component\\Dotenv\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/dotenv/Exception/ExceptionInterface.php',
'Symfony\\Component\\Dotenv\\Exception\\FormatException' => __DIR__ . '/..' . '/symfony/dotenv/Exception/FormatException.php',
'Symfony\\Component\\Dotenv\\Exception\\FormatExceptionContext' => __DIR__ . '/..' . '/symfony/dotenv/Exception/FormatExceptionContext.php',
'Symfony\\Component\\Dotenv\\Exception\\PathException' => __DIR__ . '/..' . '/symfony/dotenv/Exception/PathException.php',
- 'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ContainerAwareEventDispatcher.php',
+ 'Symfony\\Component\\ErrorHandler\\BufferingLogger' => __DIR__ . '/..' . '/symfony/error-handler/BufferingLogger.php',
+ 'Symfony\\Component\\ErrorHandler\\Debug' => __DIR__ . '/..' . '/symfony/error-handler/Debug.php',
+ 'Symfony\\Component\\ErrorHandler\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/error-handler/DebugClassLoader.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorHandler' => __DIR__ . '/..' . '/symfony/error-handler/ErrorHandler.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php',
+ 'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => __DIR__ . '/..' . '/symfony/error-handler/Error/ClassNotFoundError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\FatalError' => __DIR__ . '/..' . '/symfony/error-handler/Error/FatalError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => __DIR__ . '/..' . '/symfony/error-handler/Error/OutOfMemoryError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedFunctionError.php',
+ 'Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedMethodError.php',
+ 'Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/error-handler/Exception/FlattenException.php',
+ 'Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => __DIR__ . '/..' . '/symfony/error-handler/Exception/SilencedErrorContext.php',
+ 'Symfony\\Component\\ErrorHandler\\Internal\\TentativeTypes' => __DIR__ . '/..' . '/symfony/error-handler/Internal/TentativeTypes.php',
+ 'Symfony\\Component\\ErrorHandler\\ThrowableUtils' => __DIR__ . '/..' . '/symfony/error-handler/ThrowableUtils.php',
+ 'Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Attribute/AsEventListener.php',
'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php',
- 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php',
'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/WrappedListener.php',
+ 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php',
'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php',
- 'Symfony\\Component\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher/Event.php',
'Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcher.php',
'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcherInterface.php',
'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventSubscriberInterface.php',
'Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/..' . '/symfony/event-dispatcher/GenericEvent.php',
'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php',
+ 'Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => __DIR__ . '/..' . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php',
'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php',
'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php',
'Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php',
'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php',
'Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php',
- 'Symfony\\Component\\Filesystem\\LockHandler' => __DIR__ . '/..' . '/symfony/filesystem/LockHandler.php',
+ 'Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php',
'Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php',
'Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php',
'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php',
'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php',
- 'Symfony\\Component\\Finder\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/finder/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php',
'Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php',
+ 'Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php',
'Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php',
'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php',
@@ -2391,42 +2451,49 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php',
- 'Symfony\\Component\\Finder\\Iterator\\FilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilterIterator.php',
+ 'Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php',
'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php',
'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php',
'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php',
+ 'Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php',
'Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php',
'Symfony\\Component\\HttpFoundation\\AcceptHeader' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeader.php',
'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeaderItem.php',
- 'Symfony\\Component\\HttpFoundation\\ApacheRequest' => __DIR__ . '/..' . '/symfony/http-foundation/ApacheRequest.php',
'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => __DIR__ . '/..' . '/symfony/http-foundation/BinaryFileResponse.php',
'Symfony\\Component\\HttpFoundation\\Cookie' => __DIR__ . '/..' . '/symfony/http-foundation/Cookie.php',
+ 'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/BadRequestException.php',
'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/ConflictingHeadersException.php',
+ 'Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/JsonException.php',
'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/RequestExceptionInterface.php',
+ 'Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SessionNotFoundException.php',
'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SuspiciousOperationException.php',
'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/ExpressionRequestMatcher.php',
'Symfony\\Component\\HttpFoundation\\FileBag' => __DIR__ . '/..' . '/symfony/http-foundation/FileBag.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/AccessDeniedException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/ExtensionFileException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileNotFoundException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FormSizeFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/IniSizeFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php',
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/PartialFileException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php',
'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UploadException.php',
'Symfony\\Component\\HttpFoundation\\File\\File' => __DIR__ . '/..' . '/symfony/http-foundation/File/File.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesser' => __DIR__ . '/..' . '/symfony/http-foundation/File/MimeType/ExtensionGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesserInterface' => __DIR__ . '/..' . '/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileBinaryMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileinfoMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeExtensionGuesser' => __DIR__ . '/..' . '/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesser' => __DIR__ . '/..' . '/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php',
- 'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesserInterface' => __DIR__ . '/..' . '/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php',
'Symfony\\Component\\HttpFoundation\\File\\Stream' => __DIR__ . '/..' . '/symfony/http-foundation/File/Stream.php',
'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => __DIR__ . '/..' . '/symfony/http-foundation/File/UploadedFile.php',
'Symfony\\Component\\HttpFoundation\\HeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderBag.php',
+ 'Symfony\\Component\\HttpFoundation\\HeaderUtils' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderUtils.php',
+ 'Symfony\\Component\\HttpFoundation\\InputBag' => __DIR__ . '/..' . '/symfony/http-foundation/InputBag.php',
'Symfony\\Component\\HttpFoundation\\IpUtils' => __DIR__ . '/..' . '/symfony/http-foundation/IpUtils.php',
'Symfony\\Component\\HttpFoundation\\JsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/JsonResponse.php',
'Symfony\\Component\\HttpFoundation\\ParameterBag' => __DIR__ . '/..' . '/symfony/http-foundation/ParameterBag.php',
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php',
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php',
'Symfony\\Component\\HttpFoundation\\RedirectResponse' => __DIR__ . '/..' . '/symfony/http-foundation/RedirectResponse.php',
'Symfony\\Component\\HttpFoundation\\Request' => __DIR__ . '/..' . '/symfony/http-foundation/Request.php',
'Symfony\\Component\\HttpFoundation\\RequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher.php',
@@ -2444,28 +2511,39 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpFoundation\\Session\\Session' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Session.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagProxy.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionFactory.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionFactoryInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionFactoryInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionUtils.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcacheSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\WriteCheckSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MetadataBag.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php',
- 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\NativeProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\ServiceSessionFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/ServiceSessionFactory.php',
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageFactoryInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php',
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php',
'Symfony\\Component\\HttpFoundation\\StreamedResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedResponse.php',
+ 'Symfony\\Component\\HttpFoundation\\UrlHelper' => __DIR__ . '/..' . '/symfony/http-foundation/UrlHelper.php',
+ 'Symfony\\Component\\HttpKernel\\Attribute\\ArgumentInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/ArgumentInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Attribute\\AsController' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/AsController.php',
'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/Bundle.php',
'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/BundleInterface.php',
'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php',
@@ -2475,8 +2553,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php',
'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php',
'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php',
- 'Symfony\\Component\\HttpKernel\\Client' => __DIR__ . '/..' . '/symfony/http-kernel/Client.php',
- 'Symfony\\Component\\HttpKernel\\Config\\EnvParametersResource' => __DIR__ . '/..' . '/symfony/http-kernel/Config/EnvParametersResource.php',
'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/http-kernel/Config/FileLocator.php',
'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php',
'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php',
@@ -2484,16 +2560,19 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php',
+ 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php',
+ 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php',
'Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ContainerControllerResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerReference.php',
'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolverInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ErrorController.php',
'Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php',
'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableControllerResolver.php',
'Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php',
@@ -2509,11 +2588,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RequestDataCollector.php',
'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RouterDataCollector.php',
'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/TimeDataCollector.php',
- 'Symfony\\Component\\HttpKernel\\DataCollector\\Util\\ValueExporter' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/Util/ValueExporter.php',
'Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/FileLinkFormatter.php',
'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php',
- 'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddClassesToCachePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/AddClassesToCachePass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/Extension.php',
@@ -2522,6 +2599,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/LoggerPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php',
+ 'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php',
'Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php',
@@ -2529,35 +2607,37 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\EventListener\\AbstractTestSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AbstractTestSessionListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DebugHandlersListener.php',
+ 'Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DumpListener.php',
- 'Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ExceptionListener.php',
+ 'Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ErrorListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/FragmentListener.php',
+ 'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleAwareListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ProfilerListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ResponseListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/RouterListener.php',
- 'Symfony\\Component\\HttpKernel\\EventListener\\SaveSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SaveSessionListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SessionListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/StreamedResponseListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SurrogateListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/TestSessionListener.php',
- 'Symfony\\Component\\HttpKernel\\EventListener\\TranslatorListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/TranslatorListener.php',
'Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ValidateRequestListener.php',
- 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerArgumentsEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/FilterControllerArgumentsEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/FilterControllerEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/FilterResponseEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ExceptionEvent.php',
'Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/FinishRequestEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/GetResponseEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/GetResponseForControllerResultEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/GetResponseForExceptionEvent.php',
'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/KernelEvent.php',
- 'Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/PostResponseEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/RequestEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ResponseEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/TerminateEvent.php',
+ 'Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ViewEvent.php',
'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/BadRequestHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ConflictHttpException.php',
+ 'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php',
'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/GoneHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpExceptionInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Exception\\InvalidMetadataException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/InvalidMetadataException.php',
'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php',
@@ -2567,12 +2647,15 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php',
+ 'Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php',
'Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php',
'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php',
'Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentHandler.php',
'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php',
+ 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGenerator' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentUriGenerator.php',
+ 'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGeneratorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php',
'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php',
'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php',
@@ -2587,7 +2670,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/StoreInterface.php',
'Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SubRequestHandler.php',
'Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SurrogateInterface.php',
+ 'Symfony\\Component\\HttpKernel\\HttpClientKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpClientKernel.php',
'Symfony\\Component\\HttpKernel\\HttpKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernel.php',
+ 'Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelBrowser.php',
'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelInterface.php',
'Symfony\\Component\\HttpKernel\\Kernel' => __DIR__ . '/..' . '/symfony/http-kernel/Kernel.php',
'Symfony\\Component\\HttpKernel\\KernelEvents' => __DIR__ . '/..' . '/symfony/http-kernel/KernelEvents.php',
@@ -2601,45 +2686,55 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\HttpKernel\\RebootableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/RebootableInterface.php',
'Symfony\\Component\\HttpKernel\\TerminableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/TerminableInterface.php',
'Symfony\\Component\\HttpKernel\\UriSigner' => __DIR__ . '/..' . '/symfony/http-kernel/UriSigner.php',
+ 'Symfony\\Component\\Routing\\Alias' => __DIR__ . '/..' . '/symfony/routing/Alias.php',
'Symfony\\Component\\Routing\\Annotation\\Route' => __DIR__ . '/..' . '/symfony/routing/Annotation/Route.php',
'Symfony\\Component\\Routing\\CompiledRoute' => __DIR__ . '/..' . '/symfony/routing/CompiledRoute.php',
'Symfony\\Component\\Routing\\DependencyInjection\\RoutingResolverPass' => __DIR__ . '/..' . '/symfony/routing/DependencyInjection/RoutingResolverPass.php',
'Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/routing/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Routing\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/routing/Exception/InvalidArgumentException.php',
'Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => __DIR__ . '/..' . '/symfony/routing/Exception/InvalidParameterException.php',
'Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => __DIR__ . '/..' . '/symfony/routing/Exception/MethodNotAllowedException.php',
'Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => __DIR__ . '/..' . '/symfony/routing/Exception/MissingMandatoryParametersException.php',
'Symfony\\Component\\Routing\\Exception\\NoConfigurationException' => __DIR__ . '/..' . '/symfony/routing/Exception/NoConfigurationException.php',
'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => __DIR__ . '/..' . '/symfony/routing/Exception/ResourceNotFoundException.php',
+ 'Symfony\\Component\\Routing\\Exception\\RouteCircularReferenceException' => __DIR__ . '/..' . '/symfony/routing/Exception/RouteCircularReferenceException.php',
'Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => __DIR__ . '/..' . '/symfony/routing/Exception/RouteNotFoundException.php',
+ 'Symfony\\Component\\Routing\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/routing/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator' => __DIR__ . '/..' . '/symfony/routing/Generator/CompiledUrlGenerator.php',
'Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/ConfigurableRequirementsInterface.php',
+ 'Symfony\\Component\\Routing\\Generator\\Dumper\\CompiledUrlGeneratorDumper' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php',
'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/GeneratorDumper.php',
'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php',
- 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php',
'Symfony\\Component\\Routing\\Generator\\UrlGenerator' => __DIR__ . '/..' . '/symfony/routing/Generator/UrlGenerator.php',
'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/UrlGeneratorInterface.php',
'Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationClassLoader.php',
'Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationDirectoryLoader.php',
'Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationFileLoader.php',
'Symfony\\Component\\Routing\\Loader\\ClosureLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ClosureLoader.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\AliasConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/AliasConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\CollectionConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/CollectionConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\ImportConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/ImportConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\RouteConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/RouteConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/RoutingConfigurator.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\AddTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/AddTrait.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\HostTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/HostTrait.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\LocalizedRouteTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php',
+ 'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\PrefixTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php',
'Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\RouteTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/RouteTrait.php',
- 'Symfony\\Component\\Routing\\Loader\\DependencyInjection\\ServiceRouterLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/DependencyInjection/ServiceRouterLoader.php',
+ 'Symfony\\Component\\Routing\\Loader\\ContainerLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ContainerLoader.php',
'Symfony\\Component\\Routing\\Loader\\DirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/DirectoryLoader.php',
'Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/GlobFileLoader.php',
- 'Symfony\\Component\\Routing\\Loader\\ObjectRouteLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ObjectRouteLoader.php',
+ 'Symfony\\Component\\Routing\\Loader\\ObjectLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ObjectLoader.php',
'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/PhpFileLoader.php',
'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/XmlFileLoader.php',
'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/YamlFileLoader.php',
- 'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperCollection' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/DumperCollection.php',
- 'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperRoute' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/DumperRoute.php',
+ 'Symfony\\Component\\Routing\\Matcher\\CompiledUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/CompiledUrlMatcher.php',
+ 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php',
+ 'Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherTrait' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php',
'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumper.php',
'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php',
- 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php',
'Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php',
+ 'Symfony\\Component\\Routing\\Matcher\\ExpressionLanguageProvider' => __DIR__ . '/..' . '/symfony/routing/Matcher/ExpressionLanguageProvider.php',
'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcher.php',
'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php',
'Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/RequestMatcherInterface.php',
@@ -2659,6 +2754,20 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Stopwatch\\Stopwatch' => __DIR__ . '/..' . '/symfony/stopwatch/Stopwatch.php',
'Symfony\\Component\\Stopwatch\\StopwatchEvent' => __DIR__ . '/..' . '/symfony/stopwatch/StopwatchEvent.php',
'Symfony\\Component\\Stopwatch\\StopwatchPeriod' => __DIR__ . '/..' . '/symfony/stopwatch/StopwatchPeriod.php',
+ 'Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php',
+ 'Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php',
+ 'Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php',
+ 'Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php',
+ 'Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php',
+ 'Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php',
+ 'Symfony\\Component\\String\\Inflector\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php',
+ 'Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php',
+ 'Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php',
+ 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php',
+ 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php',
+ 'Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php',
'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AmqpCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ArgsStub.php',
'Symfony\\Component\\VarDumper\\Caster\\Caster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/Caster.php',
@@ -2669,13 +2778,23 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DOMCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DateCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DoctrineCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsPairStub.php',
'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/EnumStub.php',
'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ExceptionCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\FiberCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FiberCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FrameStub.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/GmpCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImagineCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImgStub.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/IntlCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/LinkStub.php',
- 'Symfony\\Component\\VarDumper\\Caster\\MongoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MongoCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MemcachedCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\MysqliCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MysqliCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PdoCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PgSqlCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ProxyManagerCaster.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RdKafkaCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RedisCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ReflectionCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ResourceCaster.php',
@@ -2683,6 +2802,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/StubCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SymfonyCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/TraceStub.php',
+ 'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/UuidCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlReaderCaster.php',
'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlResourceCaster.php',
'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/AbstractCloner.php',
@@ -2692,12 +2812,34 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/DumperInterface.php',
'Symfony\\Component\\VarDumper\\Cloner\\Stub' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Stub.php',
'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/VarCloner.php',
+ 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php',
+ 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php',
+ 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php',
+ 'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => __DIR__ . '/..' . '/symfony/var-dumper/Command/ServerDumpCommand.php',
'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/AbstractDumper.php',
'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/CliDumper.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextualizedDumper.php',
'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/DataDumperInterface.php',
'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/HtmlDumper.php',
+ 'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ServerDumper.php',
'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => __DIR__ . '/..' . '/symfony/var-dumper/Exception/ThrowingCasterException.php',
+ 'Symfony\\Component\\VarDumper\\Server\\Connection' => __DIR__ . '/..' . '/symfony/var-dumper/Server/Connection.php',
+ 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => __DIR__ . '/..' . '/symfony/var-dumper/Server/DumpServer.php',
'Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.php',
+ 'Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ClassNotFoundException.php',
+ 'Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php',
+ 'Symfony\\Component\\VarExporter\\Instantiator' => __DIR__ . '/..' . '/symfony/var-exporter/Instantiator.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Exporter' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Exporter.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Hydrator.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Reference' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Reference.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Registry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Registry.php',
+ 'Symfony\\Component\\VarExporter\\Internal\\Values' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Values.php',
+ 'Symfony\\Component\\VarExporter\\VarExporter' => __DIR__ . '/..' . '/symfony/var-exporter/VarExporter.php',
'Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php',
'Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php',
'Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php',
@@ -2710,25 +2852,37 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php',
'Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php',
'Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php',
- 'Symfony\\Polyfill\\Apcu\\Apcu' => __DIR__ . '/..' . '/symfony/polyfill-apcu/Apcu.php',
+ 'Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheInterface.php',
+ 'Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheTrait.php',
+ 'Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CallbackInterface.php',
+ 'Symfony\\Contracts\\Cache\\ItemInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/ItemInterface.php',
+ 'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/TagAwareCacheInterface.php',
+ 'Symfony\\Contracts\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/Event.php',
+ 'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php',
+ 'Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php',
+ 'Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php',
+ 'Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php',
+ 'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php',
+ 'Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php',
+ 'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php',
+ 'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php',
+ 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/LocaleAwareInterface.php',
+ 'Symfony\\Contracts\\Translation\\TranslatableInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatableInterface.php',
+ 'Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorInterface.php',
+ 'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php',
'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php',
'Symfony\\Polyfill\\Intl\\Idn\\Idn' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Idn.php',
'Symfony\\Polyfill\\Intl\\Idn\\Info' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Info.php',
'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php',
'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php',
'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php',
'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
- 'Symfony\\Polyfill\\Php56\\Php56' => __DIR__ . '/..' . '/symfony/polyfill-php56/Php56.php',
- 'Symfony\\Polyfill\\Php70\\Php70' => __DIR__ . '/..' . '/symfony/polyfill-php70/Php70.php',
'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php',
- 'Symfony\\Polyfill\\Util\\Binary' => __DIR__ . '/..' . '/symfony/polyfill-util/Binary.php',
- 'Symfony\\Polyfill\\Util\\BinaryNoFuncOverload' => __DIR__ . '/..' . '/symfony/polyfill-util/BinaryNoFuncOverload.php',
- 'Symfony\\Polyfill\\Util\\BinaryOnFuncOverload' => __DIR__ . '/..' . '/symfony/polyfill-util/BinaryOnFuncOverload.php',
- 'Symfony\\Polyfill\\Util\\TestListener' => __DIR__ . '/..' . '/symfony/polyfill-util/TestListener.php',
- 'Symfony\\Polyfill\\Util\\TestListenerForV5' => __DIR__ . '/..' . '/symfony/polyfill-util/TestListenerForV5.php',
- 'Symfony\\Polyfill\\Util\\TestListenerForV6' => __DIR__ . '/..' . '/symfony/polyfill-util/TestListenerForV6.php',
- 'Symfony\\Polyfill\\Util\\TestListenerForV7' => __DIR__ . '/..' . '/symfony/polyfill-util/TestListenerForV7.php',
- 'Symfony\\Polyfill\\Util\\TestListenerTrait' => __DIR__ . '/..' . '/symfony/polyfill-util/TestListenerTrait.php',
+ 'Symfony\\Polyfill\\Php73\\Php73' => __DIR__ . '/..' . '/symfony/polyfill-php73/Php73.php',
+ 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php',
+ 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php',
+ 'Symfony\\Polyfill\\Php81\\Php81' => __DIR__ . '/..' . '/symfony/polyfill-php81/Php81.php',
'SynchroExceptionNotStarted' => __DIR__ . '/../..' . '/application/exceptions/SynchroExceptionNotStarted.php',
'System' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/System.php',
'TCPDF' => __DIR__ . '/..' . '/combodo/tcpdf/tcpdf.php',
@@ -2742,7 +2896,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'TCPDF_IMPORT' => __DIR__ . '/..' . '/combodo/tcpdf/tcpdf_import.php',
'TCPDF_PARSER' => __DIR__ . '/..' . '/combodo/tcpdf/tcpdf_parser.php',
'TCPDF_STATIC' => __DIR__ . '/..' . '/combodo/tcpdf/include/tcpdf_static.php',
- 'TabManager' => __DIR__ . '/../..' . '/sources/application/WebPage/TabManager.php',
+ 'TabManager' => __DIR__ . '/../..' . '/sources/Application/WebPage/TabManager.php',
'TabularBulkExport' => __DIR__ . '/../..' . '/core/tabularbulkexport.class.inc.php',
'TagSetFieldData' => __DIR__ . '/../..' . '/core/tagsetfield.class.inc.php',
'TemplateMenuNode' => __DIR__ . '/../..' . '/application/menunode.class.inc.php',
@@ -2781,13 +2935,13 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\Error\\RuntimeError' => __DIR__ . '/..' . '/twig/twig/src/Error/RuntimeError.php',
'Twig\\Error\\SyntaxError' => __DIR__ . '/..' . '/twig/twig/src/Error/SyntaxError.php',
'Twig\\ExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser.php',
+ 'Twig\\ExtensionSet' => __DIR__ . '/..' . '/twig/twig/src/ExtensionSet.php',
'Twig\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AbstractExtension.php',
'Twig\\Extension\\CoreExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/CoreExtension.php',
'Twig\\Extension\\DebugExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/DebugExtension.php',
'Twig\\Extension\\EscaperExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/EscaperExtension.php',
'Twig\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/ExtensionInterface.php',
'Twig\\Extension\\GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/GlobalsInterface.php',
- 'Twig\\Extension\\InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/InitRuntimeInterface.php',
'Twig\\Extension\\OptimizerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/OptimizerExtension.php',
'Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/ProfilerExtension.php',
'Twig\\Extension\\RuntimeExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
@@ -2798,14 +2952,13 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\Lexer' => __DIR__ . '/..' . '/twig/twig/src/Lexer.php',
'Twig\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ArrayLoader.php',
'Twig\\Loader\\ChainLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ChainLoader.php',
- 'Twig\\Loader\\ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/ExistsLoaderInterface.php',
'Twig\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/FilesystemLoader.php',
'Twig\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/LoaderInterface.php',
- 'Twig\\Loader\\SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/SourceContextLoaderInterface.php',
'Twig\\Markup' => __DIR__ . '/..' . '/twig/twig/src/Markup.php',
'Twig\\NodeTraverser' => __DIR__ . '/..' . '/twig/twig/src/NodeTraverser.php',
'Twig\\NodeVisitor\\AbstractNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
'Twig\\NodeVisitor\\EscaperNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
+ 'Twig\\NodeVisitor\\MacroAutoImportNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php',
'Twig\\NodeVisitor\\NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
'Twig\\NodeVisitor\\OptimizerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
@@ -2814,6 +2967,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\Node\\BlockNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockNode.php',
'Twig\\Node\\BlockReferenceNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockReferenceNode.php',
'Twig\\Node\\BodyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BodyNode.php',
+ 'Twig\\Node\\CheckSecurityCallNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityCallNode.php',
'Twig\\Node\\CheckSecurityNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityNode.php',
'Twig\\Node\\CheckToStringNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckToStringNode.php',
'Twig\\Node\\DeprecatedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DeprecatedNode.php',
@@ -2847,6 +3001,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\Node\\Expression\\Binary\\OrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
'Twig\\Node\\Expression\\Binary\\PowerBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
'Twig\\Node\\Expression\\Binary\\RangeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php',
'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
'Twig\\Node\\Expression\\Binary\\SubBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
'Twig\\Node\\Expression\\BlockReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
@@ -2875,6 +3030,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\Node\\Expression\\Unary\\NegUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
'Twig\\Node\\Expression\\Unary\\NotUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
'Twig\\Node\\Expression\\Unary\\PosUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
+ 'Twig\\Node\\Expression\\VariadicExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/VariadicExpression.php',
'Twig\\Node\\FlushNode' => __DIR__ . '/..' . '/twig/twig/src/Node/FlushNode.php',
'Twig\\Node\\ForLoopNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForLoopNode.php',
'Twig\\Node\\ForNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForNode.php',
@@ -2888,10 +3044,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\Node\\NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeOutputInterface.php',
'Twig\\Node\\PrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/PrintNode.php',
'Twig\\Node\\SandboxNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxNode.php',
- 'Twig\\Node\\SandboxedPrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxedPrintNode.php',
'Twig\\Node\\SetNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetNode.php',
- 'Twig\\Node\\SetTempNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetTempNode.php',
- 'Twig\\Node\\SpacelessNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SpacelessNode.php',
'Twig\\Node\\TextNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TextNode.php',
'Twig\\Node\\WithNode' => __DIR__ . '/..' . '/twig/twig/src/Node/WithNode.php',
'Twig\\Parser' => __DIR__ . '/..' . '/twig/twig/src/Parser.php',
@@ -2926,7 +3079,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\TokenParser\\DoTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DoTokenParser.php',
'Twig\\TokenParser\\EmbedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
'Twig\\TokenParser\\ExtendsTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
- 'Twig\\TokenParser\\FilterTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FilterTokenParser.php',
'Twig\\TokenParser\\FlushTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FlushTokenParser.php',
'Twig\\TokenParser\\ForTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ForTokenParser.php',
'Twig\\TokenParser\\FromTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FromTokenParser.php',
@@ -2936,7 +3088,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\TokenParser\\MacroTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/MacroTokenParser.php',
'Twig\\TokenParser\\SandboxTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
'Twig\\TokenParser\\SetTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SetTokenParser.php',
- 'Twig\\TokenParser\\SpacelessTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SpacelessTokenParser.php',
'Twig\\TokenParser\\TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TokenParserInterface.php',
'Twig\\TokenParser\\UseTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/UseTokenParser.php',
'Twig\\TokenParser\\WithTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/WithTokenParser.php',
@@ -2946,202 +3097,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Twig\\TwigTest' => __DIR__ . '/..' . '/twig/twig/src/TwigTest.php',
'Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php',
'Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php',
- 'Twig_Autoloader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Autoloader.php',
- 'Twig_BaseNodeVisitor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/BaseNodeVisitor.php',
- 'Twig_CacheInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/CacheInterface.php',
- 'Twig_Cache_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Filesystem.php',
- 'Twig_Cache_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Null.php',
- 'Twig_Compiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Compiler.php',
- 'Twig_CompilerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/CompilerInterface.php',
- 'Twig_ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php',
- 'Twig_Environment' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Environment.php',
- 'Twig_Error' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error.php',
- 'Twig_Error_Loader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Loader.php',
- 'Twig_Error_Runtime' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Runtime.php',
- 'Twig_Error_Syntax' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Syntax.php',
- 'Twig_ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExistsLoaderInterface.php',
- 'Twig_ExpressionParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExpressionParser.php',
- 'Twig_Extension' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension.php',
- 'Twig_ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExtensionInterface.php',
- 'Twig_Extension_Core' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Core.php',
- 'Twig_Extension_Debug' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Debug.php',
- 'Twig_Extension_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Escaper.php',
- 'Twig_Extension_GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php',
- 'Twig_Extension_InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php',
- 'Twig_Extension_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Optimizer.php',
- 'Twig_Extension_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Profiler.php',
- 'Twig_Extension_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Sandbox.php',
- 'Twig_Extension_Staging' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Staging.php',
- 'Twig_Extension_StringLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/StringLoader.php',
- 'Twig_FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php',
- 'Twig_FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php',
- 'Twig_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter.php',
- 'Twig_FilterCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FilterCallableInterface.php',
- 'Twig_FilterInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FilterInterface.php',
- 'Twig_Filter_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Function.php',
- 'Twig_Filter_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Method.php',
- 'Twig_Filter_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Node.php',
- 'Twig_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function.php',
- 'Twig_FunctionCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FunctionCallableInterface.php',
- 'Twig_FunctionInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FunctionInterface.php',
- 'Twig_Function_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Function.php',
- 'Twig_Function_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Method.php',
- 'Twig_Function_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Node.php',
- 'Twig_Lexer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Lexer.php',
- 'Twig_LexerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/LexerInterface.php',
- 'Twig_LoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/LoaderInterface.php',
- 'Twig_Loader_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Array.php',
- 'Twig_Loader_Chain' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Chain.php',
- 'Twig_Loader_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Filesystem.php',
- 'Twig_Loader_String' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/String.php',
- 'Twig_Markup' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Markup.php',
- 'Twig_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node.php',
- 'Twig_NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeCaptureInterface.php',
- 'Twig_NodeInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeInterface.php',
- 'Twig_NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeOutputInterface.php',
- 'Twig_NodeTraverser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeTraverser.php',
- 'Twig_NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitorInterface.php',
- 'Twig_NodeVisitor_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php',
- 'Twig_NodeVisitor_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php',
- 'Twig_NodeVisitor_SafeAnalysis' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php',
- 'Twig_NodeVisitor_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php',
- 'Twig_Node_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/AutoEscape.php',
- 'Twig_Node_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Block.php',
- 'Twig_Node_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/BlockReference.php',
- 'Twig_Node_Body' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Body.php',
- 'Twig_Node_CheckSecurity' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/CheckSecurity.php',
- 'Twig_Node_Deprecated' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Deprecated.php',
- 'Twig_Node_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Do.php',
- 'Twig_Node_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Embed.php',
- 'Twig_Node_Expression' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression.php',
- 'Twig_Node_Expression_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Array.php',
- 'Twig_Node_Expression_AssignName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/AssignName.php',
- 'Twig_Node_Expression_Binary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary.php',
- 'Twig_Node_Expression_Binary_Add' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php',
- 'Twig_Node_Expression_Binary_And' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php',
- 'Twig_Node_Expression_Binary_BitwiseAnd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php',
- 'Twig_Node_Expression_Binary_BitwiseOr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php',
- 'Twig_Node_Expression_Binary_BitwiseXor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php',
- 'Twig_Node_Expression_Binary_Concat' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php',
- 'Twig_Node_Expression_Binary_Div' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php',
- 'Twig_Node_Expression_Binary_EndsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php',
- 'Twig_Node_Expression_Binary_Equal' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php',
- 'Twig_Node_Expression_Binary_FloorDiv' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php',
- 'Twig_Node_Expression_Binary_Greater' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php',
- 'Twig_Node_Expression_Binary_GreaterEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php',
- 'Twig_Node_Expression_Binary_In' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php',
- 'Twig_Node_Expression_Binary_Less' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php',
- 'Twig_Node_Expression_Binary_LessEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php',
- 'Twig_Node_Expression_Binary_Matches' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php',
- 'Twig_Node_Expression_Binary_Mod' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php',
- 'Twig_Node_Expression_Binary_Mul' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php',
- 'Twig_Node_Expression_Binary_NotEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php',
- 'Twig_Node_Expression_Binary_NotIn' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php',
- 'Twig_Node_Expression_Binary_Or' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php',
- 'Twig_Node_Expression_Binary_Power' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php',
- 'Twig_Node_Expression_Binary_Range' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php',
- 'Twig_Node_Expression_Binary_StartsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php',
- 'Twig_Node_Expression_Binary_Sub' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php',
- 'Twig_Node_Expression_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php',
- 'Twig_Node_Expression_Call' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Call.php',
- 'Twig_Node_Expression_Conditional' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Conditional.php',
- 'Twig_Node_Expression_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Constant.php',
- 'Twig_Node_Expression_ExtensionReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php',
- 'Twig_Node_Expression_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter.php',
- 'Twig_Node_Expression_Filter_Default' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php',
- 'Twig_Node_Expression_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Function.php',
- 'Twig_Node_Expression_GetAttr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php',
- 'Twig_Node_Expression_MethodCall' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php',
- 'Twig_Node_Expression_Name' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Name.php',
- 'Twig_Node_Expression_NullCoalesce' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php',
- 'Twig_Node_Expression_Parent' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Parent.php',
- 'Twig_Node_Expression_TempName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/TempName.php',
- 'Twig_Node_Expression_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test.php',
- 'Twig_Node_Expression_Test_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php',
- 'Twig_Node_Expression_Test_Defined' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php',
- 'Twig_Node_Expression_Test_Divisibleby' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php',
- 'Twig_Node_Expression_Test_Even' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php',
- 'Twig_Node_Expression_Test_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php',
- 'Twig_Node_Expression_Test_Odd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php',
- 'Twig_Node_Expression_Test_Sameas' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php',
- 'Twig_Node_Expression_Unary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary.php',
- 'Twig_Node_Expression_Unary_Neg' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php',
- 'Twig_Node_Expression_Unary_Not' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php',
- 'Twig_Node_Expression_Unary_Pos' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php',
- 'Twig_Node_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Flush.php',
- 'Twig_Node_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/For.php',
- 'Twig_Node_ForLoop' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/ForLoop.php',
- 'Twig_Node_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/If.php',
- 'Twig_Node_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Import.php',
- 'Twig_Node_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Include.php',
- 'Twig_Node_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Macro.php',
- 'Twig_Node_Module' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Module.php',
- 'Twig_Node_Print' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Print.php',
- 'Twig_Node_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Sandbox.php',
- 'Twig_Node_SandboxedPrint' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/SandboxedPrint.php',
- 'Twig_Node_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Set.php',
- 'Twig_Node_SetTemp' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/SetTemp.php',
- 'Twig_Node_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Spaceless.php',
- 'Twig_Node_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Text.php',
- 'Twig_Node_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/With.php',
- 'Twig_Parser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Parser.php',
- 'Twig_ParserInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ParserInterface.php',
- 'Twig_Profiler_Dumper_Base' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php',
- 'Twig_Profiler_Dumper_Blackfire' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php',
- 'Twig_Profiler_Dumper_Html' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php',
- 'Twig_Profiler_Dumper_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php',
- 'Twig_Profiler_NodeVisitor_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php',
- 'Twig_Profiler_Node_EnterProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php',
- 'Twig_Profiler_Node_LeaveProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php',
- 'Twig_Profiler_Profile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Profile.php',
- 'Twig_RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php',
- 'Twig_Sandbox_SecurityError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityError.php',
- 'Twig_Sandbox_SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php',
- 'Twig_Sandbox_SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php',
- 'Twig_Sandbox_SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php',
- 'Twig_Sandbox_SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php',
- 'Twig_Sandbox_SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php',
- 'Twig_Sandbox_SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php',
- 'Twig_Sandbox_SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php',
- 'Twig_SimpleFilter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFilter.php',
- 'Twig_SimpleFunction' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFunction.php',
- 'Twig_SimpleTest' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleTest.php',
- 'Twig_Source' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Source.php',
- 'Twig_SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php',
- 'Twig_Template' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Template.php',
- 'Twig_TemplateInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TemplateInterface.php',
- 'Twig_TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TemplateWrapper.php',
- 'Twig_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test.php',
- 'Twig_TestCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TestCallableInterface.php',
- 'Twig_TestInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TestInterface.php',
- 'Twig_Token' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Token.php',
- 'Twig_TokenParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser.php',
- 'Twig_TokenParserBroker' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserBroker.php',
- 'Twig_TokenParserBrokerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserBrokerInterface.php',
- 'Twig_TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserInterface.php',
- 'Twig_TokenParser_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php',
- 'Twig_TokenParser_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Block.php',
- 'Twig_TokenParser_Deprecated' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Deprecated.php',
- 'Twig_TokenParser_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Do.php',
- 'Twig_TokenParser_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Embed.php',
- 'Twig_TokenParser_Extends' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Extends.php',
- 'Twig_TokenParser_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Filter.php',
- 'Twig_TokenParser_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Flush.php',
- 'Twig_TokenParser_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/For.php',
- 'Twig_TokenParser_From' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/From.php',
- 'Twig_TokenParser_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/If.php',
- 'Twig_TokenParser_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Import.php',
- 'Twig_TokenParser_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Include.php',
- 'Twig_TokenParser_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Macro.php',
- 'Twig_TokenParser_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Sandbox.php',
- 'Twig_TokenParser_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Set.php',
- 'Twig_TokenParser_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Spaceless.php',
- 'Twig_TokenParser_Use' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Use.php',
- 'Twig_TokenParser_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/With.php',
- 'Twig_TokenStream' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenStream.php',
- 'Twig_Util_DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/DeprecationCollector.php',
- 'Twig_Util_TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php',
- 'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
'UIExtKeyWidget' => __DIR__ . '/../..' . '/application/ui.extkeywidget.class.inc.php',
'UIHTMLEditorWidget' => __DIR__ . '/../..' . '/application/ui.htmleditorwidget.class.inc.php',
'UILinksWidget' => __DIR__ . '/../..' . '/application/ui.linkswidget.class.inc.php',
@@ -3152,7 +3107,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'URLButtonItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
'URLPopupMenuItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
'UnaryExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php',
- 'UnauthenticatedWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/UnauthenticatedWebPage.php',
+ 'UnauthenticatedWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/UnauthenticatedWebPage.php',
+ 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'UnknownClassOqlException' => __DIR__ . '/../..' . '/core/oql/oqlinterpreter.class.inc.php',
'User' => __DIR__ . '/../..' . '/core/userrights.class.inc.php',
'UserDashboard' => __DIR__ . '/../..' . '/application/user.dashboard.class.inc.php',
@@ -3160,6 +3116,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'UserRightException' => __DIR__ . '/../..' . '/application/exceptions/UserRightException.php',
'UserRights' => __DIR__ . '/../..' . '/core/userrights.class.inc.php',
'UserRightsAddOnAPI' => __DIR__ . '/../..' . '/core/userrights.class.inc.php',
+ 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
'ValueSetDefinition' => __DIR__ . '/../..' . '/core/valuesetdef.class.inc.php',
'ValueSetEnum' => __DIR__ . '/../..' . '/core/valuesetdef.class.inc.php',
'ValueSetEnumClasses' => __DIR__ . '/../..' . '/core/valuesetdef.class.inc.php',
@@ -3168,13 +3125,13 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'ValueSetRange' => __DIR__ . '/../..' . '/core/valuesetdef.class.inc.php',
'VariableExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php',
'VariableOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
- 'WebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/WebPage.php',
+ 'WebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/WebPage.php',
'WebPageMenuNode' => __DIR__ . '/../..' . '/application/menunode.class.inc.php',
'WeeklyRotatingLogFileNameBuilder' => __DIR__ . '/../..' . '/core/log.class.inc.php',
'WizardHelper' => __DIR__ . '/../..' . '/application/wizardhelper.class.inc.php',
'XLSXWriter' => __DIR__ . '/../..' . '/application/xlsxwriter.class.php',
'XMLBulkExport' => __DIR__ . '/../..' . '/core/xmlbulkexport.class.inc.php',
- 'XMLPage' => __DIR__ . '/../..' . '/sources/application/WebPage/XMLPage.php',
+ 'XMLPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/XMLPage.php',
'ajax_page' => __DIR__ . '/../..' . '/application/ajaxwebpage.class.inc.php',
'appUserPreferences' => __DIR__ . '/../..' . '/application/user.preferences.class.inc.php',
'cmdbAbstractObject' => __DIR__ . '/../..' . '/application/cmdbabstract.class.inc.php',
@@ -3196,7 +3153,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'iDBObjectSetIterator' => __DIR__ . '/../..' . '/core/dbobjectiterator.php',
'iDBObjectURLMaker' => __DIR__ . '/../..' . '/application/applicationcontext.class.inc.php',
'iDisplay' => __DIR__ . '/../..' . '/core/dbobject.class.php',
- 'iKeyboardShortcut' => __DIR__ . '/../..' . '/sources/application/UI/Hook/iKeyboardShortcut.php',
+ 'iKeyboardShortcut' => __DIR__ . '/../..' . '/sources/Application/UI/Hook/iKeyboardShortcut.php',
'iLogFileNameBuilder' => __DIR__ . '/../..' . '/core/log.class.inc.php',
'iLoginExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
'iLoginFSMExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
@@ -3216,15 +3173,15 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'iRestServiceProvider' => __DIR__ . '/../..' . '/application/applicationextension.inc.php',
'iScheduledProcess' => __DIR__ . '/../..' . '/core/backgroundprocess.inc.php',
'iSelfRegister' => __DIR__ . '/../..' . '/core/userrights.class.inc.php',
- 'iTabbedPage' => __DIR__ . '/../..' . '/sources/application/WebPage/iTabbedPage.php',
+ 'iTabbedPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/iTabbedPage.php',
'iTopConfigParser' => __DIR__ . '/../..' . '/core/iTopConfigParser.php',
'iTopMutex' => __DIR__ . '/../..' . '/core/mutex.class.inc.php',
'iTopOwnershipLock' => __DIR__ . '/../..' . '/core/ownershiplock.class.inc.php',
'iTopOwnershipToken' => __DIR__ . '/../..' . '/core/ownershiplock.class.inc.php',
- 'iTopPDF' => __DIR__ . '/../..' . '/sources/application/WebPage/iTopPDF.php',
+ 'iTopPDF' => __DIR__ . '/../..' . '/sources/Application/WebPage/iTopPDF.php',
'iTopStandardURLMaker' => __DIR__ . '/../..' . '/application/applicationcontext.class.inc.php',
- 'iTopWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/iTopWebPage.php',
- 'iTopWizardWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/iTopWizardWebPage.php',
+ 'iTopWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/iTopWebPage.php',
+ 'iTopWizardWebPage' => __DIR__ . '/../..' . '/sources/Application/WebPage/iTopWizardWebPage.php',
'iWorkingTimeComputer' => __DIR__ . '/../..' . '/core/computing.inc.php',
'lnkTriggerAction' => __DIR__ . '/../..' . '/core/trigger.class.inc.php',
'ormCaseLog' => __DIR__ . '/../..' . '/core/ormcaselog.class.inc.php',
diff --git a/lib/composer/include_paths.php b/lib/composer/include_paths.php
index d4fb96718..af33c1491 100644
--- a/lib/composer/include_paths.php
+++ b/lib/composer/include_paths.php
@@ -2,7 +2,7 @@
// include_paths.php @generated by Composer
-$vendorDir = dirname(dirname(__FILE__));
+$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
diff --git a/lib/composer/installed.json b/lib/composer/installed.json
index 2ab399d86..0ba9d9065 100644
--- a/lib/composer/installed.json
+++ b/lib/composer/installed.json
@@ -182,17 +182,17 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "6.5.6",
- "version_normalized": "6.5.6.0",
+ "version": "6.5.7",
+ "version_normalized": "6.5.7.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "f092dd734083473658de3ee4bef093ed77d2689c"
+ "reference": "724562fa861e21a4071c652c8a159934e4f05592"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f092dd734083473658de3ee4bef093ed77d2689c",
- "reference": "f092dd734083473658de3ee4bef093ed77d2689c",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/724562fa861e21a4071c652c8a159934e4f05592",
+ "reference": "724562fa861e21a4071c652c8a159934e4f05592",
"shasum": ""
},
"require": {
@@ -210,7 +210,7 @@
"suggest": {
"psr/log": "Required for using the Log middleware"
},
- "time": "2022-05-25T13:19:12+00:00",
+ "time": "2022-06-09T21:36:50+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -280,7 +280,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/6.5.6"
+ "source": "https://github.com/guzzle/guzzle/tree/6.5.7"
},
"funding": [
{
@@ -1199,36 +1199,32 @@
},
{
"name": "paragonie/random_compat",
- "version": "v2.0.18",
- "version_normalized": "2.0.18.0",
+ "version": "v9.99.100",
+ "version_normalized": "9.99.100.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
- "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
- "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": ""
},
"require": {
- "php": ">=5.2.0"
+ "php": ">= 7"
},
"require-dev": {
- "phpunit/phpunit": "4.*|5.*"
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
- "time": "2019-01-03T20:59:08+00:00",
+ "time": "2020-10-15T08:29:30+00:00",
"type": "library",
"installation-source": "dist",
- "autoload": {
- "files": [
- "lib/random.php"
- ]
- },
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
@@ -1247,6 +1243,11 @@
"pseudorandom",
"random"
],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/random_compat/issues",
+ "source": "https://github.com/paragonie/random_compat"
+ },
"install-path": "../paragonie/random_compat"
},
{
@@ -1388,17 +1389,17 @@
},
{
"name": "pear/pear-core-minimal",
- "version": "v1.10.10",
- "version_normalized": "1.10.10.0",
+ "version": "v1.10.11",
+ "version_normalized": "1.10.11.0",
"source": {
"type": "git",
"url": "https://github.com/pear/pear-core-minimal.git",
- "reference": "625a3c429d9b2c1546438679074cac1b089116a7"
+ "reference": "68d0d32ada737153b7e93b8d3c710ebe70ac867d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/625a3c429d9b2c1546438679074cac1b089116a7",
- "reference": "625a3c429d9b2c1546438679074cac1b089116a7",
+ "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/68d0d32ada737153b7e93b8d3c710ebe70ac867d",
+ "reference": "68d0d32ada737153b7e93b8d3c710ebe70ac867d",
"shasum": ""
},
"require": {
@@ -1408,7 +1409,7 @@
"replace": {
"rsky/pear-core-min": "self.version"
},
- "time": "2019-11-19T19:00:24+00:00",
+ "time": "2021-08-10T22:31:03+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -1631,29 +1632,24 @@
},
{
"name": "psr/container",
- "version": "1.0.0",
- "version_normalized": "1.0.0.0",
+ "version": "1.1.1",
+ "version_normalized": "1.1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=7.2.0"
},
- "time": "2017-02-14T16:28:37+00:00",
+ "time": "2021-03-05T17:36:06+00:00",
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
"installation-source": "dist",
"autoload": {
"psr-4": {
@@ -1667,7 +1663,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common Container Interface (PHP FIG PSR-11)",
@@ -1679,8 +1675,65 @@
"container-interop",
"psr"
],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/1.1.1"
+ },
"install-path": "../psr/container"
},
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "version_normalized": "1.0.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"
+ },
+ "time": "2019-01-08T18:20:26+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "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"
+ },
+ "install-path": "../psr/event-dispatcher"
+ },
{
"name": "psr/http-message",
"version": "1.0.1",
@@ -1739,23 +1792,23 @@
},
{
"name": "psr/log",
- "version": "1.1.2",
- "version_normalized": "1.1.2.0",
+ "version": "1.1.4",
+ "version_normalized": "1.1.4.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
- "time": "2019-11-01T11:05:21+00:00",
+ "time": "2021-05-03T11:20:27+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -1775,7 +1828,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
@@ -1785,59 +1838,11 @@
"psr",
"psr-3"
],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
+ },
"install-path": "../psr/log"
},
- {
- "name": "psr/simple-cache",
- "version": "1.0.1",
- "version_normalized": "1.0.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/simple-cache.git",
- "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
- "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "time": "2017-10-23T01:57:42+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Psr\\SimpleCache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interfaces for simple caching",
- "keywords": [
- "cache",
- "caching",
- "psr",
- "psr-16",
- "simple-cache"
- ],
- "install-path": "../psr/simple-cache"
- },
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
@@ -1887,17 +1892,17 @@
},
{
"name": "scssphp/scssphp",
- "version": "1.0.6",
- "version_normalized": "1.0.6.0",
+ "version": "v1.10.3",
+ "version_normalized": "1.10.3.0",
"source": {
"type": "git",
"url": "https://github.com/scssphp/scssphp.git",
- "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c"
+ "reference": "0f1e1516ed2412ad43e42a6a319e77624ba1f713"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/scssphp/scssphp/zipball/5b3c9d704950d8f9637f5110c36c281ec47dc13c",
- "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c",
+ "url": "https://api.github.com/repos/scssphp/scssphp/zipball/0f1e1516ed2412ad43e42a6a319e77624ba1f713",
+ "reference": "0f1e1516ed2412ad43e42a6a319e77624ba1f713",
"shasum": ""
},
"require": {
@@ -1906,12 +1911,21 @@
"php": ">=5.6.0"
},
"require-dev": {
- "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
- "squizlabs/php_codesniffer": "~2.5",
- "twbs/bootstrap": "~4.3",
+ "bamarni/composer-bin-plugin": "^1.4",
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4",
+ "sass/sass-spec": "*",
+ "squizlabs/php_codesniffer": "~3.5",
+ "symfony/phpunit-bridge": "^5.1",
+ "thoughtbot/bourbon": "^7.0",
+ "twbs/bootstrap": "~5.0",
+ "twbs/bootstrap4": "4.6.1",
"zurb/foundation": "~6.5"
},
- "time": "2019-12-12T05:00:52+00:00",
+ "suggest": {
+ "ext-iconv": "Can be used as fallback when ext-mbstring is not available",
+ "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv"
+ },
+ "time": "2022-05-16T07:22:18+00:00",
"bin": [
"bin/pscss"
],
@@ -1949,46 +1963,61 @@
],
"support": {
"issues": "https://github.com/scssphp/scssphp/issues",
- "source": "https://github.com/scssphp/scssphp/tree/master"
+ "source": "https://github.com/scssphp/scssphp/tree/v1.10.3"
},
"install-path": "../scssphp/scssphp"
},
{
"name": "symfony/cache",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
- "reference": "a7a14c4832760bd1fbd31be2859ffedc9b6ff813"
+ "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/a7a14c4832760bd1fbd31be2859ffedc9b6ff813",
- "reference": "a7a14c4832760bd1fbd31be2859ffedc9b6ff813",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/a50b7249bea81ddd6d3b799ce40c5521c2f72f0b",
+ "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/cache": "~1.0",
- "psr/log": "~1.0",
- "psr/simple-cache": "^1.0",
- "symfony/polyfill-apcu": "~1.1"
+ "php": ">=7.2.5",
+ "psr/cache": "^1.0|^2.0",
+ "psr/log": "^1.1|^2|^3",
+ "symfony/cache-contracts": "^1.1.7|^2",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
},
"conflict": {
- "symfony/var-dumper": "<3.3"
+ "doctrine/dbal": "<2.13.1",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/http-kernel": "<4.4",
+ "symfony/var-dumper": "<4.4"
},
"provide": {
- "psr/cache-implementation": "1.0",
- "psr/simple-cache-implementation": "1.0"
+ "psr/cache-implementation": "1.0|2.0",
+ "psr/simple-cache-implementation": "1.0|2.0",
+ "symfony/cache-implementation": "1.0|2.0"
},
"require-dev": {
"cache/integration-tests": "dev-master",
- "doctrine/cache": "^1.6",
- "doctrine/dbal": "^2.4|^3.0",
- "predis/predis": "^1.0"
+ "doctrine/cache": "^1.6|^2.0",
+ "doctrine/dbal": "^2.13.1|^3.0",
+ "predis/predis": "^1.1",
+ "psr/simple-cache": "^1.0|^2.0",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/messenger": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-21T10:24:18+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2013,14 +2042,14 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
+ "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
"homepage": "https://symfony.com",
"keywords": [
"caching",
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v3.4.47"
+ "source": "https://github.com/symfony/cache/tree/v5.4.9"
},
"funding": [
{
@@ -2039,40 +2068,43 @@
"install-path": "../symfony/cache"
},
{
- "name": "symfony/class-loader",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/cache-contracts",
+ "version": "v2.5.1",
+ "version_normalized": "2.5.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/class-loader.git",
- "reference": "a22265a9f3511c0212bf79f54910ca5a77c0e92c"
+ "url": "https://github.com/symfony/cache-contracts.git",
+ "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/class-loader/zipball/a22265a9f3511c0212bf79f54910ca5a77c0e92c",
- "reference": "a22265a9f3511c0212bf79f54910ca5a77c0e92c",
+ "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+ "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
- },
- "require-dev": {
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/polyfill-apcu": "~1.1"
+ "php": ">=7.2.5",
+ "psr/cache": "^1.0|^2.0|^3.0"
},
"suggest": {
- "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
+ "symfony/cache-implementation": ""
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-01-02T09:53:40+00:00",
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
"installation-source": "dist",
"autoload": {
"psr-4": {
- "Symfony\\Component\\ClassLoader\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Symfony\\Contracts\\Cache\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2080,18 +2112,26 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony ClassLoader Component",
+ "description": "Generic abstractions related to caching",
"homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
"support": {
- "source": "https://github.com/symfony/class-loader/tree/v3.4.47"
+ "source": "https://github.com/symfony/cache-contracts/tree/v2.5.1"
},
"funding": [
{
@@ -2107,42 +2147,45 @@
"type": "tidelift"
}
],
- "install-path": "../symfony/class-loader"
+ "install-path": "../symfony/cache-contracts"
},
{
"name": "symfony/config",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f"
+ "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
- "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
+ "url": "https://api.github.com/repos/symfony/config/zipball/8f551fe22672ac7ab2c95fe46d899f960ed4d979",
+ "reference": "8f551fe22672ac7ab2c95fe46d899f960ed4d979",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/filesystem": "~2.8|~3.0|~4.0",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22"
},
"conflict": {
- "symfony/dependency-injection": "<3.3",
- "symfony/finder": "<3.3"
+ "symfony/finder": "<4.4"
},
"require-dev": {
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/event-dispatcher": "~3.3|~4.0",
- "symfony/finder": "~3.3|~4.0",
- "symfony/yaml": "~3.0|~4.0"
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/messenger": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/yaml": "To use the yaml reference dumper"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-17T10:39:36+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2167,10 +2210,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Config Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/config/tree/v5.4.9"
},
"funding": [
{
@@ -2190,38 +2233,47 @@
},
{
"name": "symfony/console",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81"
+ "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81",
- "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81",
+ "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb",
+ "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/debug": "~2.8|~3.0|~4.0",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
},
"conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/process": "<3.3"
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
},
"provide": {
- "psr/log-implementation": "1.0"
+ "psr/log-implementation": "1.0|2.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~3.3|~4.0",
- "symfony/dependency-injection": "~3.4|~4.0",
- "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
- "symfony/lock": "~3.4|~4.0",
- "symfony/process": "~3.3|~4.0"
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/log": "For using the console logger",
@@ -2229,7 +2281,7 @@
"symfony/lock": "",
"symfony/process": ""
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-18T06:17:34+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2254,10 +2306,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Console Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/console/tree/v5.4.9"
},
"funding": [
{
@@ -2277,23 +2335,24 @@
},
{
"name": "symfony/css-selector",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.3",
+ "version_normalized": "5.4.3.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33"
+ "reference": "b0a190285cd95cb019237851205b8140ef6e368e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/da3d9da2ce0026771f5fe64cb332158f1bd2bc33",
- "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0a190285cd95cb019237851205b8140ef6e368e",
+ "reference": "b0a190285cd95cb019237851205b8140ef6e368e",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-01-02T09:53:40+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2322,10 +2381,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony CssSelector Component",
+ "description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v3.4.47"
+ "source": "https://github.com/symfony/css-selector/tree/v5.4.3"
},
"funding": [
{
@@ -2343,109 +2402,44 @@
],
"install-path": "../symfony/css-selector"
},
- {
- "name": "symfony/debug",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/debug.git",
- "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/ab42889de57fdfcfcc0759ab102e2fd4ea72dcae",
- "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/log": "~1.0"
- },
- "conflict": {
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
- },
- "require-dev": {
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
- },
- "time": "2020-10-24T10:57:07+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Debug\\": ""
- },
- "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": "Symfony Debug Component",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/debug/tree/v3.4.47"
- },
- "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"
- }
- ],
- "install-path": "../symfony/debug"
- },
{
"name": "symfony/dependency-injection",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b"
+ "reference": "beecae161577305926ec078c4ed973f2b98880b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
- "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/beecae161577305926ec078c4ed973f2b98880b3",
+ "reference": "beecae161577305926ec078c4ed973f2b98880b3",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/container": "^1.0"
+ "php": ">=7.2.5",
+ "psr/container": "^1.1.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22",
+ "symfony/service-contracts": "^1.1.6|^2"
},
"conflict": {
- "symfony/config": "<3.3.7",
- "symfony/finder": "<3.3",
- "symfony/proxy-manager-bridge": "<3.4",
- "symfony/yaml": "<3.4"
+ "ext-psr": "<1.1|>=2",
+ "symfony/config": "<5.3",
+ "symfony/finder": "<4.4",
+ "symfony/proxy-manager-bridge": "<4.4",
+ "symfony/yaml": "<4.4.26"
},
"provide": {
- "psr/container-implementation": "1.0"
+ "psr/container-implementation": "1.0",
+ "symfony/service-implementation": "1.0|2.0"
},
"require-dev": {
- "symfony/config": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/yaml": "~3.4|~4.0"
+ "symfony/config": "^5.3|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/yaml": "^4.4.26|^5.0|^6.0"
},
"suggest": {
"symfony/config": "",
@@ -2454,7 +2448,7 @@
"symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
"symfony/yaml": ""
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-27T06:40:03+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2479,10 +2473,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony DependencyInjection Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/dependency-injection/tree/v5.4.9"
},
"funding": [
{
@@ -2501,27 +2495,99 @@
"install-path": "../symfony/dependency-injection"
},
{
- "name": "symfony/dotenv",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/deprecation-contracts",
+ "version": "v2.5.1",
+ "version_normalized": "2.5.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/dotenv.git",
- "reference": "1022723ac4f56b001d99691d96c6025dbf1404f1"
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dotenv/zipball/1022723ac4f56b001d99691d96c6025dbf1404f1",
- "reference": "1022723ac4f56b001d99691d96c6025dbf1404f1",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+ "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.1"
+ },
+ "time": "2022-01-02T09:53:40+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "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 generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/deprecation-contracts"
+ },
+ {
+ "name": "symfony/dotenv",
+ "version": "v5.4.5",
+ "version_normalized": "5.4.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dotenv.git",
+ "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/83a2310904a4f5d4f42526227b5a578ac82232a9",
+ "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3"
},
"require-dev": {
- "symfony/process": "^3.4.2|^4.0"
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-02-15T17:04:12+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2554,7 +2620,7 @@
"environment"
],
"support": {
- "source": "https://github.com/symfony/dotenv/tree/v3.4.47"
+ "source": "https://github.com/symfony/dotenv/tree/v5.4.5"
},
"funding": [
{
@@ -2573,39 +2639,122 @@
"install-path": "../symfony/dotenv"
},
{
- "name": "symfony/event-dispatcher",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/error-handler",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "31fde73757b6bad247c54597beef974919ec6860"
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "c116cda1f51c678782768dce89a45f13c949455d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/31fde73757b6bad247c54597beef974919ec6860",
- "reference": "31fde73757b6bad247c54597beef974919ec6860",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d",
+ "reference": "c116cda1f51c678782768dce89a45f13c949455d",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
- },
- "conflict": {
- "symfony/dependency-injection": "<3.3"
+ "php": ">=7.2.5",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0|~4.0",
- "symfony/debug": "~3.4|~4.4",
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0"
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/serializer": "^4.4|^5.0|^6.0"
+ },
+ "time": "2022-05-21T13:57:48+00:00",
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "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 to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v5.4.9"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/error-handler"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
+ "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/event-dispatcher-contracts": "^2|^3",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/dependency-injection": "",
"symfony/http-kernel": ""
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-05T16:45:39+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2630,10 +2779,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony EventDispatcher Component",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9"
},
"funding": [
{
@@ -2652,25 +2801,109 @@
"install-path": "../symfony/event-dispatcher"
},
{
- "name": "symfony/filesystem",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v2.5.1",
+ "version_normalized": "2.5.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3"
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e58d7841cddfed6e846829040dca2cca0ebbbbb3",
- "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
+ "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.2.5",
+ "psr/event-dispatcher": "^1"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "time": "2022-01-02T09:53:40+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "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": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/event-dispatcher-contracts"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba",
+ "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "time": "2022-05-20T13:55:35+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2695,10 +2928,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Filesystem Component",
+ "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v3.4.47"
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.9"
},
"funding": [
{
@@ -2718,23 +2951,25 @@
},
{
"name": "symfony/finder",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.8",
+ "version_normalized": "5.4.8.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e"
+ "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/b6b6ad3db3edb1b4b1c1896b1975fb684994de6e",
- "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9",
+ "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
},
- "time": "2020-11-16T17:02:08+00:00",
+ "time": "2022-04-15T08:07:45+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2759,10 +2994,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Finder Component",
+ "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v3.4.47"
+ "source": "https://github.com/symfony/finder/tree/v5.4.8"
},
"funding": [
{
@@ -2782,77 +3017,101 @@
},
{
"name": "symfony/framework-bundle",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/framework-bundle.git",
- "reference": "6c95e747b75ddd2af61152ce93bf87299d15710e"
+ "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6c95e747b75ddd2af61152ce93bf87299d15710e",
- "reference": "6c95e747b75ddd2af61152ce93bf87299d15710e",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1cb89cd3e36d5060545d0f223f00a774fa6430ef",
+ "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef",
"shasum": ""
},
"require": {
"ext-xml": "*",
- "php": "^5.5.9|>=7.0.8",
- "symfony/cache": "~3.4.31|^4.3.4",
- "symfony/class-loader": "~3.2",
- "symfony/config": "^3.4.31|^4.3.4",
- "symfony/debug": "~2.8|~3.0|~4.0",
- "symfony/dependency-injection": "^3.4.24|^4.2.5",
- "symfony/event-dispatcher": "~3.4|~4.0",
- "symfony/filesystem": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "^3.4.38|^4.3",
- "symfony/http-kernel": "^3.4.44|^4.3.4",
+ "php": ">=7.2.5",
+ "symfony/cache": "^5.2|^6.0",
+ "symfony/config": "^5.3|^6.0",
+ "symfony/dependency-injection": "^5.4.5|^6.0.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/error-handler": "^4.4.1|^5.0.1|^6.0",
+ "symfony/event-dispatcher": "^5.1|^6.0",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^5.3|^6.0",
+ "symfony/http-kernel": "^5.4|^6.0",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/routing": "^3.4.5|^4.0.5"
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22",
+ "symfony/routing": "^5.3|^6.0"
},
"conflict": {
- "phpdocumentor/reflection-docblock": "<3.0",
- "phpdocumentor/type-resolver": "<0.2.1",
- "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
- "symfony/asset": "<3.3",
- "symfony/console": "<3.4",
- "symfony/form": "<3.4",
- "symfony/property-info": "<3.3",
- "symfony/serializer": "<3.3",
- "symfony/stopwatch": "<3.4",
- "symfony/translation": "<3.4",
- "symfony/validator": "<3.4",
- "symfony/workflow": "<3.3"
+ "doctrine/annotations": "<1.13.1",
+ "doctrine/cache": "<1.11",
+ "doctrine/persistence": "<1.3",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/asset": "<5.3",
+ "symfony/console": "<5.2.5",
+ "symfony/dom-crawler": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/form": "<5.2",
+ "symfony/http-client": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/mailer": "<5.2",
+ "symfony/messenger": "<5.4",
+ "symfony/mime": "<4.4",
+ "symfony/property-access": "<5.3",
+ "symfony/property-info": "<4.4",
+ "symfony/security-csrf": "<5.3",
+ "symfony/serializer": "<5.2",
+ "symfony/service-contracts": ">=3.0",
+ "symfony/stopwatch": "<4.4",
+ "symfony/translation": "<5.3",
+ "symfony/twig-bridge": "<4.4",
+ "symfony/twig-bundle": "<4.4",
+ "symfony/validator": "<5.2",
+ "symfony/web-profiler-bundle": "<4.4",
+ "symfony/workflow": "<5.2"
},
"require-dev": {
- "doctrine/annotations": "~1.7",
- "doctrine/cache": "~1.0",
- "fig/link-util": "^1.0",
- "phpdocumentor/reflection-docblock": "^3.0|^4.0",
- "symfony/asset": "~3.3|~4.0",
- "symfony/browser-kit": "~2.8|~3.0|~4.0",
- "symfony/console": "~3.4.31|^4.3.4",
- "symfony/css-selector": "~2.8|~3.0|~4.0",
- "symfony/dom-crawler": "~2.8|~3.0|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/form": "^3.4.31|^4.3.4",
- "symfony/lock": "~3.4|~4.0",
+ "doctrine/annotations": "^1.13.1",
+ "doctrine/cache": "^1.11|^2.0",
+ "doctrine/persistence": "^1.3|^2|^3",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/asset": "^5.3|^6.0",
+ "symfony/browser-kit": "^5.4|^6.0",
+ "symfony/console": "^5.4.9|^6.0.9",
+ "symfony/css-selector": "^4.4|^5.0|^6.0",
+ "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0",
+ "symfony/dotenv": "^5.1|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/form": "^5.2|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/mailer": "^5.2|^6.0",
+ "symfony/messenger": "^5.4|^6.0",
+ "symfony/mime": "^4.4|^5.0|^6.0",
+ "symfony/notifier": "^5.4|^6.0",
"symfony/polyfill-intl-icu": "~1.0",
- "symfony/process": "~2.8|~3.0|~4.0",
- "symfony/property-info": "~3.3|~4.0",
- "symfony/security-core": "~3.2|~4.0",
- "symfony/security-csrf": "^2.8.31|^3.3.13|~4.0",
- "symfony/serializer": "~3.3|~4.0",
- "symfony/stopwatch": "~3.4|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/translation": "~3.4|~4.0",
- "symfony/validator": "~3.4|~4.0",
- "symfony/var-dumper": "~3.3|~4.0",
- "symfony/web-link": "~3.3|~4.0",
- "symfony/workflow": "~3.3|~4.0",
- "symfony/yaml": "~3.2|~4.0",
- "twig/twig": "~1.34|~2.4"
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/property-info": "^4.4|^5.0|^6.0",
+ "symfony/rate-limiter": "^5.2|^6.0",
+ "symfony/security-bundle": "^5.4|^6.0",
+ "symfony/serializer": "^5.4|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/string": "^5.0|^6.0",
+ "symfony/translation": "^5.3|^6.0",
+ "symfony/twig-bundle": "^4.4|^5.0|^6.0",
+ "symfony/validator": "^5.2|^6.0",
+ "symfony/web-link": "^4.4|^5.0|^6.0",
+ "symfony/workflow": "^5.2|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0",
+ "twig/twig": "^2.10|^3.0"
},
"suggest": {
"ext-apcu": "For best performance of the system caches",
@@ -2864,7 +3123,7 @@
"symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
"symfony/yaml": "For using the debug:config and lint:yaml commands"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-27T06:29:07+00:00",
"type": "symfony-bundle",
"installation-source": "dist",
"autoload": {
@@ -2889,10 +3148,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony FrameworkBundle",
+ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/framework-bundle/tree/v3.4.47"
+ "source": "https://github.com/symfony/framework-bundle/tree/v5.4.9"
},
"funding": [
{
@@ -2912,28 +3171,35 @@
},
{
"name": "symfony/http-foundation",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8"
+ "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b9885fcce6fe494201da4f70a9309770e9d13dc8",
- "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522",
+ "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.1",
- "symfony/polyfill-php70": "~1.6"
+ "symfony/polyfill-php80": "^1.16"
},
"require-dev": {
- "symfony/expression-language": "~2.8|~3.0|~4.0"
+ "predis/predis": "~1.0",
+ "symfony/cache": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/mime": "^4.4|^5.0|^6.0"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "suggest": {
+ "symfony/mime": "To use the file extension guesser"
+ },
+ "time": "2022-05-17T15:07:29+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -2958,10 +3224,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpFoundation Component",
+ "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v3.4.47"
+ "source": "https://github.com/symfony/http-foundation/tree/v5.4.9"
},
"funding": [
{
@@ -2981,64 +3247,74 @@
},
{
"name": "symfony/http-kernel",
- "version": "v3.4.49",
- "version_normalized": "3.4.49.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "5aa72405f5bd5583c36ed6e756acb17d3f98ac40"
+ "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5aa72405f5bd5583c36ed6e756acb17d3f98ac40",
- "reference": "5aa72405f5bd5583c36ed6e756acb17d3f98ac40",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8",
+ "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/log": "~1.0",
- "symfony/debug": "^3.3.3|~4.0",
- "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-php56": "~1.8"
+ "php": ">=7.2.5",
+ "psr/log": "^1|^2",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^5.0|^6.0",
+ "symfony/http-foundation": "^5.3.7|^6.0",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16"
},
"conflict": {
- "symfony/config": "<2.8",
- "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4",
- "symfony/var-dumper": "<3.3",
- "twig/twig": "<1.34|<2.4,>=2"
+ "symfony/browser-kit": "<5.4",
+ "symfony/cache": "<5.0",
+ "symfony/config": "<5.0",
+ "symfony/console": "<4.4",
+ "symfony/dependency-injection": "<5.3",
+ "symfony/doctrine-bridge": "<5.0",
+ "symfony/form": "<5.0",
+ "symfony/http-client": "<5.0",
+ "symfony/mailer": "<5.0",
+ "symfony/messenger": "<5.0",
+ "symfony/translation": "<5.0",
+ "symfony/twig-bridge": "<5.0",
+ "symfony/validator": "<5.0",
+ "twig/twig": "<2.13"
},
"provide": {
- "psr/log-implementation": "1.0"
+ "psr/log-implementation": "1.0|2.0"
},
"require-dev": {
- "psr/cache": "~1.0",
- "symfony/browser-kit": "~2.8|~3.0|~4.0",
- "symfony/class-loader": "~2.8|~3.0",
- "symfony/config": "~2.8|~3.0|~4.0",
- "symfony/console": "~2.8|~3.0|~4.0",
- "symfony/css-selector": "~2.8|~3.0|~4.0",
- "symfony/dependency-injection": "^3.4.10|^4.0.10",
- "symfony/dom-crawler": "~2.8|~3.0|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/process": "~2.8|~3.0|~4.0",
- "symfony/routing": "~3.4|~4.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/translation": "~2.8|~3.0|~4.0",
- "symfony/var-dumper": "~3.3|~4.0"
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^5.4|^6.0",
+ "symfony/config": "^5.0|^6.0",
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/css-selector": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^5.3|^6.0",
+ "symfony/dom-crawler": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/http-client-contracts": "^1.1|^2|^3",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/translation": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2|^3",
+ "twig/twig": "^2.13|^3.0.4"
},
"suggest": {
"symfony/browser-kit": "",
"symfony/config": "",
"symfony/console": "",
- "symfony/dependency-injection": "",
- "symfony/finder": "",
- "symfony/var-dumper": ""
+ "symfony/dependency-injection": ""
},
- "time": "2021-05-19T12:06:59+00:00",
+ "time": "2022-05-27T07:09:08+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -3063,10 +3339,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpKernel Component",
+ "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v3.4.49"
+ "source": "https://github.com/symfony/http-kernel/tree/v5.4.9"
},
"funding": [
{
@@ -3085,28 +3361,34 @@
"install-path": "../symfony/http-kernel"
},
{
- "name": "symfony/polyfill-apcu",
- "version": "v1.19.0",
- "version_normalized": "1.19.0.0",
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.26.0",
+ "version_normalized": "1.26.0.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-apcu.git",
- "reference": "b44b51e7814c23bfbd793a16ead5d7ce43ed23c5"
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/b44b51e7814c23bfbd793a16ead5d7ce43ed23c5",
- "reference": "b44b51e7814c23bfbd793a16ead5d7ce43ed23c5",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
- "time": "2020-10-21T09:57:48+00:00",
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "time": "2022-05-24T11:49:31+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.19-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -3118,92 +3400,9 @@
"files": [
"bootstrap.php"
],
- "psr-4": {
- "Symfony\\Polyfill\\Apcu\\": ""
- }
- },
- "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 apcu_* functions to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "apcu",
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-apcu/tree/v1.19.0"
- },
- "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"
- }
- ],
- "install-path": "../symfony/polyfill-apcu"
- },
- {
- "name": "symfony/polyfill-ctype",
- "version": "v1.19.0",
- "version_normalized": "1.19.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/aed596913b70fae57be53d86faa2e9ef85a2297b",
- "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "time": "2020-10-23T09:01:57+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "installation-source": "dist",
- "autoload": {
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3228,7 +3427,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
},
"funding": [
{
@@ -3246,6 +3445,90 @@
],
"install-path": "../symfony/polyfill-ctype"
},
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.26.0",
+ "version_normalized": "1.26.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "time": "2022-05-24T11:49:31+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "installation-source": "dist",
+ "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.26.0"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/polyfill-intl-grapheme"
+ },
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.26.0",
@@ -3425,30 +3708,33 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.19.0",
- "version_normalized": "1.19.0.0",
+ "version": "v1.26.0",
+ "version_normalized": "1.26.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce"
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce",
- "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
},
"suggest": {
"ext-mbstring": "For best performance"
},
- "time": "2020-10-23T09:01:57+00:00",
+ "time": "2022-05-24T11:49:31+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.19-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -3457,12 +3743,12 @@
},
"installation-source": "dist",
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
"files": [
"bootstrap.php"
- ]
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3488,7 +3774,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
},
"funding": [
{
@@ -3506,169 +3792,6 @@
],
"install-path": "../symfony/polyfill-mbstring"
},
- {
- "name": "symfony/polyfill-php56",
- "version": "v1.19.0",
- "version_normalized": "1.19.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "ea19621731cbd973a6702cfedef3419768bf3372"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/ea19621731cbd973a6702cfedef3419768bf3372",
- "reference": "ea19621731cbd973a6702cfedef3419768bf3372",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3",
- "symfony/polyfill-util": "~1.0"
- },
- "time": "2020-10-23T09:01:57+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php56\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
- },
- "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 5.6+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-php56/tree/v1.19.0"
- },
- "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"
- }
- ],
- "install-path": "../symfony/polyfill-php56"
- },
- {
- "name": "symfony/polyfill-php70",
- "version": "v1.19.0",
- "version_normalized": "1.19.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php70.git",
- "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3fe414077251a81a1b15b1c709faf5c2fbae3d4e",
- "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e",
- "shasum": ""
- },
- "require": {
- "paragonie/random_compat": "~1.0|~2.0|~9.99",
- "php": ">=5.3.3"
- },
- "time": "2020-10-23T09:01:57+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.19-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php70\\": ""
- },
- "files": [
- "bootstrap.php"
- ],
- "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 7.0+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-php70/tree/v1.19.0"
- },
- "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"
- }
- ],
- "install-path": "../symfony/polyfill-php70"
- },
{
"name": "symfony/polyfill-php72",
"version": "v1.26.0",
@@ -3749,28 +3872,28 @@
"install-path": "../symfony/polyfill-php72"
},
{
- "name": "symfony/polyfill-util",
- "version": "v1.19.0",
- "version_normalized": "1.19.0.0",
+ "name": "symfony/polyfill-php73",
+ "version": "v1.26.0",
+ "version_normalized": "1.26.0.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-util.git",
- "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a"
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a",
- "reference": "8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85",
+ "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
- "time": "2020-10-21T09:57:48+00:00",
+ "time": "2022-05-24T11:49:31+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.19-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -3779,9 +3902,15 @@
},
"installation-source": "dist",
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Symfony\\Polyfill\\Util\\": ""
- }
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3797,16 +3926,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony utilities for portability of PHP codes",
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
- "compat",
"compatibility",
"polyfill",
+ "portable",
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-util/tree/v1.19.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0"
},
"funding": [
{
@@ -3822,48 +3951,218 @@
"type": "tidelift"
}
],
- "install-path": "../symfony/polyfill-util"
+ "install-path": "../symfony/polyfill-php73"
},
{
- "name": "symfony/routing",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.26.0",
+ "version_normalized": "1.26.0.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/routing.git",
- "reference": "3e522ac69cadffd8131cc2b22157fa7662331a6c"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/3e522ac69cadffd8131cc2b22157fa7662331a6c",
- "reference": "3e522ac69cadffd8131cc2b22157fa7662331a6c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.1"
+ },
+ "time": "2022-05-10T07:21:04+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "installation-source": "dist",
+ "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.26.0"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/polyfill-php80"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.26.0",
+ "version_normalized": "1.26.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+ "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "time": "2022-05-24T11:49:31+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "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.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/polyfill-php81"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v5.4.8",
+ "version_normalized": "5.4.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
+ "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"conflict": {
- "symfony/config": "<3.3.1",
- "symfony/dependency-injection": "<3.3",
- "symfony/yaml": "<3.4"
+ "doctrine/annotations": "<1.12",
+ "symfony/config": "<5.3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/yaml": "<4.4"
},
"require-dev": {
- "doctrine/annotations": "~1.0",
- "psr/log": "~1.0",
- "symfony/config": "^3.3.1|~4.0",
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "~2.8|~3.0|~4.0",
- "symfony/yaml": "~3.4|~4.0"
+ "doctrine/annotations": "^1.12",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.3|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
- "doctrine/annotations": "For using the annotation loader",
"symfony/config": "For using the all-in-one router or any loader",
"symfony/expression-language": "For using expression matching",
"symfony/http-foundation": "For using a Symfony Request object",
"symfony/yaml": "For using the YAML loader"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-04-18T21:45:37+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -3888,7 +4187,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Routing Component",
+ "description": "Maps an HTTP request to a set of configuration variables",
"homepage": "https://symfony.com",
"keywords": [
"router",
@@ -3897,7 +4196,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v3.4.47"
+ "source": "https://github.com/symfony/routing/tree/v5.4.8"
},
"funding": [
{
@@ -3916,24 +4215,111 @@
"install-path": "../symfony/routing"
},
{
- "name": "symfony/stopwatch",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/service-contracts",
+ "version": "v2.5.1",
+ "version_normalized": "2.5.1.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/stopwatch.git",
- "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462"
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/298b81faad4ce60e94466226b2abbb8c9bca7462",
- "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
+ "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "psr/container": "^1.1",
+ "symfony/deprecation-contracts": "^2.1|^3"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "time": "2022-03-13T20:07:29+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "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": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v2.5.1"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/service-contracts"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v5.4.5",
+ "version_normalized": "5.4.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30",
+ "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/service-contracts": "^1|^2|^3"
+ },
+ "time": "2022-02-18T16:06:09+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -3958,10 +4344,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Stopwatch Component",
+ "description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v3.4.47"
+ "source": "https://github.com/symfony/stopwatch/tree/v5.4.5"
},
"funding": [
{
@@ -3980,49 +4366,236 @@
"install-path": "../symfony/stopwatch"
},
{
- "name": "symfony/twig-bridge",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/string",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/twig-bridge.git",
- "reference": "090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042"
+ "url": "https://github.com/symfony/string.git",
+ "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042",
- "reference": "090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042",
+ "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
+ "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "twig/twig": "^1.41|^2.10"
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
},
"conflict": {
- "symfony/console": "<3.4",
- "symfony/form": "<3.4.31|>=4.0,<4.3.4"
+ "symfony/translation-contracts": ">=3.0"
},
"require-dev": {
- "fig/link-util": "^1.0",
- "symfony/asset": "~2.8|~3.0|~4.0",
- "symfony/console": "~3.4|~4.0",
- "symfony/dependency-injection": "~2.8|~3.0|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/form": "^3.4.31|^4.3.4",
- "symfony/http-foundation": "^3.3.11|~4.0",
- "symfony/http-kernel": "~3.2|~4.0",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
+ },
+ "time": "2022-04-19T10:40:37+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "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/v5.4.9"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/string"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v2.5.1",
+ "version_normalized": "2.5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "1211df0afa701e45a04253110e959d4af4ef0f07"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07",
+ "reference": "1211df0afa701e45a04253110e959d4af4ef0f07",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "time": "2022-01-02T09:53:40+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ }
+ },
+ "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": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v2.5.1"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/translation-contracts"
+ },
+ {
+ "name": "symfony/twig-bridge",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/twig-bridge.git",
+ "reference": "fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf",
+ "reference": "fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/translation-contracts": "^1.1|^2|^3",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/console": "<5.3",
+ "symfony/form": "<5.3",
+ "symfony/http-foundation": "<5.3",
+ "symfony/http-kernel": "<4.4",
+ "symfony/translation": "<5.2",
+ "symfony/workflow": "<5.2"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.12",
+ "egulias/email-validator": "^2.1.10|^3",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/asset": "^4.4|^5.0|^6.0",
+ "symfony/console": "^5.3|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/form": "^5.3|^6.0",
+ "symfony/http-foundation": "^5.3|^6.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/intl": "^4.4|^5.0|^6.0",
+ "symfony/mime": "^5.2|^6.0",
"symfony/polyfill-intl-icu": "~1.0",
- "symfony/routing": "~2.8|~3.0|~4.0",
- "symfony/security": "^2.8.31|^3.3.13|~4.0",
- "symfony/security-acl": "~2.8|~3.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/translation": "~2.8|~3.0|~4.0",
- "symfony/var-dumper": "~2.8.10|~3.1.4|~3.2|~4.0",
- "symfony/web-link": "~3.3|~4.0",
- "symfony/workflow": "~3.3|~4.0",
- "symfony/yaml": "~2.8|~3.0|~4.0"
+ "symfony/property-info": "^4.4|^5.1|^6.0",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/security-acl": "^2.8|^3.0",
+ "symfony/security-core": "^4.4|^5.0|^6.0",
+ "symfony/security-csrf": "^4.4|^5.0|^6.0",
+ "symfony/security-http": "^4.4|^5.0|^6.0",
+ "symfony/serializer": "^5.2|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/translation": "^5.2|^6.0",
+ "symfony/web-link": "^4.4|^5.0|^6.0",
+ "symfony/workflow": "^5.2|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0",
+ "twig/cssinliner-extra": "^2.12|^3",
+ "twig/inky-extra": "^2.12|^3",
+ "twig/markdown-extra": "^2.12|^3"
},
"suggest": {
"symfony/asset": "For using the AssetExtension",
@@ -4031,15 +4604,16 @@
"symfony/form": "For using the FormExtension",
"symfony/http-kernel": "For using the HttpKernelExtension",
"symfony/routing": "For using the RoutingExtension",
- "symfony/security": "For using the SecurityExtension",
+ "symfony/security-core": "For using the SecurityExtension",
+ "symfony/security-csrf": "For using the CsrfExtension",
+ "symfony/security-http": "For using the LogoutUrlExtension",
"symfony/stopwatch": "For using the StopwatchExtension",
- "symfony/templating": "For using the TwigEngine",
"symfony/translation": "For using the TranslationExtension",
"symfony/var-dumper": "For using the DumpExtension",
"symfony/web-link": "For using the WebLinkExtension",
"symfony/yaml": "For using the YamlExtension"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-21T10:24:18+00:00",
"type": "symfony-bridge",
"installation-source": "dist",
"autoload": {
@@ -4064,10 +4638,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Twig Bridge",
+ "description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/twig-bridge/tree/v3.4.47"
+ "source": "https://github.com/symfony/twig-bridge/tree/v5.4.9"
},
"funding": [
{
@@ -4087,49 +4661,51 @@
},
{
"name": "symfony/twig-bundle",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.8",
+ "version_normalized": "5.4.8.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bundle.git",
- "reference": "977b3096e2df96bc8a8d2329e83466cfc30c373d"
+ "reference": "c992b4474c3a31f3c40a1ca593d213833f91b818"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/977b3096e2df96bc8a8d2329e83466cfc30c373d",
- "reference": "977b3096e2df96bc8a8d2329e83466cfc30c373d",
+ "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/c992b4474c3a31f3c40a1ca593d213833f91b818",
+ "reference": "c992b4474c3a31f3c40a1ca593d213833f91b818",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/config": "~3.2|~4.0",
- "symfony/debug": "~2.8|~3.0|~4.0",
- "symfony/http-foundation": "~2.8|~3.0|~4.0",
- "symfony/http-kernel": "^3.3|~4.0",
+ "php": ">=7.2.5",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/http-kernel": "^5.0|^6.0",
"symfony/polyfill-ctype": "~1.8",
- "symfony/twig-bridge": "^3.4.3|^4.0.3",
- "twig/twig": "~1.41|~2.10"
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/twig-bridge": "^5.3|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
},
"conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/event-dispatcher": "<3.3.1"
+ "symfony/dependency-injection": "<5.3",
+ "symfony/framework-bundle": "<5.0",
+ "symfony/service-contracts": ">=3.0",
+ "symfony/translation": "<5.0"
},
"require-dev": {
- "doctrine/annotations": "~1.7",
- "doctrine/cache": "~1.0",
- "symfony/asset": "~2.8|~3.0|~4.0",
- "symfony/dependency-injection": "~3.4.24|^4.2.5",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/form": "~2.8|~3.0|~4.0",
- "symfony/framework-bundle": "^3.3.11|~4.0",
- "symfony/routing": "~2.8|~3.0|~4.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0",
- "symfony/templating": "~2.8|~3.0|~4.0",
- "symfony/web-link": "~3.3|~4.0",
- "symfony/yaml": "~2.8|~3.0|~4.0"
+ "doctrine/annotations": "^1.10.4",
+ "doctrine/cache": "^1.0|^2.0",
+ "symfony/asset": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^5.3|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/form": "^4.4|^5.0|^6.0",
+ "symfony/framework-bundle": "^5.0|^6.0",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "symfony/translation": "^5.0|^6.0",
+ "symfony/web-link": "^4.4|^5.0|^6.0",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-04-03T13:03:10+00:00",
"type": "symfony-bundle",
"installation-source": "dist",
"autoload": {
@@ -4154,10 +4730,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony TwigBundle",
+ "description": "Provides a tight integration of Twig into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/twig-bundle/tree/v3.4.47"
+ "source": "https://github.com/symfony/twig-bundle/tree/v5.4.8"
},
"funding": [
{
@@ -4177,36 +4753,44 @@
},
{
"name": "symfony/var-dumper",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d"
+ "reference": "af52239a330fafd192c773795520dc2dd62b5657"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0719f6cf4633a38b2c1585140998579ce23b4b7d",
- "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657",
+ "reference": "af52239a330fafd192c773795520dc2dd62b5657",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.16"
},
"conflict": {
- "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/console": "<4.4"
},
"require-dev": {
"ext-iconv": "*",
- "twig/twig": "~1.34|~2.4"
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/uid": "^5.1|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
},
"suggest": {
"ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
"ext-intl": "To show region name in time zone dump",
- "ext-symfony_debug": ""
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-21T10:24:18+00:00",
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -4234,14 +4818,14 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "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/v3.4.47"
+ "source": "https://github.com/symfony/var-dumper/tree/v5.4.9"
},
"funding": [
{
@@ -4260,44 +4844,119 @@
"install-path": "../symfony/var-dumper"
},
{
- "name": "symfony/web-profiler-bundle",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "name": "symfony/var-exporter",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/web-profiler-bundle.git",
- "reference": "ccb83b3a508f4a683e44f571f127beebdc315ff9"
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ccb83b3a508f4a683e44f571f127beebdc315ff9",
- "reference": "ccb83b3a508f4a683e44f571f127beebdc315ff9",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/63249ebfca4e75a357679fa7ba2089cfb898aa67",
+ "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/config": "~3.4|~4.0",
- "symfony/http-kernel": "~3.4.25|^4.2.6",
- "symfony/polyfill-php70": "~1.0",
- "symfony/routing": "~3.4.7|~4.0",
- "symfony/twig-bundle": "~3.4|~4.0",
- "symfony/var-dumper": "~3.3|~4.0",
- "twig/twig": "~1.34|~2.4"
- },
- "conflict": {
- "symfony/dependency-injection": "<3.4",
- "symfony/event-dispatcher": "<3.3.1",
- "symfony/framework-bundle": ">4.3.99",
- "symfony/var-dumper": "<3.3"
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
},
"require-dev": {
- "symfony/browser-kit": "~3.4|~4.0",
- "symfony/console": "~3.4|~4.0",
- "symfony/css-selector": "~3.4|~4.0",
- "symfony/framework-bundle": "~3.4|~4.0",
- "symfony/stopwatch": "~3.4|~4.0"
+ "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-05-21T10:24:18+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "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",
+ "serialize"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-exporter/tree/v5.4.9"
+ },
+ "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"
+ }
+ ],
+ "install-path": "../symfony/var-exporter"
+ },
+ {
+ "name": "symfony/web-profiler-bundle",
+ "version": "v5.4.8",
+ "version_normalized": "5.4.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/web-profiler-bundle.git",
+ "reference": "909c6eea7815066a80d0a362ed41abd7924e376a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/909c6eea7815066a80d0a362ed41abd7924e376a",
+ "reference": "909c6eea7815066a80d0a362ed41abd7924e376a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/framework-bundle": "^5.3|^6.0",
+ "symfony/http-kernel": "^5.3|^6.0",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/routing": "^4.4|^5.0|^6.0",
+ "symfony/twig-bundle": "^4.4|^5.0|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.2",
+ "symfony/form": "<4.4",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<4.4"
+ },
+ "require-dev": {
+ "symfony/browser-kit": "^4.4|^5.0|^6.0",
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/css-selector": "^4.4|^5.0|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0"
+ },
+ "time": "2022-04-22T08:14:12+00:00",
"type": "symfony-bundle",
"installation-source": "dist",
"autoload": {
@@ -4322,10 +4981,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony WebProfilerBundle",
+ "description": "Provides a development tool that gives detailed information about the execution of any request",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/web-profiler-bundle/tree/v3.4.47"
+ "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.8"
},
"funding": [
{
@@ -4345,33 +5004,37 @@
},
{
"name": "symfony/yaml",
- "version": "v3.4.47",
- "version_normalized": "3.4.47.0",
+ "version": "v5.4.3",
+ "version_normalized": "5.4.3.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "88289caa3c166321883f67fe5130188ebbb47094"
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094",
- "reference": "88289caa3c166321883f67fe5130188ebbb47094",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2",
+ "reference": "e80f87d2c9495966768310fc531b487ce64237a2",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-ctype": "^1.8"
},
"conflict": {
- "symfony/console": "<3.4"
+ "symfony/console": "<5.3"
},
"require-dev": {
- "symfony/console": "~3.4|~4.0"
+ "symfony/console": "^5.3|^6.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
},
- "time": "2020-10-24T10:57:07+00:00",
+ "time": "2022-01-26T16:32:32+00:00",
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -4396,10 +5059,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Yaml Component",
+ "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v3.4.47"
+ "source": "https://github.com/symfony/yaml/tree/v5.4.3"
},
"funding": [
{
@@ -4530,39 +5193,37 @@
},
{
"name": "twig/twig",
- "version": "v1.42.5",
- "version_normalized": "1.42.5.0",
+ "version": "v3.4.1",
+ "version_normalized": "3.4.1.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e"
+ "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
- "reference": "87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/e939eae92386b69b49cfa4599dd9bead6bf4a342",
+ "reference": "e939eae92386b69b49cfa4599dd9bead6bf4a342",
"shasum": ""
},
"require": {
- "php": ">=5.5.0",
- "symfony/polyfill-ctype": "^1.8"
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-mbstring": "^1.3"
},
"require-dev": {
"psr/container": "^1.0",
- "symfony/phpunit-bridge": "^4.4|^5.0"
+ "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
},
- "time": "2020-02-11T05:59:23+00:00",
+ "time": "2022-05-17T05:48:52+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.42-dev"
+ "dev-master": "3.4-dev"
}
},
"installation-source": "dist",
"autoload": {
- "psr-0": {
- "Twig_": "lib/"
- },
"psr-4": {
"Twig\\": "src/"
}
@@ -4595,15 +5256,24 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/1.x"
+ "source": "https://github.com/twigphp/Twig/tree/v3.4.1"
},
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
"install-path": "../twig/twig"
}
],
"dev": true,
"dev-package-names": [
"symfony/stopwatch",
- "symfony/var-dumper",
"symfony/web-profiler-bundle"
]
}
diff --git a/lib/composer/installed.php b/lib/composer/installed.php
index 2b457fd04..b2317328e 100644
--- a/lib/composer/installed.php
+++ b/lib/composer/installed.php
@@ -5,7 +5,7 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => '64d860a43a7f5037933a9f12981aab93ca17a2e8',
+ 'reference' => 'b4f827f399a5d20dbe01c4da84a7dba41aaecb15',
'name' => '__root__',
'dev' => true,
),
@@ -16,7 +16,7 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => '64d860a43a7f5037933a9f12981aab93ca17a2e8',
+ 'reference' => 'b4f827f399a5d20dbe01c4da84a7dba41aaecb15',
'dev_requirement' => false,
),
'combodo/tcpdf' => array(
@@ -53,12 +53,12 @@
'dev_requirement' => false,
),
'guzzlehttp/guzzle' => array(
- 'pretty_version' => '6.5.6',
- 'version' => '6.5.6.0',
+ 'pretty_version' => '6.5.7',
+ 'version' => '6.5.7.0',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
'aliases' => array(),
- 'reference' => 'f092dd734083473658de3ee4bef093ed77d2689c',
+ 'reference' => '724562fa861e21a4071c652c8a159934e4f05592',
'dev_requirement' => false,
),
'guzzlehttp/promises' => array(
@@ -170,12 +170,12 @@
'dev_requirement' => false,
),
'paragonie/random_compat' => array(
- 'pretty_version' => 'v2.0.18',
- 'version' => '2.0.18.0',
+ 'pretty_version' => 'v9.99.100',
+ 'version' => '9.99.100.0',
'type' => 'library',
'install_path' => __DIR__ . '/../paragonie/random_compat',
'aliases' => array(),
- 'reference' => '0a58ef6e3146256cc3dc7cc393927bcc7d1b72db',
+ 'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a',
'dev_requirement' => false,
),
'pear/archive_tar' => array(
@@ -197,12 +197,12 @@
'dev_requirement' => false,
),
'pear/pear-core-minimal' => array(
- 'pretty_version' => 'v1.10.10',
- 'version' => '1.10.10.0',
+ 'pretty_version' => 'v1.10.11',
+ 'version' => '1.10.11.0',
'type' => 'library',
'install_path' => __DIR__ . '/../pear/pear-core-minimal',
'aliases' => array(),
- 'reference' => '625a3c429d9b2c1546438679074cac1b089116a7',
+ 'reference' => '68d0d32ada737153b7e93b8d3c710ebe70ac867d',
'dev_requirement' => false,
),
'pear/pear_exception' => array(
@@ -235,16 +235,16 @@
'psr/cache-implementation' => array(
'dev_requirement' => false,
'provided' => array(
- 0 => '1.0',
+ 0 => '1.0|2.0',
),
),
'psr/container' => array(
- 'pretty_version' => '1.0.0',
- 'version' => '1.0.0.0',
+ 'pretty_version' => '1.1.1',
+ 'version' => '1.1.1.0',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/container',
'aliases' => array(),
- 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f',
+ 'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
'dev_requirement' => false,
),
'psr/container-implementation' => array(
@@ -254,6 +254,21 @@
1 => '1.0',
),
),
+ 'psr/event-dispatcher' => array(
+ 'pretty_version' => '1.0.0',
+ 'version' => '1.0.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../psr/event-dispatcher',
+ 'aliases' => array(),
+ 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
+ 'dev_requirement' => false,
+ ),
+ 'psr/event-dispatcher-implementation' => array(
+ 'dev_requirement' => false,
+ 'provided' => array(
+ 0 => '1.0',
+ ),
+ ),
'psr/http-message' => array(
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
@@ -270,33 +285,24 @@
),
),
'psr/log' => array(
- 'pretty_version' => '1.1.2',
- 'version' => '1.1.2.0',
+ 'pretty_version' => '1.1.4',
+ 'version' => '1.1.4.0',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/log',
'aliases' => array(),
- 'reference' => '446d54b4cb6bf489fc9d75f55843658e6f25d801',
+ 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
'dev_requirement' => false,
),
'psr/log-implementation' => array(
'dev_requirement' => false,
'provided' => array(
- 0 => '1.0',
+ 0 => '1.0|2.0',
),
),
- 'psr/simple-cache' => array(
- 'pretty_version' => '1.0.1',
- 'version' => '1.0.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../psr/simple-cache',
- 'aliases' => array(),
- 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
- 'dev_requirement' => false,
- ),
'psr/simple-cache-implementation' => array(
'dev_requirement' => false,
'provided' => array(
- 0 => '1.0',
+ 0 => '1.0|2.0',
),
),
'ralouphie/getallheaders' => array(
@@ -311,160 +317,190 @@
'rsky/pear-core-min' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => 'v1.10.10',
+ 0 => 'v1.10.11',
),
),
'scssphp/scssphp' => array(
- 'pretty_version' => '1.0.6',
- 'version' => '1.0.6.0',
+ 'pretty_version' => 'v1.10.3',
+ 'version' => '1.10.3.0',
'type' => 'library',
'install_path' => __DIR__ . '/../scssphp/scssphp',
'aliases' => array(),
- 'reference' => '5b3c9d704950d8f9637f5110c36c281ec47dc13c',
+ 'reference' => '0f1e1516ed2412ad43e42a6a319e77624ba1f713',
'dev_requirement' => false,
),
'symfony/cache' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/cache',
'aliases' => array(),
- 'reference' => 'a7a14c4832760bd1fbd31be2859ffedc9b6ff813',
+ 'reference' => 'a50b7249bea81ddd6d3b799ce40c5521c2f72f0b',
'dev_requirement' => false,
),
- 'symfony/class-loader' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'symfony/cache-contracts' => array(
+ 'pretty_version' => 'v2.5.1',
+ 'version' => '2.5.1.0',
'type' => 'library',
- 'install_path' => __DIR__ . '/../symfony/class-loader',
+ 'install_path' => __DIR__ . '/../symfony/cache-contracts',
'aliases' => array(),
- 'reference' => 'a22265a9f3511c0212bf79f54910ca5a77c0e92c',
+ 'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc',
'dev_requirement' => false,
),
+ 'symfony/cache-implementation' => array(
+ 'dev_requirement' => false,
+ 'provided' => array(
+ 0 => '1.0|2.0',
+ ),
+ ),
'symfony/config' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/config',
'aliases' => array(),
- 'reference' => 'bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f',
+ 'reference' => '8f551fe22672ac7ab2c95fe46d899f960ed4d979',
'dev_requirement' => false,
),
'symfony/console' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/console',
'aliases' => array(),
- 'reference' => 'a10b1da6fc93080c180bba7219b5ff5b7518fe81',
+ 'reference' => '829d5d1bf60b2efeb0887b7436873becc71a45eb',
'dev_requirement' => false,
),
'symfony/css-selector' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.3',
+ 'version' => '5.4.3.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/css-selector',
'aliases' => array(),
- 'reference' => 'da3d9da2ce0026771f5fe64cb332158f1bd2bc33',
- 'dev_requirement' => false,
- ),
- 'symfony/debug' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../symfony/debug',
- 'aliases' => array(),
- 'reference' => 'ab42889de57fdfcfcc0759ab102e2fd4ea72dcae',
+ 'reference' => 'b0a190285cd95cb019237851205b8140ef6e368e',
'dev_requirement' => false,
),
'symfony/dependency-injection' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/dependency-injection',
'aliases' => array(),
- 'reference' => '51d2a2708c6ceadad84393f8581df1dcf9e5e84b',
+ 'reference' => 'beecae161577305926ec078c4ed973f2b98880b3',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/deprecation-contracts' => array(
+ 'pretty_version' => 'v2.5.1',
+ 'version' => '2.5.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
+ 'aliases' => array(),
+ 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66',
'dev_requirement' => false,
),
'symfony/dotenv' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.5',
+ 'version' => '5.4.5.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/dotenv',
'aliases' => array(),
- 'reference' => '1022723ac4f56b001d99691d96c6025dbf1404f1',
+ 'reference' => '83a2310904a4f5d4f42526227b5a578ac82232a9',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/error-handler' => array(
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/error-handler',
+ 'aliases' => array(),
+ 'reference' => 'c116cda1f51c678782768dce89a45f13c949455d',
'dev_requirement' => false,
),
'symfony/event-dispatcher' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/event-dispatcher',
'aliases' => array(),
- 'reference' => '31fde73757b6bad247c54597beef974919ec6860',
+ 'reference' => '8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc',
'dev_requirement' => false,
),
+ 'symfony/event-dispatcher-contracts' => array(
+ 'pretty_version' => 'v2.5.1',
+ 'version' => '2.5.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts',
+ 'aliases' => array(),
+ 'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/event-dispatcher-implementation' => array(
+ 'dev_requirement' => false,
+ 'provided' => array(
+ 0 => '2.0',
+ ),
+ ),
'symfony/filesystem' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/filesystem',
'aliases' => array(),
- 'reference' => 'e58d7841cddfed6e846829040dca2cca0ebbbbb3',
+ 'reference' => '36a017fa4cce1eff1b8e8129ff53513abcef05ba',
'dev_requirement' => false,
),
'symfony/finder' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.8',
+ 'version' => '5.4.8.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/finder',
'aliases' => array(),
- 'reference' => 'b6b6ad3db3edb1b4b1c1896b1975fb684994de6e',
+ 'reference' => '9b630f3427f3ebe7cd346c277a1408b00249dad9',
'dev_requirement' => false,
),
'symfony/framework-bundle' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'symfony-bundle',
'install_path' => __DIR__ . '/../symfony/framework-bundle',
'aliases' => array(),
- 'reference' => '6c95e747b75ddd2af61152ce93bf87299d15710e',
+ 'reference' => '1cb89cd3e36d5060545d0f223f00a774fa6430ef',
'dev_requirement' => false,
),
'symfony/http-foundation' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-foundation',
'aliases' => array(),
- 'reference' => 'b9885fcce6fe494201da4f70a9309770e9d13dc8',
+ 'reference' => '6b0d0e4aca38d57605dcd11e2416994b38774522',
'dev_requirement' => false,
),
'symfony/http-kernel' => array(
- 'pretty_version' => 'v3.4.49',
- 'version' => '3.4.49.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-kernel',
'aliases' => array(),
- 'reference' => '5aa72405f5bd5583c36ed6e756acb17d3f98ac40',
- 'dev_requirement' => false,
- ),
- 'symfony/polyfill-apcu' => array(
- 'pretty_version' => 'v1.19.0',
- 'version' => '1.19.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../symfony/polyfill-apcu',
- 'aliases' => array(),
- 'reference' => 'b44b51e7814c23bfbd793a16ead5d7ce43ed23c5',
+ 'reference' => '34b121ad3dc761f35fe1346d2f15618f8cbf77f8',
'dev_requirement' => false,
),
'symfony/polyfill-ctype' => array(
- 'pretty_version' => 'v1.19.0',
- 'version' => '1.19.0.0',
+ 'pretty_version' => 'v1.26.0',
+ 'version' => '1.26.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
'aliases' => array(),
- 'reference' => 'aed596913b70fae57be53d86faa2e9ef85a2297b',
+ 'reference' => '6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/polyfill-intl-grapheme' => array(
+ 'pretty_version' => 'v1.26.0',
+ 'version' => '1.26.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme',
+ 'aliases' => array(),
+ 'reference' => '433d05519ce6990bf3530fba6957499d327395c2',
'dev_requirement' => false,
),
'symfony/polyfill-intl-idn' => array(
@@ -486,30 +522,12 @@
'dev_requirement' => false,
),
'symfony/polyfill-mbstring' => array(
- 'pretty_version' => 'v1.19.0',
- 'version' => '1.19.0.0',
+ 'pretty_version' => 'v1.26.0',
+ 'version' => '1.26.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(),
- 'reference' => 'b5f7b932ee6fa802fc792eabd77c4c88084517ce',
- 'dev_requirement' => false,
- ),
- 'symfony/polyfill-php56' => array(
- 'pretty_version' => 'v1.19.0',
- 'version' => '1.19.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../symfony/polyfill-php56',
- 'aliases' => array(),
- 'reference' => 'ea19621731cbd973a6702cfedef3419768bf3372',
- 'dev_requirement' => false,
- ),
- 'symfony/polyfill-php70' => array(
- 'pretty_version' => 'v1.19.0',
- 'version' => '1.19.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../symfony/polyfill-php70',
- 'aliases' => array(),
- 'reference' => '3fe414077251a81a1b15b1c709faf5c2fbae3d4e',
+ 'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e',
'dev_requirement' => false,
),
'symfony/polyfill-php72' => array(
@@ -521,76 +539,136 @@
'reference' => 'bf44a9fd41feaac72b074de600314a93e2ae78e2',
'dev_requirement' => false,
),
- 'symfony/polyfill-util' => array(
- 'pretty_version' => 'v1.19.0',
- 'version' => '1.19.0.0',
+ 'symfony/polyfill-php73' => array(
+ 'pretty_version' => 'v1.26.0',
+ 'version' => '1.26.0.0',
'type' => 'library',
- 'install_path' => __DIR__ . '/../symfony/polyfill-util',
+ 'install_path' => __DIR__ . '/../symfony/polyfill-php73',
'aliases' => array(),
- 'reference' => '8df0c3e6a4b85df9a5c6f3f2f46fba5c5c47058a',
+ 'reference' => 'e440d35fa0286f77fb45b79a03fedbeda9307e85',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/polyfill-php80' => array(
+ 'pretty_version' => 'v1.26.0',
+ 'version' => '1.26.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/polyfill-php80',
+ 'aliases' => array(),
+ 'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/polyfill-php81' => array(
+ 'pretty_version' => 'v1.26.0',
+ 'version' => '1.26.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/polyfill-php81',
+ 'aliases' => array(),
+ 'reference' => '13f6d1271c663dc5ae9fb843a8f16521db7687a1',
'dev_requirement' => false,
),
'symfony/routing' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.8',
+ 'version' => '5.4.8.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/routing',
'aliases' => array(),
- 'reference' => '3e522ac69cadffd8131cc2b22157fa7662331a6c',
+ 'reference' => 'e07817bb6244ea33ef5ad31abc4a9288bef3f2f7',
'dev_requirement' => false,
),
+ 'symfony/service-contracts' => array(
+ 'pretty_version' => 'v2.5.1',
+ 'version' => '2.5.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/service-contracts',
+ 'aliases' => array(),
+ 'reference' => '24d9dc654b83e91aa59f9d167b131bc3b5bea24c',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/service-implementation' => array(
+ 'dev_requirement' => false,
+ 'provided' => array(
+ 0 => '1.0|2.0',
+ ),
+ ),
'symfony/stopwatch' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.5',
+ 'version' => '5.4.5.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/stopwatch',
'aliases' => array(),
- 'reference' => '298b81faad4ce60e94466226b2abbb8c9bca7462',
+ 'reference' => '4d04b5c24f3c9a1a168a131f6cbe297155bc0d30',
'dev_requirement' => true,
),
+ 'symfony/string' => array(
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/string',
+ 'aliases' => array(),
+ 'reference' => '985e6a9703ef5ce32ba617c9c7d97873bb7b2a99',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/translation-contracts' => array(
+ 'pretty_version' => 'v2.5.1',
+ 'version' => '2.5.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/translation-contracts',
+ 'aliases' => array(),
+ 'reference' => '1211df0afa701e45a04253110e959d4af4ef0f07',
+ 'dev_requirement' => false,
+ ),
'symfony/twig-bridge' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'symfony-bridge',
'install_path' => __DIR__ . '/../symfony/twig-bridge',
'aliases' => array(),
- 'reference' => '090d19d6f1ea5b9e1d79f372785aa5e5c9cd4042',
+ 'reference' => 'fd13c89a1abdbaa7ee2e655d9a11405adcb7a6cf',
'dev_requirement' => false,
),
'symfony/twig-bundle' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.8',
+ 'version' => '5.4.8.0',
'type' => 'symfony-bundle',
'install_path' => __DIR__ . '/../symfony/twig-bundle',
'aliases' => array(),
- 'reference' => '977b3096e2df96bc8a8d2329e83466cfc30c373d',
+ 'reference' => 'c992b4474c3a31f3c40a1ca593d213833f91b818',
'dev_requirement' => false,
),
'symfony/var-dumper' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/var-dumper',
'aliases' => array(),
- 'reference' => '0719f6cf4633a38b2c1585140998579ce23b4b7d',
- 'dev_requirement' => true,
+ 'reference' => 'af52239a330fafd192c773795520dc2dd62b5657',
+ 'dev_requirement' => false,
+ ),
+ 'symfony/var-exporter' => array(
+ 'pretty_version' => 'v5.4.9',
+ 'version' => '5.4.9.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../symfony/var-exporter',
+ 'aliases' => array(),
+ 'reference' => '63249ebfca4e75a357679fa7ba2089cfb898aa67',
+ 'dev_requirement' => false,
),
'symfony/web-profiler-bundle' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.8',
+ 'version' => '5.4.8.0',
'type' => 'symfony-bundle',
'install_path' => __DIR__ . '/../symfony/web-profiler-bundle',
'aliases' => array(),
- 'reference' => 'ccb83b3a508f4a683e44f571f127beebdc315ff9',
+ 'reference' => '909c6eea7815066a80d0a362ed41abd7924e376a',
'dev_requirement' => true,
),
'symfony/yaml' => array(
- 'pretty_version' => 'v3.4.47',
- 'version' => '3.4.47.0',
+ 'pretty_version' => 'v5.4.3',
+ 'version' => '5.4.3.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/yaml',
'aliases' => array(),
- 'reference' => '88289caa3c166321883f67fe5130188ebbb47094',
+ 'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2',
'dev_requirement' => false,
),
'tecnickcom/tcpdf' => array(
@@ -618,12 +696,12 @@
'dev_requirement' => false,
),
'twig/twig' => array(
- 'pretty_version' => 'v1.42.5',
- 'version' => '1.42.5.0',
+ 'pretty_version' => 'v3.4.1',
+ 'version' => '3.4.1.0',
'type' => 'library',
'install_path' => __DIR__ . '/../twig/twig',
'aliases' => array(),
- 'reference' => '87b2ea9d8f6fd014d0621ca089bb1b3769ea3f8e',
+ 'reference' => 'e939eae92386b69b49cfa4599dd9bead6bf4a342',
'dev_requirement' => false,
),
'zendframework/zend-loader' => array(
diff --git a/lib/composer/platform_check.php b/lib/composer/platform_check.php
index 861c725e0..4bf5e61af 100644
--- a/lib/composer/platform_check.php
+++ b/lib/composer/platform_check.php
@@ -4,12 +4,11 @@
$issues = array();
-if (!(PHP_VERSION_ID >= 70103)) {
- $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.3". You are running ' . PHP_VERSION . '.';
+if (!(PHP_VERSION_ID >= 70205)) {
+ $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.';
}
$missingExtensions = array();
-extension_loaded('ctype') || $missingExtensions[] = 'ctype';
extension_loaded('dom') || $missingExtensions[] = 'dom';
extension_loaded('gd') || $missingExtensions[] = 'gd';
extension_loaded('iconv') || $missingExtensions[] = 'iconv';
diff --git a/lib/guzzlehttp/guzzle/CHANGELOG.md b/lib/guzzlehttp/guzzle/CHANGELOG.md
index 95d26df21..b053017a9 100644
--- a/lib/guzzlehttp/guzzle/CHANGELOG.md
+++ b/lib/guzzlehttp/guzzle/CHANGELOG.md
@@ -1,5 +1,15 @@
# Change Log
+## 6.5.8 - 2022-06-20
+
+* Fix change in port should be considered a change in origin
+* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin
+
+## 6.5.7 - 2022-06-09
+
+* Fix failure to strip Authorization header on HTTP downgrade
+* Fix failure to strip the Cookie header on change in host or HTTP downgrade
+
## 6.5.6 - 2022-05-25
* Fix cross-domain cookie leakage
diff --git a/lib/guzzlehttp/guzzle/README.md b/lib/guzzlehttp/guzzle/README.md
index 00d2066e9..bc98e1a10 100644
--- a/lib/guzzlehttp/guzzle/README.md
+++ b/lib/guzzlehttp/guzzle/README.md
@@ -1,5 +1,6 @@
-Guzzle, PHP HTTP client
-=======================
+
+
+# Guzzle, PHP HTTP client
[](https://github.com/guzzle/guzzle/releases)
[](https://github.com/guzzle/guzzle/actions?query=workflow%3ACI)
@@ -38,15 +39,18 @@ $promise->wait();
## Help and docs
-- [Documentation](http://guzzlephp.org/)
-- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)
+We use GitHub issues only to discuss bugs and new features. For support please refer to:
+
+- [Documentation](https://docs.guzzlephp.org)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle)
+- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/)
- [Gitter](https://gitter.im/guzzle/guzzle)
## Installing Guzzle
The recommended way to install Guzzle is through
-[Composer](http://getcomposer.org).
+[Composer](https://getcomposer.org/).
```bash
# Install Composer
@@ -87,7 +91,7 @@ composer update
[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
[guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5
[guzzle-7-repo]: https://github.com/guzzle/guzzle
-[guzzle-3-docs]: http://guzzle3.readthedocs.org
-[guzzle-5-docs]: http://docs.guzzlephp.org/en/5.3/
-[guzzle-6-docs]: http://docs.guzzlephp.org/en/6.5/
-[guzzle-7-docs]: http://docs.guzzlephp.org/en/latest/
+[guzzle-3-docs]: https://guzzle3.readthedocs.io/
+[guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/
+[guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/
+[guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/
diff --git a/lib/guzzlehttp/guzzle/composer.json b/lib/guzzlehttp/guzzle/composer.json
index b9cb386a6..a57d78f60 100644
--- a/lib/guzzlehttp/guzzle/composer.json
+++ b/lib/guzzlehttp/guzzle/composer.json
@@ -53,9 +53,9 @@
"require": {
"php": ">=5.5",
"ext-json": "*",
- "symfony/polyfill-intl-idn": "^1.17.0",
+ "symfony/polyfill-intl-idn": "^1.17",
"guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.6.1"
+ "guzzlehttp/psr7": "^1.9"
},
"require-dev": {
"ext-curl": "*",
@@ -66,7 +66,10 @@
"psr/log": "Required for using the Log middleware"
},
"config": {
- "sort-packages": true
+ "sort-packages": true,
+ "allow-plugins": {
+ "bamarni/composer-bin-plugin": true
+ }
},
"extra": {
"branch-alias": {
diff --git a/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php b/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php
index e4644b7ac..008a29b8c 100644
--- a/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php
+++ b/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php
@@ -94,6 +94,14 @@ class RedirectMiddleware
$this->guardMax($request, $options);
$nextRequest = $this->modifyRequest($request, $options, $response);
+ // If authorization is handled by curl, unset it if URI is cross-origin.
+ if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) {
+ unset(
+ $options['curl'][\CURLOPT_HTTPAUTH],
+ $options['curl'][\CURLOPT_USERPWD]
+ );
+ }
+
if (isset($options['allow_redirects']['on_redirect'])) {
call_user_func(
$options['allow_redirects']['on_redirect'],
@@ -141,7 +149,7 @@ class RedirectMiddleware
}
/**
- * Check for too many redirects
+ * Check for too many redirects.
*
* @return void
*
@@ -190,7 +198,7 @@ class RedirectMiddleware
$modify['body'] = '';
}
- $uri = $this->redirectUri($request, $response, $protocols);
+ $uri = self::redirectUri($request, $response, $protocols);
if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {
$idnOptions = ($options['idn_conversion'] === true) ? IDNA_DEFAULT : $options['idn_conversion'];
$uri = Utils::idnUriConvert($uri, $idnOptions);
@@ -210,16 +218,17 @@ class RedirectMiddleware
$modify['remove_headers'][] = 'Referer';
}
- // Remove Authorization header if host is different.
- if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {
+ // Remove Authorization and Cookie headers if URI is cross-origin.
+ if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) {
$modify['remove_headers'][] = 'Authorization';
+ $modify['remove_headers'][] = 'Cookie';
}
return Psr7\modify_request($request, $modify);
}
/**
- * Set the appropriate URL on the request based on the location header
+ * Set the appropriate URL on the request based on the location header.
*
* @param RequestInterface $request
* @param ResponseInterface $response
@@ -227,7 +236,7 @@ class RedirectMiddleware
*
* @return UriInterface
*/
- private function redirectUri(
+ private static function redirectUri(
RequestInterface $request,
ResponseInterface $response,
array $protocols
diff --git a/lib/guzzlehttp/psr7/CHANGELOG.md b/lib/guzzlehttp/psr7/CHANGELOG.md
index f177f583f..b4fdf3c68 100644
--- a/lib/guzzlehttp/psr7/CHANGELOG.md
+++ b/lib/guzzlehttp/psr7/CHANGELOG.md
@@ -3,12 +3,18 @@
All notable changes to this project will be documented in this file.
-The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
-and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
+## 1.9.0 - 2022-06-20
+
+### Added
+
+- Added `UriComparator::isCrossOrigin` method
+
## 1.8.5 - 2022-03-20
### Fixed
diff --git a/lib/guzzlehttp/psr7/README.md b/lib/guzzlehttp/psr7/README.md
index 464cae4f2..64776cb66 100644
--- a/lib/guzzlehttp/psr7/README.md
+++ b/lib/guzzlehttp/psr7/README.md
@@ -1,6 +1,6 @@
# PSR-7 Message Implementation
-This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)
+This repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/)
message implementation, several stream decorators, and some helpful
functionality like query string parsing.
@@ -659,7 +659,7 @@ manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__to
`public static function fromParts(array $parts): UriInterface`
-Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.
+Creates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components.
### `GuzzleHttp\Psr7\Uri::withQueryValue`
@@ -684,6 +684,16 @@ associative array of key => value.
Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the
provided key are removed.
+## Cross-Origin Detection
+
+`GuzzleHttp\Psr7\UriComparator` provides methods to determine if a modified URL should be considered cross-origin.
+
+### `GuzzleHttp\Psr7\UriComparator::isCrossOrigin`
+
+`public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool`
+
+Determines if a modified URL should be considered cross-origin with respect to an original URL.
+
## Reference Resolution
`GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according
@@ -809,14 +819,24 @@ This of course assumes they will be resolved against the same base URI. If this
equivalence or difference of relative references does not mean anything.
+## Version Guidance
+
+| Version | Status | PHP Version |
+|---------|----------------|------------------|
+| 1.x | Security fixes | >=5.4,<8.1 |
+| 2.x | Latest | ^7.2.5 \|\| ^8.0 |
+
+
## Security
If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information.
+
## License
Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.
+
## For Enterprise
Available as part of the Tidelift Subscription
diff --git a/lib/guzzlehttp/psr7/composer.json b/lib/guzzlehttp/psr7/composer.json
index 7ecdc8ba3..0e36920db 100644
--- a/lib/guzzlehttp/psr7/composer.json
+++ b/lib/guzzlehttp/psr7/composer.json
@@ -63,7 +63,7 @@
},
"extra": {
"branch-alias": {
- "dev-master": "1.7-dev"
+ "dev-master": "1.9-dev"
}
},
"config": {
diff --git a/lib/guzzlehttp/psr7/src/UriComparator.php b/lib/guzzlehttp/psr7/src/UriComparator.php
new file mode 100644
index 000000000..ccf51ffb8
--- /dev/null
+++ b/lib/guzzlehttp/psr7/src/UriComparator.php
@@ -0,0 +1,55 @@
+getHost(), $modified->getHost()) !== 0) {
+ return true;
+ }
+
+ if ($original->getScheme() !== $modified->getScheme()) {
+ return true;
+ }
+
+ if (self::computePort($original) !== self::computePort($modified)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @return int
+ */
+ private static function computePort(UriInterface $uri)
+ {
+ $port = $uri->getPort();
+
+ if (null !== $port) {
+ return $port;
+ }
+
+ return 'https' === $uri->getScheme() ? 443 : 80;
+ }
+
+ private function __construct()
+ {
+ // cannot be instantiated
+ }
+}
diff --git a/lib/paragonie/random_compat/build-phar.sh b/lib/paragonie/random_compat/build-phar.sh
new file mode 100644
index 000000000..b4a5ba31c
--- /dev/null
+++ b/lib/paragonie/random_compat/build-phar.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) )
+
+php -dphar.readonly=0 "$basedir/other/build_phar.php" $*
\ No newline at end of file
diff --git a/lib/paragonie/random_compat/composer.json b/lib/paragonie/random_compat/composer.json
index 34f1381d5..f2b9c4e51 100644
--- a/lib/paragonie/random_compat/composer.json
+++ b/lib/paragonie/random_compat/composer.json
@@ -22,17 +22,13 @@
"source": "https://github.com/paragonie/random_compat"
},
"require": {
- "php": ">=5.2.0"
+ "php": ">= 7"
},
"require-dev": {
+ "vimeo/psalm": "^1",
"phpunit/phpunit": "4.*|5.*"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
- },
- "autoload": {
- "files": [
- "lib/random.php"
- ]
}
}
diff --git a/lib/paragonie/random_compat/lib/byte_safe_strings.php b/lib/paragonie/random_compat/lib/byte_safe_strings.php
deleted file mode 100644
index ef24488f9..000000000
--- a/lib/paragonie/random_compat/lib/byte_safe_strings.php
+++ /dev/null
@@ -1,195 +0,0 @@
- RandomCompat_strlen($binary_string)) {
- return '';
- }
-
- return (string) mb_substr(
- (string) $binary_string,
- (int) $start,
- (int) $length,
- '8bit'
- );
- }
-
- } else {
-
- /**
- * substr() implementation that isn't brittle to mbstring.func_overload
- *
- * This version just uses the default substr()
- *
- * @param string $binary_string
- * @param int $start
- * @param int|null $length (optional)
- *
- * @throws TypeError
- *
- * @return string
- */
- function RandomCompat_substr($binary_string, $start, $length = null)
- {
- if (!is_string($binary_string)) {
- throw new TypeError(
- 'RandomCompat_substr(): First argument should be a string'
- );
- }
-
- if (!is_int($start)) {
- throw new TypeError(
- 'RandomCompat_substr(): Second argument should be an integer'
- );
- }
-
- if ($length !== null) {
- if (!is_int($length)) {
- throw new TypeError(
- 'RandomCompat_substr(): Third argument should be an integer, or omitted'
- );
- }
-
- return (string) substr(
- (string )$binary_string,
- (int) $start,
- (int) $length
- );
- }
-
- return (string) substr(
- (string) $binary_string,
- (int) $start
- );
- }
- }
-}
diff --git a/lib/paragonie/random_compat/lib/cast_to_int.php b/lib/paragonie/random_compat/lib/cast_to_int.php
deleted file mode 100644
index 1b1bbfe8d..000000000
--- a/lib/paragonie/random_compat/lib/cast_to_int.php
+++ /dev/null
@@ -1,77 +0,0 @@
- operators might accidentally let a float
- * through.
- *
- * @param int|float $number The number we want to convert to an int
- * @param bool $fail_open Set to true to not throw an exception
- *
- * @return float|int
- * @psalm-suppress InvalidReturnType
- *
- * @throws TypeError
- */
- function RandomCompat_intval($number, $fail_open = false)
- {
- if (is_int($number) || is_float($number)) {
- $number += 0;
- } elseif (is_numeric($number)) {
- /** @psalm-suppress InvalidOperand */
- $number += 0;
- }
- /** @var int|float $number */
-
- if (
- is_float($number)
- &&
- $number > ~PHP_INT_MAX
- &&
- $number < PHP_INT_MAX
- ) {
- $number = (int) $number;
- }
-
- if (is_int($number)) {
- return (int) $number;
- } elseif (!$fail_open) {
- throw new TypeError(
- 'Expected an integer.'
- );
- }
- return $number;
- }
-}
diff --git a/lib/paragonie/random_compat/lib/error_polyfill.php b/lib/paragonie/random_compat/lib/error_polyfill.php
deleted file mode 100644
index c02c5c8b4..000000000
--- a/lib/paragonie/random_compat/lib/error_polyfill.php
+++ /dev/null
@@ -1,49 +0,0 @@
-= 70000) {
- return;
-}
-
-if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
- define('RANDOM_COMPAT_READ_BUFFER', 8);
-}
-
-$RandomCompatDIR = dirname(__FILE__);
-
-require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'byte_safe_strings.php';
-require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'cast_to_int.php';
-require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'error_polyfill.php';
-
-if (!is_callable('random_bytes')) {
- /**
- * PHP 5.2.0 - 5.6.x way to implement random_bytes()
- *
- * We use conditional statements here to define the function in accordance
- * to the operating environment. It's a micro-optimization.
- *
- * In order of preference:
- * 1. Use libsodium if available.
- * 2. fread() /dev/urandom if available (never on Windows)
- * 3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM)
- * 4. COM('CAPICOM.Utilities.1')->GetRandom()
- *
- * See RATIONALE.md for our reasoning behind this particular order
- */
- if (extension_loaded('libsodium')) {
- // See random_bytes_libsodium.php
- if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) {
- require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium.php';
- } elseif (method_exists('Sodium', 'randombytes_buf')) {
- require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium_legacy.php';
- }
- }
-
- /**
- * Reading directly from /dev/urandom:
- */
- if (DIRECTORY_SEPARATOR === '/') {
- // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast
- // way to exclude Windows.
- $RandomCompatUrandom = true;
- $RandomCompat_basedir = ini_get('open_basedir');
-
- if (!empty($RandomCompat_basedir)) {
- $RandomCompat_open_basedir = explode(
- PATH_SEPARATOR,
- strtolower($RandomCompat_basedir)
- );
- $RandomCompatUrandom = (array() !== array_intersect(
- array('/dev', '/dev/', '/dev/urandom'),
- $RandomCompat_open_basedir
- ));
- $RandomCompat_open_basedir = null;
- }
-
- if (
- !is_callable('random_bytes')
- &&
- $RandomCompatUrandom
- &&
- @is_readable('/dev/urandom')
- ) {
- // Error suppression on is_readable() in case of an open_basedir
- // or safe_mode failure. All we care about is whether or not we
- // can read it at this point. If the PHP environment is going to
- // panic over trying to see if the file can be read in the first
- // place, that is not helpful to us here.
-
- // See random_bytes_dev_urandom.php
- require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_dev_urandom.php';
- }
- // Unset variables after use
- $RandomCompat_basedir = null;
- } else {
- $RandomCompatUrandom = false;
- }
-
- /**
- * mcrypt_create_iv()
- *
- * We only want to use mcypt_create_iv() if:
- *
- * - random_bytes() hasn't already been defined
- * - the mcrypt extensions is loaded
- * - One of these two conditions is true:
- * - We're on Windows (DIRECTORY_SEPARATOR !== '/')
- * - We're not on Windows and /dev/urandom is readabale
- * (i.e. we're not in a chroot jail)
- * - Special case:
- * - If we're not on Windows, but the PHP version is between
- * 5.6.10 and 5.6.12, we don't want to use mcrypt. It will
- * hang indefinitely. This is bad.
- * - If we're on Windows, we want to use PHP >= 5.3.7 or else
- * we get insufficient entropy errors.
- */
- if (
- !is_callable('random_bytes')
- &&
- // Windows on PHP < 5.3.7 is broken, but non-Windows is not known to be.
- (DIRECTORY_SEPARATOR === '/' || PHP_VERSION_ID >= 50307)
- &&
- // Prevent this code from hanging indefinitely on non-Windows;
- // see https://bugs.php.net/bug.php?id=69833
- (
- DIRECTORY_SEPARATOR !== '/' ||
- (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613)
- )
- &&
- extension_loaded('mcrypt')
- ) {
- // See random_bytes_mcrypt.php
- require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_mcrypt.php';
- }
- $RandomCompatUrandom = null;
-
- /**
- * This is a Windows-specific fallback, for when the mcrypt extension
- * isn't loaded.
- */
- if (
- !is_callable('random_bytes')
- &&
- extension_loaded('com_dotnet')
- &&
- class_exists('COM')
- ) {
- $RandomCompat_disabled_classes = preg_split(
- '#\s*,\s*#',
- strtolower(ini_get('disable_classes'))
- );
-
- if (!in_array('com', $RandomCompat_disabled_classes)) {
- try {
- $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1');
- if (method_exists($RandomCompatCOMtest, 'GetRandom')) {
- // See random_bytes_com_dotnet.php
- require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_com_dotnet.php';
- }
- } catch (com_exception $e) {
- // Don't try to use it.
- }
- }
- $RandomCompat_disabled_classes = null;
- $RandomCompatCOMtest = null;
- }
-
- /**
- * throw new Exception
- */
- if (!is_callable('random_bytes')) {
- /**
- * We don't have any more options, so let's throw an exception right now
- * and hope the developer won't let it fail silently.
- *
- * @param mixed $length
- * @psalm-suppress InvalidReturnType
- * @throws Exception
- * @return string
- */
- function random_bytes($length)
- {
- unset($length); // Suppress "variable not used" warnings.
- throw new Exception(
- 'There is no suitable CSPRNG installed on your system'
- );
- return '';
- }
- }
-}
-
-if (!is_callable('random_int')) {
- require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_int.php';
-}
-
-$RandomCompatDIR = null;
+// NOP
diff --git a/lib/paragonie/random_compat/lib/random_bytes_com_dotnet.php b/lib/paragonie/random_compat/lib/random_bytes_com_dotnet.php
deleted file mode 100644
index 537d02b27..000000000
--- a/lib/paragonie/random_compat/lib/random_bytes_com_dotnet.php
+++ /dev/null
@@ -1,91 +0,0 @@
-GetRandom($bytes, 0));
- if (RandomCompat_strlen($buf) >= $bytes) {
- /**
- * Return our random entropy buffer here:
- */
- return (string) RandomCompat_substr($buf, 0, $bytes);
- }
- ++$execCount;
- } while ($execCount < $bytes);
-
- /**
- * If we reach here, PHP has failed us.
- */
- throw new Exception(
- 'Could not gather sufficient random data'
- );
- }
-}
diff --git a/lib/paragonie/random_compat/lib/random_bytes_dev_urandom.php b/lib/paragonie/random_compat/lib/random_bytes_dev_urandom.php
deleted file mode 100644
index c4e31ccbb..000000000
--- a/lib/paragonie/random_compat/lib/random_bytes_dev_urandom.php
+++ /dev/null
@@ -1,190 +0,0 @@
- $st */
- $st = fstat($fp);
- if (($st['mode'] & 0170000) !== 020000) {
- fclose($fp);
- $fp = false;
- }
- }
- }
-
- if (is_resource($fp)) {
- /**
- * stream_set_read_buffer() does not exist in HHVM
- *
- * If we don't set the stream's read buffer to 0, PHP will
- * internally buffer 8192 bytes, which can waste entropy
- *
- * stream_set_read_buffer returns 0 on success
- */
- if (is_callable('stream_set_read_buffer')) {
- stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
- }
- if (is_callable('stream_set_chunk_size')) {
- stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
- }
- }
- }
-
- try {
- /** @var int $bytes */
- $bytes = RandomCompat_intval($bytes);
- } catch (TypeError $ex) {
- throw new TypeError(
- 'random_bytes(): $bytes must be an integer'
- );
- }
-
- if ($bytes < 1) {
- throw new Error(
- 'Length must be greater than 0'
- );
- }
-
- /**
- * This if() block only runs if we managed to open a file handle
- *
- * It does not belong in an else {} block, because the above
- * if (empty($fp)) line is logic that should only be run once per
- * page load.
- */
- if (is_resource($fp)) {
- /**
- * @var int
- */
- $remaining = $bytes;
-
- /**
- * @var string|bool
- */
- $buf = '';
-
- /**
- * We use fread() in a loop to protect against partial reads
- */
- do {
- /**
- * @var string|bool
- */
- $read = fread($fp, $remaining);
- if (!is_string($read)) {
- /**
- * We cannot safely read from the file. Exit the
- * do-while loop and trigger the exception condition
- *
- * @var string|bool
- */
- $buf = false;
- break;
- }
- /**
- * Decrease the number of bytes returned from remaining
- */
- $remaining -= RandomCompat_strlen($read);
- /**
- * @var string $buf
- */
- $buf .= $read;
- } while ($remaining > 0);
-
- /**
- * Is our result valid?
- * @var string|bool $buf
- */
- if (is_string($buf)) {
- if (RandomCompat_strlen($buf) === $bytes) {
- /**
- * Return our random entropy buffer here:
- */
- return $buf;
- }
- }
- }
-
- /**
- * If we reach here, PHP has failed us.
- */
- throw new Exception(
- 'Error reading from source device'
- );
- }
-}
diff --git a/lib/paragonie/random_compat/lib/random_bytes_libsodium.php b/lib/paragonie/random_compat/lib/random_bytes_libsodium.php
deleted file mode 100644
index 2e5629018..000000000
--- a/lib/paragonie/random_compat/lib/random_bytes_libsodium.php
+++ /dev/null
@@ -1,91 +0,0 @@
- 2147483647) {
- $buf = '';
- for ($i = 0; $i < $bytes; $i += 1073741824) {
- $n = ($bytes - $i) > 1073741824
- ? 1073741824
- : $bytes - $i;
- $buf .= \Sodium\randombytes_buf($n);
- }
- } else {
- /** @var string|bool $buf */
- $buf = \Sodium\randombytes_buf($bytes);
- }
-
- if (is_string($buf)) {
- if (RandomCompat_strlen($buf) === $bytes) {
- return $buf;
- }
- }
-
- /**
- * If we reach here, PHP has failed us.
- */
- throw new Exception(
- 'Could not gather sufficient random data'
- );
- }
-}
diff --git a/lib/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php b/lib/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
deleted file mode 100644
index f78b2199a..000000000
--- a/lib/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
+++ /dev/null
@@ -1,93 +0,0 @@
- 2147483647) {
- for ($i = 0; $i < $bytes; $i += 1073741824) {
- $n = ($bytes - $i) > 1073741824
- ? 1073741824
- : $bytes - $i;
- $buf .= Sodium::randombytes_buf((int) $n);
- }
- } else {
- $buf .= Sodium::randombytes_buf((int) $bytes);
- }
-
- if (is_string($buf)) {
- if (RandomCompat_strlen($buf) === $bytes) {
- return $buf;
- }
- }
-
- /**
- * If we reach here, PHP has failed us.
- */
- throw new Exception(
- 'Could not gather sufficient random data'
- );
- }
-}
diff --git a/lib/paragonie/random_compat/lib/random_bytes_mcrypt.php b/lib/paragonie/random_compat/lib/random_bytes_mcrypt.php
deleted file mode 100644
index 0b13fa73c..000000000
--- a/lib/paragonie/random_compat/lib/random_bytes_mcrypt.php
+++ /dev/null
@@ -1,79 +0,0 @@
- operators might accidentally let a float
- * through.
- */
-
- try {
- /** @var int $min */
- $min = RandomCompat_intval($min);
- } catch (TypeError $ex) {
- throw new TypeError(
- 'random_int(): $min must be an integer'
- );
- }
-
- try {
- /** @var int $max */
- $max = RandomCompat_intval($max);
- } catch (TypeError $ex) {
- throw new TypeError(
- 'random_int(): $max must be an integer'
- );
- }
-
- /**
- * Now that we've verified our weak typing system has given us an integer,
- * let's validate the logic then we can move forward with generating random
- * integers along a given range.
- */
- if ($min > $max) {
- throw new Error(
- 'Minimum value must be less than or equal to the maximum value'
- );
- }
-
- if ($max === $min) {
- return (int) $min;
- }
-
- /**
- * Initialize variables to 0
- *
- * We want to store:
- * $bytes => the number of random bytes we need
- * $mask => an integer bitmask (for use with the &) operator
- * so we can minimize the number of discards
- */
- $attempts = $bits = $bytes = $mask = $valueShift = 0;
- /** @var int $attempts */
- /** @var int $bits */
- /** @var int $bytes */
- /** @var int $mask */
- /** @var int $valueShift */
-
- /**
- * At this point, $range is a positive number greater than 0. It might
- * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
- * a float and we will lose some precision.
- *
- * @var int|float $range
- */
- $range = $max - $min;
-
- /**
- * Test for integer overflow:
- */
- if (!is_int($range)) {
-
- /**
- * Still safely calculate wider ranges.
- * Provided by @CodesInChaos, @oittaa
- *
- * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435
- *
- * We use ~0 as a mask in this case because it generates all 1s
- *
- * @ref https://eval.in/400356 (32-bit)
- * @ref http://3v4l.org/XX9r5 (64-bit)
- */
- $bytes = PHP_INT_SIZE;
- /** @var int $mask */
- $mask = ~0;
-
- } else {
-
- /**
- * $bits is effectively ceil(log($range, 2)) without dealing with
- * type juggling
- */
- while ($range > 0) {
- if ($bits % 8 === 0) {
- ++$bytes;
- }
- ++$bits;
- $range >>= 1;
- /** @var int $mask */
- $mask = $mask << 1 | 1;
- }
- $valueShift = $min;
- }
-
- /** @var int $val */
- $val = 0;
- /**
- * Now that we have our parameters set up, let's begin generating
- * random integers until one falls between $min and $max
- */
- /** @psalm-suppress RedundantCondition */
- do {
- /**
- * The rejection probability is at most 0.5, so this corresponds
- * to a failure probability of 2^-128 for a working RNG
- */
- if ($attempts > 128) {
- throw new Exception(
- 'random_int: RNG is broken - too many rejections'
- );
- }
-
- /**
- * Let's grab the necessary number of random bytes
- */
- $randomByteString = random_bytes($bytes);
-
- /**
- * Let's turn $randomByteString into an integer
- *
- * This uses bitwise operators (<< and |) to build an integer
- * out of the values extracted from ord()
- *
- * Example: [9F] | [6D] | [32] | [0C] =>
- * 159 + 27904 + 3276800 + 201326592 =>
- * 204631455
- */
- $val &= 0;
- for ($i = 0; $i < $bytes; ++$i) {
- $val |= ord($randomByteString[$i]) << ($i * 8);
- }
- /** @var int $val */
-
- /**
- * Apply mask
- */
- $val &= $mask;
- $val += $valueShift;
-
- ++$attempts;
- /**
- * If $val overflows to a floating point number,
- * ... or is larger than $max,
- * ... or smaller than $min,
- * then try again.
- */
- } while (!is_int($val) || $val > $max || $val < $min);
-
- return (int) $val;
- }
-}
diff --git a/lib/paragonie/random_compat/other/build_phar.php b/lib/paragonie/random_compat/other/build_phar.php
new file mode 100644
index 000000000..70ef4b2ed
--- /dev/null
+++ b/lib/paragonie/random_compat/other/build_phar.php
@@ -0,0 +1,57 @@
+buildFromDirectory(dirname(__DIR__).'/lib');
+rename(
+ dirname(__DIR__).'/lib/index.php',
+ dirname(__DIR__).'/lib/random.php'
+);
+
+/**
+ * If we pass an (optional) path to a private key as a second argument, we will
+ * sign the Phar with OpenSSL.
+ *
+ * If you leave this out, it will produce an unsigned .phar!
+ */
+if ($argc > 1) {
+ if (!@is_readable($argv[1])) {
+ echo 'Could not read the private key file:', $argv[1], "\n";
+ exit(255);
+ }
+ $pkeyFile = file_get_contents($argv[1]);
+
+ $private = openssl_get_privatekey($pkeyFile);
+ if ($private !== false) {
+ $pkey = '';
+ openssl_pkey_export($private, $pkey);
+ $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey);
+
+ /**
+ * Save the corresponding public key to the file
+ */
+ if (!@is_readable($dist.'/random_compat.phar.pubkey')) {
+ $details = openssl_pkey_get_details($private);
+ file_put_contents(
+ $dist.'/random_compat.phar.pubkey',
+ $details['key']
+ );
+ }
+ } else {
+ echo 'An error occurred reading the private key from OpenSSL.', "\n";
+ exit(255);
+ }
+}
diff --git a/lib/paragonie/random_compat/psalm-autoload.php b/lib/paragonie/random_compat/psalm-autoload.php
new file mode 100644
index 000000000..d71d1b818
--- /dev/null
+++ b/lib/paragonie/random_compat/psalm-autoload.php
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/pear/pear-core-minimal/src/OS/Guess.php b/lib/pear/pear-core-minimal/src/OS/Guess.php
index d5aa295c3..88cd65910 100644
--- a/lib/pear/pear-core-minimal/src/OS/Guess.php
+++ b/lib/pear/pear-core-minimal/src/OS/Guess.php
@@ -4,14 +4,14 @@
*
* PHP versions 4 and 5
*
- * @category pear
- * @package PEAR
- * @author Stig Bakken
- * @author Gregory Beaver
- * @copyright 1997-2009 The Authors
- * @license http://opensource.org/licenses/bsd-license.php New BSD License
- * @link http://pear.php.net/package/PEAR
- * @since File available since PEAR 0.1
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken
+ * @author Gregory Beaver
+ * @copyright 1997-2009 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR
+ * @since File available since PEAR 0.1
*/
// {{{ uname examples
@@ -80,15 +80,15 @@
*
* This class uses php_uname() to grok information about the current OS
*
- * @category pear
- * @package PEAR
- * @author Stig Bakken
- * @author Gregory Beaver
- * @copyright 1997-2009 The Authors
- * @license http://opensource.org/licenses/bsd-license.php New BSD License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/PEAR
- * @since Class available since Release 0.1
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken
+ * @author Gregory Beaver
+ * @copyright 1997-2020 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PEAR
+ * @since Class available since Release 0.1
*/
class OS_Guess
{
@@ -138,13 +138,9 @@ class OS_Guess
$release = "$parts[3].$parts[2]";
break;
case 'Windows' :
- switch ($parts[1]) {
- case '95/98':
- $release = '9x';
- break;
- default:
- $release = $parts[1];
- break;
+ $release = $parts[1];
+ if ($release == '95/98') {
+ $release = '9x';
}
$cpu = 'i386';
break;
@@ -157,18 +153,10 @@ class OS_Guess
$sysname = 'darwin';
$nodename = $parts[2];
$release = $parts[3];
- if ($cpu == 'Macintosh') {
- if ($parts[$n - 2] == 'Power') {
- $cpu = 'powerpc';
- }
- }
+ $cpu = $this->_determineIfPowerpc($cpu, $parts);
break;
case 'Darwin' :
- if ($cpu == 'Macintosh') {
- if ($parts[$n - 2] == 'Power') {
- $cpu = 'powerpc';
- }
- }
+ $cpu = $this->_determineIfPowerpc($cpu, $parts);
$release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
break;
default:
@@ -187,6 +175,15 @@ class OS_Guess
return array($sysname, $release, $cpu, $extra, $nodename);
}
+ function _determineIfPowerpc($cpu, $parts)
+ {
+ $n = count($parts);
+ if ($cpu == 'Macintosh' && $parts[$n - 2] == 'Power') {
+ $cpu = 'powerpc';
+ }
+ return $cpu;
+ }
+
function _detectGlibcVersion()
{
static $glibc = false;
@@ -196,74 +193,29 @@ class OS_Guess
$major = $minor = 0;
include_once "System.php";
- if (@is_link('/lib64/libc.so.6')) {
- // Let's try reading the libc.so.6 symlink
- if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib64/libc.so.6')), $matches)) {
- list($major, $minor) = explode('.', $matches[1]);
- }
- } else if (@is_link('/lib/libc.so.6')) {
- // Let's try reading the libc.so.6 symlink
- if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) {
- list($major, $minor) = explode('.', $matches[1]);
+ // Let's try reading possible libc.so.6 symlinks
+ $libcs = array(
+ '/lib64/libc.so.6',
+ '/lib/libc.so.6',
+ '/lib/i386-linux-gnu/libc.so.6'
+ );
+ $versions = array();
+ foreach ($libcs as $file) {
+ $versions = $this->_readGlibCVersionFromSymlink($file);
+ if ($versions != []) {
+ list($major, $minor) = $versions;
+ break;
}
}
+
// Use glibc's header file to
// get major and minor version number:
- if (!($major && $minor) &&
- @file_exists('/usr/include/features.h') &&
- @is_readable('/usr/include/features.h')) {
- if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
- $features_file = fopen('/usr/include/features.h', 'rb');
- while (!feof($features_file)) {
- $line = fgets($features_file, 8192);
- if (!$line || (strpos($line, '#define') === false)) {
- continue;
- }
- if (strpos($line, '__GLIBC__')) {
- // major version number #define __GLIBC__ version
- $line = preg_split('/\s+/', $line);
- $glibc_major = trim($line[2]);
- if (isset($glibc_minor)) {
- break;
- }
- continue;
- }
-
- if (strpos($line, '__GLIBC_MINOR__')) {
- // got the minor version number
- // #define __GLIBC_MINOR__ version
- $line = preg_split('/\s+/', $line);
- $glibc_minor = trim($line[2]);
- if (isset($glibc_major)) {
- break;
- }
- continue;
- }
- }
- fclose($features_file);
- if (!isset($glibc_major) || !isset($glibc_minor)) {
- return $glibc = '';
- }
- return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ;
- } // no cpp
-
- $tmpfile = System::mktemp("glibctest");
- $fp = fopen($tmpfile, "w");
- fwrite($fp, "#include \n__GLIBC__ __GLIBC_MINOR__\n");
- fclose($fp);
- $cpp = popen("/usr/bin/cpp $tmpfile", "r");
- while ($line = fgets($cpp, 1024)) {
- if ($line[0] == '#' || trim($line) == '') {
- continue;
- }
-
- if (list($major, $minor) = explode(' ', trim($line))) {
- break;
- }
- }
- pclose($cpp);
- unlink($tmpfile);
- } // features.h
+ if (!($major && $minor)) {
+ $versions = $this->_readGlibCVersionFromFeaturesHeaderFile();
+ }
+ if (is_array($versions) && $versions != []) {
+ list($major, $minor) = $versions;
+ }
if (!($major && $minor)) {
return $glibc = '';
@@ -272,6 +224,102 @@ class OS_Guess
return $glibc = "glibc{$major}.{$minor}";
}
+ function _readGlibCVersionFromSymlink($file)
+ {
+ $versions = array();
+ if (@is_link($file)
+ && (preg_match('/^libc-(.*)\.so$/', basename(readlink($file)), $matches))
+ ) {
+ $versions = explode('.', $matches[1]);
+ }
+ return $versions;
+ }
+
+
+ function _readGlibCVersionFromFeaturesHeaderFile()
+ {
+ $features_header_file = '/usr/include/features.h';
+ if (!(@file_exists($features_header_file)
+ && @is_readable($features_header_file))
+ ) {
+ return array();
+ }
+ if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
+ return $this-_parseFeaturesHeaderFile($features_header_file);
+ } // no cpp
+
+ return $this->_fromGlibCTest();
+ }
+
+ function _parseFeaturesHeaderFile($features_header_file)
+ {
+ $features_file = fopen($features_header_file, 'rb');
+ while (!feof($features_file)) {
+ $line = fgets($features_file, 8192);
+ if (!$this->_IsADefinition($line)) {
+ continue;
+ }
+ if (strpos($line, '__GLIBC__')) {
+ // major version number #define __GLIBC__ version
+ $line = preg_split('/\s+/', $line);
+ $glibc_major = trim($line[2]);
+ if (isset($glibc_minor)) {
+ break;
+ }
+ continue;
+ }
+
+ if (strpos($line, '__GLIBC_MINOR__')) {
+ // got the minor version number
+ // #define __GLIBC_MINOR__ version
+ $line = preg_split('/\s+/', $line);
+ $glibc_minor = trim($line[2]);
+ if (isset($glibc_major)) {
+ break;
+ }
+ }
+ }
+ fclose($features_file);
+ if (!isset($glibc_major) || !isset($glibc_minor)) {
+ return array();
+ }
+ return array(trim($glibc_major), trim($glibc_minor));
+ }
+
+ function _IsADefinition($line)
+ {
+ if ($line === false) {
+ return false;
+ }
+ return strpos(trim($line), '#define') !== false;
+ }
+
+ function _fromGlibCTest()
+ {
+ $major = null;
+ $minor = null;
+
+ $tmpfile = System::mktemp("glibctest");
+ $fp = fopen($tmpfile, "w");
+ fwrite($fp, "#include \n__GLIBC__ __GLIBC_MINOR__\n");
+ fclose($fp);
+ $cpp = popen("/usr/bin/cpp $tmpfile", "r");
+ while ($line = fgets($cpp, 1024)) {
+ if ($line[0] == '#' || trim($line) == '') {
+ continue;
+ }
+
+ if (list($major, $minor) = explode(' ', trim($line))) {
+ break;
+ }
+ }
+ pclose($cpp);
+ unlink($tmpfile);
+ if ($major !== null && $minor !== null) {
+ return [$major, $minor];
+ }
+ }
+
function getSignature()
{
if (empty($this->extra)) {
@@ -328,12 +376,16 @@ class OS_Guess
function _matchFragment($fragment, $value)
{
if (strcspn($fragment, '*?') < strlen($fragment)) {
- $reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/';
+ $expression = str_replace(
+ array('*', '?', '/'),
+ array('.*', '.', '\\/'),
+ $fragment
+ );
+ $reg = '/^' . $expression . '\\z/';
return preg_match($reg, $value);
}
return ($fragment == '*' || !strcasecmp($fragment, $value));
}
-
}
/*
* Local Variables:
diff --git a/lib/pear/pear-core-minimal/src/System.php b/lib/pear/pear-core-minimal/src/System.php
index cf8f37993..a7ef46598 100644
--- a/lib/pear/pear-core-minimal/src/System.php
+++ b/lib/pear/pear-core-minimal/src/System.php
@@ -530,7 +530,9 @@ class System
// It's possible to run a .bat on Windows that is_executable
// would return false for. The is_executable check is meaningless...
if (OS_WINDOWS) {
- return $file;
+ if (file_exists($file)) {
+ return $file;
+ }
} else {
if (is_executable($file)) {
return $file;
diff --git a/lib/psr/container/README.md b/lib/psr/container/README.md
index 084f6df51..1b9d9e570 100644
--- a/lib/psr/container/README.md
+++ b/lib/psr/container/README.md
@@ -1,5 +1,13 @@
-# PSR Container
+Container interface
+==============
-This repository holds all interfaces/classes/traits related to [PSR-11](https://github.com/container-interop/fig-standards/blob/master/proposed/container.md).
+This repository holds all interfaces related to [PSR-11 (Container Interface)][psr-url].
+
+Note that this is not a Container implementation of its own. It is merely abstractions that describe the components of a Dependency Injection Container.
+
+The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist.
+
+[psr-url]: https://www.php-fig.org/psr/psr-11/
+[package-url]: https://packagist.org/packages/psr/container
+[implementation-url]: https://packagist.org/providers/psr/container-implementation
-Note that this is not a container implementation of its own. See the specification for more details.
diff --git a/lib/psr/container/composer.json b/lib/psr/container/composer.json
index b8ee01265..3797a2538 100644
--- a/lib/psr/container/composer.json
+++ b/lib/psr/container/composer.json
@@ -8,20 +8,15 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"require": {
- "php": ">=5.3.0"
+ "php": ">=7.2.0"
},
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
}
- },
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
}
}
diff --git a/lib/psr/container/src/ContainerExceptionInterface.php b/lib/psr/container/src/ContainerExceptionInterface.php
index d35c6b4d8..cf10b8b4f 100644
--- a/lib/psr/container/src/ContainerExceptionInterface.php
+++ b/lib/psr/container/src/ContainerExceptionInterface.php
@@ -1,7 +1,4 @@
=5.3.0"
+ "php": ">=7.2.0"
},
"autoload": {
"psr-4": {
- "Psr\\SimpleCache\\": "src/"
+ "Psr\\EventDispatcher\\": "src/"
}
},
"extra": {
diff --git a/lib/psr/event-dispatcher/src/EventDispatcherInterface.php b/lib/psr/event-dispatcher/src/EventDispatcherInterface.php
new file mode 100644
index 000000000..4306fa915
--- /dev/null
+++ b/lib/psr/event-dispatcher/src/EventDispatcherInterface.php
@@ -0,0 +1,21 @@
+ 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/lib/psr/simple-cache/README.md b/lib/psr/simple-cache/README.md
deleted file mode 100644
index 43641d175..000000000
--- a/lib/psr/simple-cache/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-PHP FIG Simple Cache PSR
-========================
-
-This repository holds all interfaces related to PSR-16.
-
-Note that this is not a cache implementation of its own. It is merely an interface that describes a cache implementation. See [the specification](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-16-simple-cache.md) for more details.
-
-You can find implementations of the specification by looking for packages providing the [psr/simple-cache-implementation](https://packagist.org/providers/psr/simple-cache-implementation) virtual package.
diff --git a/lib/psr/simple-cache/src/CacheException.php b/lib/psr/simple-cache/src/CacheException.php
deleted file mode 100644
index eba53815c..000000000
--- a/lib/psr/simple-cache/src/CacheException.php
+++ /dev/null
@@ -1,10 +0,0 @@
- value pairs. Cache keys that do not exist or are stale will have $default as value.
- *
- * @throws \Psr\SimpleCache\InvalidArgumentException
- * MUST be thrown if $keys is neither an array nor a Traversable,
- * or if any of the $keys are not a legal value.
- */
- public function getMultiple($keys, $default = null);
-
- /**
- * Persists a set of key => value pairs in the cache, with an optional TTL.
- *
- * @param iterable $values A list of key => value pairs for a multiple-set operation.
- * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and
- * the driver supports TTL then the library may set a default value
- * for it or let the driver take care of that.
- *
- * @return bool True on success and false on failure.
- *
- * @throws \Psr\SimpleCache\InvalidArgumentException
- * MUST be thrown if $values is neither an array nor a Traversable,
- * or if any of the $values are not a legal value.
- */
- public function setMultiple($values, $ttl = null);
-
- /**
- * Deletes multiple cache items in a single operation.
- *
- * @param iterable $keys A list of string-based keys to be deleted.
- *
- * @return bool True if the items were successfully removed. False if there was an error.
- *
- * @throws \Psr\SimpleCache\InvalidArgumentException
- * MUST be thrown if $keys is neither an array nor a Traversable,
- * or if any of the $keys are not a legal value.
- */
- public function deleteMultiple($keys);
-
- /**
- * Determines whether an item is present in the cache.
- *
- * NOTE: It is recommended that has() is only to be used for cache warming type purposes
- * and not to be used within your live applications operations for get/set, as this method
- * is subject to a race condition where your has() will return true and immediately after,
- * another script can remove it making the state of your app out of date.
- *
- * @param string $key The cache item key.
- *
- * @return bool
- *
- * @throws \Psr\SimpleCache\InvalidArgumentException
- * MUST be thrown if the $key string is not a legal value.
- */
- public function has($key);
-}
diff --git a/lib/psr/simple-cache/src/InvalidArgumentException.php b/lib/psr/simple-cache/src/InvalidArgumentException.php
deleted file mode 100644
index 6a9524a20..000000000
--- a/lib/psr/simple-cache/src/InvalidArgumentException.php
+++ /dev/null
@@ -1,13 +0,0 @@
-
+###
-[](http://travis-ci.org/scssphp/scssphp)
+
[](https://packagist.org/packages/scssphp/scssphp)
`scssphp` is a compiler for SCSS written in PHP.
-Checkout the homepage, , for directions on how to use.
+Checkout the homepage, , for directions on how to use.
## Running Tests
@@ -23,8 +23,7 @@ There are several tests in the `tests/` directory:
* `FailingTest.php` contains tests reported in Github issues that demonstrate compatibility bugs.
* `InputTest.php` compiles every `.scss` file in the `tests/inputs` directory
then compares to the respective `.css` file in the `tests/outputs` directory.
-* `ScssTest.php` extracts (ruby) `scss` tests from the `tests/scss_test.rb` file.
-* `ServerTest.php` contains functional tests for the `Server` class.
+* `SassSpecTest.php` extracts tests from the `sass/sass-spec` repository.
When changing any of the tests in `tests/inputs`, the tests will most likely
fail because the output has changed. Once you verify that the output is correct
@@ -32,16 +31,41 @@ you can run the following command to rebuild all the tests:
BUILD=1 vendor/bin/phpunit tests
-This will compile all the tests, and save results into `tests/outputs`.
+This will compile all the tests, and save results into `tests/outputs`. It also
+updates the list of excluded specs from sass-spec.
-To enable the `scss` compatibility tests:
+To enable the full `sass-spec` compatibility tests:
- TEST_SCSS_COMPAT=1 vendor/bin/phpunit tests
+ TEST_SASS_SPEC=1 vendor/bin/phpunit tests
## Coding Standard
-`scssphp` source conforms to [PSR2](http://www.php-fig.org/psr/psr-2/).
+`scssphp` source conforms to [PSR12](https://www.php-fig.org/psr/psr-12/).
Run the following command from the root directory to check the code for "sniffs".
- vendor/bin/phpcs --standard=PSR2 bin src tests
+ vendor/bin/phpcs --standard=PSR12 --extensions=php bin src tests *.php
+
+## Static Analysis
+
+`scssphp` uses [phpstan](https://phpstan.org/) for static analysis.
+
+Run the following command from the root directory to analyse the codebase:
+
+ make phpstan
+
+As most of the codebase is composed of legacy code which cannot be type-checked
+fully, the setup contains a baseline file with all errors we want to ignore. In
+particular, we ignore all errors related to not specifying the types inside arrays
+when these arrays correspond to the representation of Sass values and Sass AST nodes
+in the parser and compiler.
+When contributing, the proper process to deal with static analysis is the following:
+
+1. Make your change in the codebase
+2. Run `make phpstan`
+3. Fix errors reported by phpstan when possible
+4. Repeat step 2 and 3 until nothing gets fixed anymore at step 3
+5. Run `make phpstan-baseline` to regenerate the phpstan baseline
+
+Additions to the baseline will be reviewed to avoid ignoring errors that should have
+been fixed.
diff --git a/lib/scssphp/scssphp/bin/pscss b/lib/scssphp/scssphp/bin/pscss
index f944b6325..0f009d6bd 100644
--- a/lib/scssphp/scssphp/bin/pscss
+++ b/lib/scssphp/scssphp/bin/pscss
@@ -1,9 +1,10 @@
#!/usr/bin/env php
parse($data)), true));
+ fwrite(STDERR, 'Warning: the --dump-tree option is deprecated. Use proper debugging tools instead.');
+
exit();
}
$scss = new Compiler();
-if ($debugInfo) {
- $scss->setLineNumberStyle(Compiler::DEBUG_INFO);
-}
-
-if ($lineNumbers) {
- $scss->setLineNumberStyle(Compiler::LINE_COMMENTS);
-}
-
-if ($ignoreErrors) {
- $scss->setIgnoreErrors($ignoreErrors);
-}
-
if ($loadPaths) {
- $scss->setImportPaths(explode(PATH_SEPARATOR, $loadPaths));
-}
-
-if ($precision) {
- $scss->setNumberPrecision($precision);
+ $scss->setImportPaths($loadPaths);
}
if ($style) {
- $scss->setFormatter('ScssPhp\\ScssPhp\\Formatter\\' . ucfirst($style));
+ if ($style === OutputStyle::COMPRESSED || $style === OutputStyle::EXPANDED) {
+ $scss->setOutputStyle($style);
+ } else {
+ fwrite(STDERR, "WARNING: the $style style is deprecated.\n");
+ $scss->setFormatter('ScssPhp\\ScssPhp\\Formatter\\' . ucfirst($style));
+ }
}
+$outputFile = isset($arguments[1]) ? $arguments[1] : null;
+$sourceMapFile = null;
+
if ($sourceMap) {
- $scss->setSourceMap(Compiler::SOURCE_MAP_INLINE);
+ $sourceMapOptions = array(
+ 'outputSourceFiles' => $embedSources,
+ );
+ if ($embedSourceMap || $outputFile === null) {
+ $scss->setSourceMap(Compiler::SOURCE_MAP_INLINE);
+ } else {
+ $sourceMapFile = $outputFile . '.map';
+ $sourceMapOptions['sourceMapWriteTo'] = $sourceMapFile;
+ $sourceMapOptions['sourceMapURL'] = basename($sourceMapFile);
+ $sourceMapOptions['sourceMapBasepath'] = getcwd();
+ $sourceMapOptions['sourceMapFilename'] = basename($outputFile);
+
+ $scss->setSourceMap(Compiler::SOURCE_MAP_FILE);
+ }
+
+ $scss->setSourceMapOptions($sourceMapOptions);
}
if ($encoding) {
$scss->setEncoding($encoding);
}
-echo $scss->compile($data, $inputFile);
-
-if ($changeDir) {
- chdir($oldWorkingDir);
+try {
+ $result = $scss->compileString($data, $inputFile);
+} catch (SassException $e) {
+ fwrite(STDERR, 'Error: '.$e->getMessage()."\n");
+ exit(1);
+}
+
+if ($outputFile) {
+ file_put_contents($outputFile, $result->getCss());
+
+ if ($sourceMapFile !== null && $result->getSourceMap() !== null) {
+ file_put_contents($sourceMapFile, $result->getSourceMap());
+ }
+} else {
+ echo $result->getCss();
}
diff --git a/lib/scssphp/scssphp/composer.json b/lib/scssphp/scssphp/composer.json
index ff0590fbd..3c60ca897 100644
--- a/lib/scssphp/scssphp/composer.json
+++ b/lib/scssphp/scssphp/composer.json
@@ -30,22 +30,82 @@
"ext-json": "*",
"ext-ctype": "*"
},
+ "suggest": {
+ "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv",
+ "ext-iconv": "Can be used as fallback when ext-mbstring is not available"
+ },
"require-dev": {
- "squizlabs/php_codesniffer": "~2.5",
- "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
- "twbs/bootstrap": "~4.3",
+ "bamarni/composer-bin-plugin": "^1.4",
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4",
+ "sass/sass-spec": "*",
+ "squizlabs/php_codesniffer": "~3.5",
+ "symfony/phpunit-bridge": "^5.1",
+ "thoughtbot/bourbon": "^7.0",
+ "twbs/bootstrap": "~5.0",
+ "twbs/bootstrap4": "4.6.1",
"zurb/foundation": "~6.5"
},
- "minimum-stability": "dev",
+ "repositories": [
+ {
+ "type": "package",
+ "package": {
+ "name": "sass/sass-spec",
+ "version": "2022.02.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sass/sass-spec.git",
+ "reference": "f41b9bfb9a3013392f2136c79f7f3356f15fb8ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sass/sass-spec/zipball/f41b9bfb9a3013392f2136c79f7f3356f15fb8ba",
+ "reference": "f41b9bfb9a3013392f2136c79f7f3356f15fb8ba",
+ "shasum": ""
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "thoughtbot/bourbon",
+ "version": "v7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thoughtbot/bourbon.git",
+ "reference": "fbe338ee6807e7f7aa996d82c8a16f248bb149b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thoughtbot/bourbon/zipball/fbe338ee6807e7f7aa996d82c8a16f248bb149b3",
+ "reference": "fbe338ee6807e7f7aa996d82c8a16f248bb149b3",
+ "shasum": ""
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "twbs/bootstrap4",
+ "version": "v4.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twbs/bootstrap.git",
+ "reference": "043a03c95a2ad6738f85b65e53b9dbdfb03b8d10"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twbs/bootstrap/zipball/043a03c95a2ad6738f85b65e53b9dbdfb03b8d10",
+ "reference": "043a03c95a2ad6738f85b65e53b9dbdfb03b8d10",
+ "shasum": ""
+ }
+ }
+ }
+ ],
"bin": ["bin/pscss"],
- "archive": {
- "exclude": [
- "/Makefile",
- "/.gitattributes",
- "/.gitignore",
- "/.travis.yml",
- "/phpunit.xml.dist",
- "/tests"
- ]
+ "config": {
+ "sort-packages": true,
+ "allow-plugins": {
+ "bamarni/composer-bin-plugin": true
+ }
}
}
diff --git a/lib/scssphp/scssphp/phpcs.xml.dist b/lib/scssphp/scssphp/phpcs.xml.dist
new file mode 100644
index 000000000..b162dbd6b
--- /dev/null
+++ b/lib/scssphp/scssphp/phpcs.xml.dist
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/scssphp/scssphp/scss.inc.php b/lib/scssphp/scssphp/scss.inc.php
index e4ec7f181..459837805 100644
--- a/lib/scssphp/scssphp/scss.inc.php
+++ b/lib/scssphp/scssphp/scss.inc.php
@@ -1,34 +1,21 @@
+ *
+ * @internal
*/
class Range
{
+ /**
+ * @var float|int
+ */
public $first;
+
+ /**
+ * @var float|int
+ */
public $last;
/**
* Initialize range
*
- * @param integer|float $first
- * @param integer|float $last
+ * @param int|float $first
+ * @param int|float $last
*/
public function __construct($first, $last)
{
@@ -36,9 +46,9 @@ class Range
/**
* Test for inclusion in range
*
- * @param integer|float $value
+ * @param int|float $value
*
- * @return boolean
+ * @return bool
*/
public function includes($value)
{
diff --git a/lib/scssphp/scssphp/src/Block.php b/lib/scssphp/scssphp/src/Block.php
index bb1afdd4b..96668dc66 100644
--- a/lib/scssphp/scssphp/src/Block.php
+++ b/lib/scssphp/scssphp/src/Block.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
class Block
{
/**
- * @var string
+ * @var string|null
*/
public $type;
/**
- * @var \ScssPhp\ScssPhp\Block
+ * @var Block|null
*/
public $parent;
@@ -34,22 +37,22 @@ class Block
public $sourceName;
/**
- * @var integer
+ * @var int
*/
public $sourceIndex;
/**
- * @var integer
+ * @var int
*/
public $sourceLine;
/**
- * @var integer
+ * @var int
*/
public $sourceColumn;
/**
- * @var array
+ * @var array|null
*/
public $selectors;
@@ -64,7 +67,7 @@ class Block
public $children;
/**
- * @var \ScssPhp\ScssPhp\Block
+ * @var Block|null
*/
public $selfParent;
}
diff --git a/lib/scssphp/scssphp/src/Block/AtRootBlock.php b/lib/scssphp/scssphp/src/Block/AtRootBlock.php
new file mode 100644
index 000000000..41842c269
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/AtRootBlock.php
@@ -0,0 +1,37 @@
+type = Type::T_AT_ROOT;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/CallableBlock.php b/lib/scssphp/scssphp/src/Block/CallableBlock.php
new file mode 100644
index 000000000..a18a87c2a
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/CallableBlock.php
@@ -0,0 +1,45 @@
+type = $type;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/ContentBlock.php b/lib/scssphp/scssphp/src/Block/ContentBlock.php
new file mode 100644
index 000000000..870849800
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/ContentBlock.php
@@ -0,0 +1,38 @@
+type = Type::T_INCLUDE;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/DirectiveBlock.php b/lib/scssphp/scssphp/src/Block/DirectiveBlock.php
new file mode 100644
index 000000000..b1d3d1a81
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/DirectiveBlock.php
@@ -0,0 +1,37 @@
+type = Type::T_DIRECTIVE;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/EachBlock.php b/lib/scssphp/scssphp/src/Block/EachBlock.php
new file mode 100644
index 000000000..b3289579d
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/EachBlock.php
@@ -0,0 +1,37 @@
+type = Type::T_EACH;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/ElseBlock.php b/lib/scssphp/scssphp/src/Block/ElseBlock.php
new file mode 100644
index 000000000..6abb4d775
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/ElseBlock.php
@@ -0,0 +1,27 @@
+type = Type::T_ELSE;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/ElseifBlock.php b/lib/scssphp/scssphp/src/Block/ElseifBlock.php
new file mode 100644
index 000000000..4622bca79
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/ElseifBlock.php
@@ -0,0 +1,32 @@
+type = Type::T_ELSEIF;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/ForBlock.php b/lib/scssphp/scssphp/src/Block/ForBlock.php
new file mode 100644
index 000000000..a9cf6733b
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/ForBlock.php
@@ -0,0 +1,47 @@
+type = Type::T_FOR;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/IfBlock.php b/lib/scssphp/scssphp/src/Block/IfBlock.php
new file mode 100644
index 000000000..9f21bf88a
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/IfBlock.php
@@ -0,0 +1,37 @@
+
+ */
+ public $cases = [];
+
+ public function __construct()
+ {
+ $this->type = Type::T_IF;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/MediaBlock.php b/lib/scssphp/scssphp/src/Block/MediaBlock.php
new file mode 100644
index 000000000..c49ee1b2b
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/MediaBlock.php
@@ -0,0 +1,37 @@
+type = Type::T_MEDIA;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/NestedPropertyBlock.php b/lib/scssphp/scssphp/src/Block/NestedPropertyBlock.php
new file mode 100644
index 000000000..1ea4a6c8a
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/NestedPropertyBlock.php
@@ -0,0 +1,37 @@
+type = Type::T_NESTED_PROPERTY;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Block/WhileBlock.php b/lib/scssphp/scssphp/src/Block/WhileBlock.php
new file mode 100644
index 000000000..ac18d4e02
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Block/WhileBlock.php
@@ -0,0 +1,32 @@
+type = Type::T_WHILE;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Cache.php b/lib/scssphp/scssphp/src/Cache.php
index 422497f49..9731c60a7 100644
--- a/lib/scssphp/scssphp/src/Cache.php
+++ b/lib/scssphp/scssphp/src/Cache.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
class Cache
{
const CACHE_VERSION = 1;
- // directory used for storing data
+ /**
+ * directory used for storing data
+ *
+ * @var string|false
+ */
public static $cacheDir = false;
- // prefix for the storing data
+ /**
+ * prefix for the storing data
+ *
+ * @var string
+ */
public static $prefix = 'scssphp_';
- // force a refresh : 'once' for refreshing the first hit on a cache only, true to never use the cache in this hit
+ /**
+ * force a refresh : 'once' for refreshing the first hit on a cache only, true to never use the cache in this hit
+ *
+ * @var bool|string
+ */
public static $forceRefresh = false;
- // specifies the number of seconds after which data cached will be seen as 'garbage' and potentially cleaned up
+ /**
+ * specifies the number of seconds after which data cached will be seen as 'garbage' and potentially cleaned up
+ *
+ * @var int
+ */
public static $gcLifetime = 604800;
- // array of already refreshed cache if $forceRefresh==='once'
+ /**
+ * array of already refreshed cache if $forceRefresh==='once'
+ *
+ * @var array
+ */
protected static $refreshed = [];
/**
* Constructor
*
* @param array $options
+ *
+ * @phpstan-param array{cacheDir?: string, prefix?: string, forceRefresh?: string} $options
*/
public function __construct($options)
{
@@ -84,10 +109,10 @@ class Cache
* Get the cached result of $operation on $what,
* which is known as dependant from the content of $options
*
- * @param string $operation parse, compile...
- * @param mixed $what content key (e.g., filename to be treated)
- * @param array $options any option that affect the operation result on the content
- * @param integer $lastModified last modified timestamp
+ * @param string $operation parse, compile...
+ * @param mixed $what content key (e.g., filename to be treated)
+ * @param array $options any option that affect the operation result on the content
+ * @param int|null $lastModified last modified timestamp
*
* @return mixed
*
@@ -97,18 +122,20 @@ class Cache
{
$fileCache = self::$cacheDir . self::cacheName($operation, $what, $options);
- if (((self::$forceRefresh === false) || (self::$forceRefresh === 'once' &&
+ if (
+ ((self::$forceRefresh === false) || (self::$forceRefresh === 'once' &&
isset(self::$refreshed[$fileCache]))) && file_exists($fileCache)
) {
$cacheTime = filemtime($fileCache);
- if ((is_null($lastModified) || $cacheTime > $lastModified) &&
+ if (
+ (\is_null($lastModified) || $cacheTime > $lastModified) &&
$cacheTime + self::$gcLifetime > time()
) {
$c = file_get_contents($fileCache);
$c = unserialize($c);
- if (is_array($c) && isset($c['value'])) {
+ if (\is_array($c) && isset($c['value'])) {
return $c['value'];
}
}
@@ -125,6 +152,8 @@ class Cache
* @param mixed $what
* @param mixed $value
* @param array $options
+ *
+ * @return void
*/
public function setCache($operation, $what, $value, $options = [])
{
@@ -132,6 +161,7 @@ class Cache
$c = ['value' => $value];
$c = serialize($c);
+
file_put_contents($fileCache, $c);
if (self::$forceRefresh === 'once') {
@@ -153,6 +183,7 @@ class Cache
{
$t = [
'version' => self::CACHE_VERSION,
+ 'scssphpVersion' => Version::VERSION,
'operation' => $operation,
'what' => $what,
'options' => $options
@@ -169,6 +200,8 @@ class Cache
/**
* Check that the cache dir exists and is writeable
*
+ * @return void
+ *
* @throws \Exception
*/
public static function checkCacheDir()
@@ -177,9 +210,7 @@ class Cache
self::$cacheDir = rtrim(self::$cacheDir, '/') . '/';
if (! is_dir(self::$cacheDir)) {
- if (! mkdir(self::$cacheDir)) {
- throw new Exception('Cache directory couldn\'t be created: ' . self::$cacheDir);
- }
+ throw new Exception('Cache directory doesn\'t exist: ' . self::$cacheDir);
}
if (! is_writable(self::$cacheDir)) {
@@ -189,6 +220,8 @@ class Cache
/**
* Delete unused cached files
+ *
+ * @return void
*/
public static function cleanCache()
{
diff --git a/lib/scssphp/scssphp/src/Colors.php b/lib/scssphp/scssphp/src/Colors.php
index ef6409aca..2df39992b 100644
--- a/lib/scssphp/scssphp/src/Colors.php
+++ b/lib/scssphp/scssphp/src/Colors.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
class Colors
{
@@ -23,12 +26,13 @@ class Colors
*
* @see http://www.w3.org/TR/css3-color
*
- * @var array
+ * @var array
*/
protected static $cssColors = [
'aliceblue' => '240,248,255',
'antiquewhite' => '250,235,215',
'aqua' => '0,255,255',
+ 'cyan' => '0,255,255',
'aquamarine' => '127,255,212',
'azure' => '240,255,255',
'beige' => '245,245,220',
@@ -46,13 +50,12 @@ class Colors
'cornflowerblue' => '100,149,237',
'cornsilk' => '255,248,220',
'crimson' => '220,20,60',
- 'cyan' => '0,255,255',
'darkblue' => '0,0,139',
'darkcyan' => '0,139,139',
'darkgoldenrod' => '184,134,11',
'darkgray' => '169,169,169',
- 'darkgreen' => '0,100,0',
'darkgrey' => '169,169,169',
+ 'darkgreen' => '0,100,0',
'darkkhaki' => '189,183,107',
'darkmagenta' => '139,0,139',
'darkolivegreen' => '85,107,47',
@@ -75,14 +78,15 @@ class Colors
'floralwhite' => '255,250,240',
'forestgreen' => '34,139,34',
'fuchsia' => '255,0,255',
+ 'magenta' => '255,0,255',
'gainsboro' => '220,220,220',
'ghostwhite' => '248,248,255',
'gold' => '255,215,0',
'goldenrod' => '218,165,32',
'gray' => '128,128,128',
+ 'grey' => '128,128,128',
'green' => '0,128,0',
'greenyellow' => '173,255,47',
- 'grey' => '128,128,128',
'honeydew' => '240,255,240',
'hotpink' => '255,105,180',
'indianred' => '205,92,92',
@@ -98,8 +102,8 @@ class Colors
'lightcyan' => '224,255,255',
'lightgoldenrodyellow' => '250,250,210',
'lightgray' => '211,211,211',
- 'lightgreen' => '144,238,144',
'lightgrey' => '211,211,211',
+ 'lightgreen' => '144,238,144',
'lightpink' => '255,182,193',
'lightsalmon' => '255,160,122',
'lightseagreen' => '32,178,170',
@@ -111,7 +115,6 @@ class Colors
'lime' => '0,255,0',
'limegreen' => '50,205,50',
'linen' => '250,240,230',
- 'magenta' => '255,0,255',
'maroon' => '128,0,0',
'mediumaquamarine' => '102,205,170',
'mediumblue' => '0,0,205',
@@ -145,7 +148,6 @@ class Colors
'plum' => '221,160,221',
'powderblue' => '176,224,230',
'purple' => '128,0,128',
- 'rebeccapurple' => '102,51,153',
'red' => '255,0,0',
'rosybrown' => '188,143,143',
'royalblue' => '65,105,225',
@@ -167,7 +169,6 @@ class Colors
'teal' => '0,128,128',
'thistle' => '216,191,216',
'tomato' => '255,99,71',
- 'transparent' => '0,0,0,0',
'turquoise' => '64,224,208',
'violet' => '238,130,238',
'wheat' => '245,222,179',
@@ -175,6 +176,8 @@ class Colors
'whitesmoke' => '245,245,245',
'yellow' => '255,255,0',
'yellowgreen' => '154,205,50',
+ 'rebeccapurple' => '102,51,153',
+ 'transparent' => '0,0,0,0',
];
/**
@@ -182,11 +185,11 @@ class Colors
*
* @param string $colorName
*
- * @return array|null
+ * @return int[]|null
*/
public static function colorNameToRGBa($colorName)
{
- if (is_string($colorName) && isset(static::$cssColors[$colorName])) {
+ if (\is_string($colorName) && isset(static::$cssColors[$colorName])) {
$rgba = explode(',', static::$cssColors[$colorName]);
// only case with opacity is transparent, with opacity=0, so we can intval on opacity also
@@ -201,10 +204,10 @@ class Colors
/**
* Reverse conversion : from RGBA to a color name if possible
*
- * @param integer $r
- * @param integer $g
- * @param integer $b
- * @param integer $a
+ * @param int $r
+ * @param int $g
+ * @param int $b
+ * @param int|float $a
*
* @return string|null
*/
@@ -217,28 +220,26 @@ class Colors
}
if ($a < 1) {
- # specific case we dont' revert according to spec
- #if (! $a && ! $r && ! $g && ! $b) {
- # return 'transparent';
- #}
-
return null;
}
- if (is_null($reverseColorTable)) {
+ if (\is_null($reverseColorTable)) {
$reverseColorTable = [];
foreach (static::$cssColors as $name => $rgb_str) {
$rgb_str = explode(',', $rgb_str);
- if (count($rgb_str) == 3) {
- $reverseColorTable[intval($rgb_str[0])][intval($rgb_str[1])][intval($rgb_str[2])] = $name;
+ if (
+ \count($rgb_str) == 3 &&
+ ! isset($reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])])
+ ) {
+ $reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])] = $name;
}
}
}
- if (isset($reverseColorTable[intval($r)][intval($g)][intval($b)])) {
- return $reverseColorTable[intval($r)][intval($g)][intval($b)];
+ if (isset($reverseColorTable[\intval($r)][\intval($g)][\intval($b)])) {
+ return $reverseColorTable[\intval($r)][\intval($g)][\intval($b)];
}
return null;
diff --git a/lib/scssphp/scssphp/src/CompilationResult.php b/lib/scssphp/scssphp/src/CompilationResult.php
new file mode 100644
index 000000000..36adb0da4
--- /dev/null
+++ b/lib/scssphp/scssphp/src/CompilationResult.php
@@ -0,0 +1,69 @@
+css = $css;
+ $this->sourceMap = $sourceMap;
+ $this->includedFiles = $includedFiles;
+ }
+
+ /**
+ * @return string
+ */
+ public function getCss()
+ {
+ return $this->css;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getIncludedFiles()
+ {
+ return $this->includedFiles;
+ }
+
+ /**
+ * The sourceMap content, if it was generated
+ *
+ * @return null|string
+ */
+ public function getSourceMap()
+ {
+ return $this->sourceMap;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Compiler.php b/lib/scssphp/scssphp/src/Compiler.php
index 711d3382f..eecfa481a 100644
--- a/lib/scssphp/scssphp/src/Compiler.php
+++ b/lib/scssphp/scssphp/src/Compiler.php
@@ -1,8 +1,9 @@
+ *
+ * @final Extending the Compiler is deprecated
*/
class Compiler
{
+ /**
+ * @deprecated
+ */
const LINE_COMMENTS = 1;
+ /**
+ * @deprecated
+ */
const DEBUG_INFO = 2;
+ /**
+ * @deprecated
+ */
const WITH_RULE = 1;
+ /**
+ * @deprecated
+ */
const WITH_MEDIA = 2;
+ /**
+ * @deprecated
+ */
const WITH_SUPPORTS = 4;
+ /**
+ * @deprecated
+ */
const WITH_ALL = 7;
const SOURCE_MAP_NONE = 0;
@@ -71,9 +106,9 @@ class Compiler
const SOURCE_MAP_FILE = 2;
/**
- * @var array
+ * @var array
*/
- static protected $operatorNames = [
+ protected static $operatorNames = [
'+' => 'add',
'-' => 'sub',
'*' => 'mul',
@@ -87,102 +122,261 @@ class Compiler
'<=' => 'lte',
'>=' => 'gte',
- '<=>' => 'cmp',
];
/**
- * @var array
+ * @var array
*/
- static protected $namespaces = [
+ protected static $namespaces = [
'special' => '%',
'mixin' => '@',
'function' => '^',
];
- static public $true = [Type::T_KEYWORD, 'true'];
- static public $false = [Type::T_KEYWORD, 'false'];
- static public $null = [Type::T_NULL];
- static public $nullString = [Type::T_STRING, '', []];
- static public $defaultValue = [Type::T_KEYWORD, ''];
- static public $selfSelector = [Type::T_SELF];
- static public $emptyList = [Type::T_LIST, '', []];
- static public $emptyMap = [Type::T_MAP, [], []];
- static public $emptyString = [Type::T_STRING, '"', []];
- static public $with = [Type::T_KEYWORD, 'with'];
- static public $without = [Type::T_KEYWORD, 'without'];
+ public static $true = [Type::T_KEYWORD, 'true'];
+ public static $false = [Type::T_KEYWORD, 'false'];
+ /** @deprecated */
+ public static $NaN = [Type::T_KEYWORD, 'NaN'];
+ /** @deprecated */
+ public static $Infinity = [Type::T_KEYWORD, 'Infinity'];
+ public static $null = [Type::T_NULL];
+ public static $nullString = [Type::T_STRING, '', []];
+ public static $defaultValue = [Type::T_KEYWORD, ''];
+ public static $selfSelector = [Type::T_SELF];
+ public static $emptyList = [Type::T_LIST, '', []];
+ public static $emptyMap = [Type::T_MAP, [], []];
+ public static $emptyString = [Type::T_STRING, '"', []];
+ public static $with = [Type::T_KEYWORD, 'with'];
+ public static $without = [Type::T_KEYWORD, 'without'];
+ private static $emptyArgumentList = [Type::T_LIST, '', [], []];
- protected $importPaths = [''];
+ /**
+ * @var array
+ */
+ protected $importPaths = [];
+ /**
+ * @var array
+ */
protected $importCache = [];
+
+ /**
+ * @var string[]
+ */
protected $importedFiles = [];
+
+ /**
+ * @var array
+ * @phpstan-var array
+ */
protected $userFunctions = [];
+ /**
+ * @var array
+ */
protected $registeredVars = [];
+ /**
+ * @var array
+ */
protected $registeredFeatures = [
'extend-selector-pseudoclass' => false,
'at-error' => true,
- 'units-level-3' => false,
+ 'units-level-3' => true,
'global-variable-shadowing' => false,
];
+ /**
+ * @var string|null
+ */
protected $encoding = null;
+ /**
+ * @var null
+ * @deprecated
+ */
protected $lineNumberStyle = null;
+ /**
+ * @var int|SourceMapGenerator
+ * @phpstan-var self::SOURCE_MAP_*|SourceMapGenerator
+ */
protected $sourceMap = self::SOURCE_MAP_NONE;
+
+ /**
+ * @var array
+ * @phpstan-var array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string}
+ */
protected $sourceMapOptions = [];
/**
- * @var string|\ScssPhp\ScssPhp\Formatter
+ * @var bool
*/
- protected $formatter = 'ScssPhp\ScssPhp\Formatter\Nested';
+ private $charset = true;
+ /**
+ * @var Formatter
+ */
+ protected $formatter;
+
+ /**
+ * @var string
+ * @phpstan-var class-string
+ */
+ private $configuredFormatter = Expanded::class;
+
+ /**
+ * @var Environment
+ */
protected $rootEnv;
+ /**
+ * @var OutputBlock|null
+ */
protected $rootBlock;
/**
* @var \ScssPhp\ScssPhp\Compiler\Environment
*/
protected $env;
+ /**
+ * @var OutputBlock|null
+ */
protected $scope;
+ /**
+ * @var Environment|null
+ */
protected $storeEnv;
+ /**
+ * @var bool|null
+ *
+ * @deprecated
+ */
protected $charsetSeen;
+ /**
+ * @var array
+ */
protected $sourceNames;
+ /**
+ * @var Cache|null
+ */
protected $cache;
- protected $indentLevel;
- protected $extends;
- protected $extendsMap;
- protected $parsedFiles;
- protected $parser;
- protected $sourceIndex;
- protected $sourceLine;
- protected $sourceColumn;
- protected $stderr;
- protected $shouldEvaluate;
- protected $ignoreErrors;
+ /**
+ * @var bool
+ */
+ protected $cacheCheckImportResolutions = false;
+ /**
+ * @var int
+ */
+ protected $indentLevel;
+ /**
+ * @var array[]
+ */
+ protected $extends;
+ /**
+ * @var array
+ */
+ protected $extendsMap;
+
+ /**
+ * @var array
+ */
+ protected $parsedFiles = [];
+
+ /**
+ * @var Parser|null
+ */
+ protected $parser;
+ /**
+ * @var int|null
+ */
+ protected $sourceIndex;
+ /**
+ * @var int|null
+ */
+ protected $sourceLine;
+ /**
+ * @var int|null
+ */
+ protected $sourceColumn;
+ /**
+ * @var bool|null
+ */
+ protected $shouldEvaluate;
+ /**
+ * @var null
+ * @deprecated
+ */
+ protected $ignoreErrors;
+ /**
+ * @var bool
+ */
+ protected $ignoreCallStackMessage = false;
+
+ /**
+ * @var array[]
+ */
protected $callStack = [];
+ /**
+ * @var array
+ * @phpstan-var list
+ */
+ private $resolvedImports = [];
+
+ /**
+ * The directory of the currently processed file
+ *
+ * @var string|null
+ */
+ private $currentDirectory;
+
+ /**
+ * The directory of the input file
+ *
+ * @var string
+ */
+ private $rootDirectory;
+
+ /**
+ * @var bool
+ */
+ private $legacyCwdImportPath = true;
+
+ /**
+ * @var LoggerInterface
+ */
+ private $logger;
+
+ /**
+ * @var array
+ */
+ private $warnedChildFunctions = [];
+
/**
* Constructor
*
* @param array|null $cacheOptions
+ * @phpstan-param array{cacheDir?: string, prefix?: string, forceRefresh?: string, checkImportResolutions?: bool}|null $cacheOptions
*/
public function __construct($cacheOptions = null)
{
- $this->parsedFiles = [];
$this->sourceNames = [];
if ($cacheOptions) {
$this->cache = new Cache($cacheOptions);
+ if (!empty($cacheOptions['checkImportResolutions'])) {
+ $this->cacheCheckImportResolutions = true;
+ }
}
- $this->stderr = fopen('php://stderr', 'w');
+ $this->logger = new StreamLogger(fopen('php://stderr', 'w'), true);
}
/**
* Get compiler options
*
- * @return array
+ * @return array
+ *
+ * @internal
*/
public function getCompileOptions()
{
@@ -193,54 +387,97 @@ class Compiler
'encoding' => $this->encoding,
'sourceMap' => serialize($this->sourceMap),
'sourceMapOptions' => $this->sourceMapOptions,
- 'formatter' => $this->formatter,
+ 'formatter' => $this->configuredFormatter,
+ 'legacyImportPath' => $this->legacyCwdImportPath,
];
return $options;
}
+ /**
+ * Sets an alternative logger.
+ *
+ * Changing the logger in the middle of the compilation is not
+ * supported and will result in an undefined behavior.
+ *
+ * @param LoggerInterface $logger
+ *
+ * @return void
+ */
+ public function setLogger(LoggerInterface $logger)
+ {
+ $this->logger = $logger;
+ }
+
/**
* Set an alternative error output stream, for testing purpose only
*
* @param resource $handle
+ *
+ * @return void
+ *
+ * @deprecated Use {@see setLogger} instead
*/
public function setErrorOuput($handle)
{
- $this->stderr = $handle;
+ @trigger_error('The method "setErrorOuput" is deprecated. Use "setLogger" instead.', E_USER_DEPRECATED);
+
+ $this->logger = new StreamLogger($handle);
}
/**
* Compile scss
*
- * @api
- *
- * @param string $code
- * @param string $path
+ * @param string $code
+ * @param string|null $path
*
* @return string
+ *
+ * @throws SassException when the source fails to compile
+ *
+ * @deprecated Use {@see compileString} instead.
*/
public function compile($code, $path = null)
{
- if ($this->cache) {
- $cacheKey = ($path ? $path : "(stdin)") . ":" . md5($code);
- $compileOptions = $this->getCompileOptions();
- $cache = $this->cache->getCache("compile", $cacheKey, $compileOptions);
+ @trigger_error(sprintf('The "%s" method is deprecated. Use "compileString" instead.', __METHOD__), E_USER_DEPRECATED);
- if (is_array($cache) && isset($cache['dependencies']) && isset($cache['out'])) {
- // check if any dependency file changed before accepting the cache
- foreach ($cache['dependencies'] as $file => $mtime) {
- if (! is_file($file) || filemtime($file) !== $mtime) {
- unset($cache);
- break;
- }
- }
+ $result = $this->compileString($code, $path);
- if (isset($cache)) {
- return $cache['out'];
- }
+ $sourceMap = $result->getSourceMap();
+
+ if ($sourceMap !== null) {
+ if ($this->sourceMap instanceof SourceMapGenerator) {
+ $this->sourceMap->saveMap($sourceMap);
+ } elseif ($this->sourceMap === self::SOURCE_MAP_FILE) {
+ $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions);
+ $sourceMapGenerator->saveMap($sourceMap);
}
}
+ return $result->getCss();
+ }
+
+ /**
+ * Compile scss
+ *
+ * @param string $source
+ * @param string|null $path
+ *
+ * @return CompilationResult
+ *
+ * @throws SassException when the source fails to compile
+ */
+ public function compileString($source, $path = null)
+ {
+ if ($this->cache) {
+ $cacheKey = ($path ? $path : '(stdin)') . ':' . md5($source);
+ $compileOptions = $this->getCompileOptions();
+ $cachedResult = $this->cache->getCache('compile', $cacheKey, $compileOptions);
+
+ if ($cachedResult instanceof CachedResult && $this->isFreshCachedResult($cachedResult)) {
+ return $cachedResult->getResult();
+ }
+ }
$this->indentLevel = -1;
$this->extends = [];
@@ -251,73 +488,168 @@ class Compiler
$this->env = null;
$this->scope = null;
$this->storeEnv = null;
- $this->charsetSeen = null;
$this->shouldEvaluate = null;
+ $this->ignoreCallStackMessage = false;
+ $this->parsedFiles = [];
+ $this->importedFiles = [];
+ $this->resolvedImports = [];
- $this->parser = $this->parserFactory($path);
- $tree = $this->parser->parse($code);
- $this->parser = null;
-
- $this->formatter = new $this->formatter();
- $this->rootBlock = null;
- $this->rootEnv = $this->pushEnv($tree);
-
- $this->injectVariables($this->registeredVars);
- $this->compileRoot($tree);
- $this->popEnv();
-
- $sourceMapGenerator = null;
-
- if ($this->sourceMap) {
- if (is_object($this->sourceMap) && $this->sourceMap instanceof SourceMapGenerator) {
- $sourceMapGenerator = $this->sourceMap;
- $this->sourceMap = self::SOURCE_MAP_FILE;
- } elseif ($this->sourceMap !== self::SOURCE_MAP_NONE) {
- $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions);
- }
+ if (!\is_null($path) && is_file($path)) {
+ $path = realpath($path) ?: $path;
+ $this->currentDirectory = dirname($path);
+ $this->rootDirectory = $this->currentDirectory;
+ } else {
+ $this->currentDirectory = null;
+ $this->rootDirectory = getcwd();
}
- $out = $this->formatter->format($this->scope, $sourceMapGenerator);
+ try {
+ $this->parser = $this->parserFactory($path);
+ $tree = $this->parser->parse($source);
+ $this->parser = null;
- if (! empty($out) && $this->sourceMap && $this->sourceMap !== self::SOURCE_MAP_NONE) {
- $sourceMap = $sourceMapGenerator->generateJson();
- $sourceMapUrl = null;
+ $this->formatter = new $this->configuredFormatter();
+ $this->rootBlock = null;
+ $this->rootEnv = $this->pushEnv($tree);
- switch ($this->sourceMap) {
- case self::SOURCE_MAP_INLINE:
- $sourceMapUrl = sprintf('data:application/json,%s', Util::encodeURIComponent($sourceMap));
- break;
+ $warnCallback = function ($message, $deprecation) {
+ $this->logger->warn($message, $deprecation);
+ };
+ $previousWarnCallback = Warn::setCallback($warnCallback);
- case self::SOURCE_MAP_FILE:
- $sourceMapUrl = $sourceMapGenerator->saveMap($sourceMap);
- break;
+ try {
+ $this->injectVariables($this->registeredVars);
+ $this->compileRoot($tree);
+ $this->popEnv();
+ } finally {
+ Warn::setCallback($previousWarnCallback);
}
- $out .= sprintf('/*# sourceMappingURL=%s */', $sourceMapUrl);
+ $sourceMapGenerator = null;
+
+ if ($this->sourceMap) {
+ if (\is_object($this->sourceMap) && $this->sourceMap instanceof SourceMapGenerator) {
+ $sourceMapGenerator = $this->sourceMap;
+ $this->sourceMap = self::SOURCE_MAP_FILE;
+ } elseif ($this->sourceMap !== self::SOURCE_MAP_NONE) {
+ $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions);
+ }
+ }
+ assert($this->scope !== null);
+
+ $out = $this->formatter->format($this->scope, $sourceMapGenerator);
+
+ $prefix = '';
+
+ if ($this->charset && strlen($out) !== Util::mbStrlen($out)) {
+ $prefix = '@charset "UTF-8";' . "\n";
+ $out = $prefix . $out;
+ }
+
+ $sourceMap = null;
+
+ if (! empty($out) && $this->sourceMap && $this->sourceMap !== self::SOURCE_MAP_NONE) {
+ assert($sourceMapGenerator !== null);
+ $sourceMap = $sourceMapGenerator->generateJson($prefix);
+ $sourceMapUrl = null;
+
+ switch ($this->sourceMap) {
+ case self::SOURCE_MAP_INLINE:
+ $sourceMapUrl = sprintf('data:application/json,%s', Util::encodeURIComponent($sourceMap));
+ break;
+
+ case self::SOURCE_MAP_FILE:
+ if (isset($this->sourceMapOptions['sourceMapURL'])) {
+ $sourceMapUrl = $this->sourceMapOptions['sourceMapURL'];
+ }
+ break;
+ }
+
+ if ($sourceMapUrl !== null) {
+ $out .= sprintf('/*# sourceMappingURL=%s */', $sourceMapUrl);
+ }
+ }
+ } catch (SassScriptException $e) {
+ throw new CompilerException($this->addLocationToMessage($e->getMessage()), 0, $e);
}
+ $includedFiles = [];
+
+ foreach ($this->resolvedImports as $resolvedImport) {
+ $includedFiles[$resolvedImport['filePath']] = $resolvedImport['filePath'];
+ }
+
+ $result = new CompilationResult($out, $sourceMap, array_values($includedFiles));
+
if ($this->cache && isset($cacheKey) && isset($compileOptions)) {
- $v = [
- 'dependencies' => $this->getParsedFiles(),
- 'out' => &$out,
- ];
-
- $this->cache->setCache("compile", $cacheKey, $v, $compileOptions);
+ $this->cache->setCache('compile', $cacheKey, new CachedResult($result, $this->parsedFiles, $this->resolvedImports), $compileOptions);
}
- return $out;
+ // Reset state to free memory
+ // TODO in 2.0, reset parsedFiles as well when the getter is removed.
+ $this->resolvedImports = [];
+ $this->importedFiles = [];
+
+ return $result;
+ }
+
+ /**
+ * @param CachedResult $result
+ *
+ * @return bool
+ */
+ private function isFreshCachedResult(CachedResult $result)
+ {
+ // check if any dependency file changed since the result was compiled
+ foreach ($result->getParsedFiles() as $file => $mtime) {
+ if (! is_file($file) || filemtime($file) !== $mtime) {
+ return false;
+ }
+ }
+
+ if ($this->cacheCheckImportResolutions) {
+ $resolvedImports = [];
+
+ foreach ($result->getResolvedImports() as $import) {
+ $currentDir = $import['currentDir'];
+ $path = $import['path'];
+ // store the check across all the results in memory to avoid multiple findImport() on the same path
+ // with same context.
+ // this is happening in a same hit with multiple compilations (especially with big frameworks)
+ if (empty($resolvedImports[$currentDir][$path])) {
+ $resolvedImports[$currentDir][$path] = $this->findImport($path, $currentDir);
+ }
+
+ if ($resolvedImports[$currentDir][$path] !== $import['filePath']) {
+ return false;
+ }
+ }
+ }
+
+ return true;
}
/**
* Instantiate parser
*
- * @param string $path
+ * @param string|null $path
*
* @return \ScssPhp\ScssPhp\Parser
*/
protected function parserFactory($path)
{
- $parser = new Parser($path, count($this->sourceNames), $this->encoding, $this->cache);
+ // https://sass-lang.com/documentation/at-rules/import
+ // CSS files imported by Sass donāt allow any special Sass features.
+ // In order to make sure authors donāt accidentally write Sass in their CSS,
+ // all Sass features that arenāt also valid CSS will produce errors.
+ // Otherwise, the CSS will be rendered as-is. It can even be extended!
+ $cssOnly = false;
+
+ if ($path !== null && substr($path, -4) === '.css') {
+ $cssOnly = true;
+ }
+
+ $parser = new Parser($path, \count($this->sourceNames), $this->encoding, $this->cache, $cssOnly, $this->logger);
$this->sourceNames[] = $path;
$this->addParsedFile($path);
@@ -331,12 +663,12 @@ class Compiler
* @param array $target
* @param array $origin
*
- * @return boolean
+ * @return bool
*/
protected function isSelfExtend($target, $origin)
{
foreach ($origin as $sel) {
- if (in_array($target, $sel)) {
+ if (\in_array($target, $sel)) {
return true;
}
}
@@ -347,17 +679,15 @@ class Compiler
/**
* Push extends
*
- * @param array $target
+ * @param string[] $target
* @param array $origin
* @param array|null $block
+ *
+ * @return void
*/
protected function pushExtends($target, $origin, $block)
{
- if ($this->isSelfExtend($target, $origin)) {
- return;
- }
-
- $i = count($this->extends);
+ $i = \count($this->extends);
$this->extends[] = [$target, $origin, $block];
foreach ($target as $part) {
@@ -372,14 +702,14 @@ class Compiler
/**
* Make output block
*
- * @param string $type
- * @param array $selectors
+ * @param string|null $type
+ * @param string[]|null $selectors
*
* @return \ScssPhp\ScssPhp\Formatter\OutputBlock
*/
protected function makeOutputBlock($type, $selectors = null)
{
- $out = new OutputBlock;
+ $out = new OutputBlock();
$out->type = $type;
$out->lines = [];
$out->children = [];
@@ -392,9 +722,9 @@ class Compiler
$out->sourceLine = $this->env->block->sourceLine;
$out->sourceColumn = $this->env->block->sourceColumn;
} else {
- $out->sourceName = null;
- $out->sourceLine = null;
- $out->sourceColumn = null;
+ $out->sourceName = isset($this->sourceNames[$this->sourceIndex]) ? $this->sourceNames[$this->sourceIndex] : '(stdin)';
+ $out->sourceLine = $this->sourceLine;
+ $out->sourceColumn = $this->sourceColumn;
}
return $out;
@@ -404,18 +734,23 @@ class Compiler
* Compile root
*
* @param \ScssPhp\ScssPhp\Block $rootBlock
+ *
+ * @return void
*/
protected function compileRoot(Block $rootBlock)
{
$this->rootBlock = $this->scope = $this->makeOutputBlock(Type::T_ROOT);
$this->compileChildrenNoReturn($rootBlock->children, $this->scope);
+ assert($this->scope !== null);
$this->flattenSelectors($this->scope);
$this->missingSelectors();
}
/**
* Report missing selectors
+ *
+ * @return void
*/
protected function missingSelectors()
{
@@ -435,7 +770,7 @@ class Compiler
$origin = $this->collapseSelectors($origin);
$this->sourceLine = $block[Parser::SOURCE_LINE];
- $this->throwError("\"$origin\" failed to @extend \"$target\". The selector \"$target\" was not found.");
+ throw $this->error("\"$origin\" failed to @extend \"$target\". The selector \"$target\" was not found.");
}
}
@@ -444,6 +779,8 @@ class Compiler
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
* @param string $parentKey
+ *
+ * @return void
*/
protected function flattenSelectors(OutputBlock $block, $parentKey = null)
{
@@ -453,7 +790,7 @@ class Compiler
foreach ($block->selectors as $s) {
$selectors[] = $s;
- if (! is_array($s)) {
+ if (! \is_array($s)) {
continue;
}
@@ -486,7 +823,8 @@ class Compiler
$block->selectors[] = $this->compileSelector($selector);
}
- if ($placeholderSelector && 0 === count($block->selectors) && null !== $parentKey) {
+ if ($placeholderSelector && 0 === \count($block->selectors) && null !== $parentKey) {
+ assert($block->parent !== null);
unset($block->parent->children[$parentKey]);
return;
@@ -499,7 +837,7 @@ class Compiler
}
/**
- * Glue parts of :not( or :nth-child( ... that are in general splitted in selectors parts
+ * Glue parts of :not( or :nth-child( ... that are in general split in selectors parts
*
* @param array $parts
*
@@ -510,19 +848,20 @@ class Compiler
$new = [];
foreach ($parts as $part) {
- if (is_array($part)) {
+ if (\is_array($part)) {
$part = $this->glueFunctionSelectors($part);
$new[] = $part;
} else {
// a selector part finishing with a ) is the last part of a :not( or :nth-child(
// and need to be joined to this
- if (count($new) && is_string($new[count($new) - 1]) &&
- strlen($part) && substr($part, -1) === ')' && strpos($part, '(') === false
+ if (
+ \count($new) && \is_string($new[\count($new) - 1]) &&
+ \strlen($part) && substr($part, -1) === ')' && strpos($part, '(') === false
) {
- while (count($new)>1 && substr($new[count($new) - 1], -1) !== '(') {
+ while (\count($new) > 1 && substr($new[\count($new) - 1], -1) !== '(') {
$part = array_pop($new) . $part;
}
- $new[count($new) - 1] .= $part;
+ $new[\count($new) - 1] .= $part;
} else {
$new[] = $part;
}
@@ -535,21 +874,24 @@ class Compiler
/**
* Match extends
*
- * @param array $selector
- * @param array $out
- * @param integer $from
- * @param boolean $initial
+ * @param array $selector
+ * @param array $out
+ * @param int $from
+ * @param bool $initial
+ *
+ * @return void
*/
protected function matchExtends($selector, &$out, $from = 0, $initial = true)
{
static $partsPile = [];
$selector = $this->glueFunctionSelectors($selector);
- if (count($selector) == 1 && in_array(reset($selector), $partsPile)) {
+ if (\count($selector) == 1 && \in_array(reset($selector), $partsPile)) {
return;
}
$outRecurs = [];
+
foreach ($selector as $i => $part) {
if ($i < $from) {
continue;
@@ -557,41 +899,43 @@ class Compiler
// check that we are not building an infinite loop of extensions
// if the new part is just including a previous part don't try to extend anymore
- if (count($part) > 1) {
+ if (\count($part) > 1) {
foreach ($partsPile as $previousPart) {
- if (! count(array_diff($previousPart, $part))) {
+ if (! \count(array_diff($previousPart, $part))) {
continue 2;
}
}
}
$partsPile[] = $part;
+
if ($this->matchExtendsSingle($part, $origin, $initial)) {
- $after = array_slice($selector, $i + 1);
- $before = array_slice($selector, 0, $i);
+ $after = \array_slice($selector, $i + 1);
+ $before = \array_slice($selector, 0, $i);
list($before, $nonBreakableBefore) = $this->extractRelationshipFromFragment($before);
foreach ($origin as $new) {
$k = 0;
// remove shared parts
- if (count($new) > 1) {
+ if (\count($new) > 1) {
while ($k < $i && isset($new[$k]) && $selector[$k] === $new[$k]) {
$k++;
}
}
- if (count($nonBreakableBefore) and $k == count($new)) {
+
+ if (\count($nonBreakableBefore) && $k === \count($new)) {
$k--;
}
$replacement = [];
- $tempReplacement = $k > 0 ? array_slice($new, $k) : $new;
+ $tempReplacement = $k > 0 ? \array_slice($new, $k) : $new;
- for ($l = count($tempReplacement) - 1; $l >= 0; $l--) {
+ for ($l = \count($tempReplacement) - 1; $l >= 0; $l--) {
$slice = [];
foreach ($tempReplacement[$l] as $chunk) {
- if (! in_array($chunk, $slice)) {
+ if (! \in_array($chunk, $slice)) {
$slice[] = $chunk;
}
}
@@ -603,7 +947,7 @@ class Compiler
}
}
- $afterBefore = $l != 0 ? array_slice($tempReplacement, 0, $l) : [];
+ $afterBefore = $l != 0 ? \array_slice($tempReplacement, 0, $l) : [];
// Merge shared direct relationships.
$mergedBefore = $this->mergeDirectRelationships($afterBefore, $nonBreakableBefore);
@@ -622,17 +966,18 @@ class Compiler
$this->pushOrMergeExtentedSelector($out, $result);
// recursively check for more matches
- $startRecurseFrom = count($before) + min(count($nonBreakableBefore), count($mergedBefore));
- if (count($origin) > 1) {
+ $startRecurseFrom = \count($before) + min(\count($nonBreakableBefore), \count($mergedBefore));
+
+ if (\count($origin) > 1) {
$this->matchExtends($result, $out, $startRecurseFrom, false);
} else {
$this->matchExtends($result, $outRecurs, $startRecurseFrom, false);
}
// selector sequence merging
- if (! empty($before) && count($new) > 1) {
- $preSharedParts = $k > 0 ? array_slice($before, 0, $k) : [];
- $postSharedParts = $k > 0 ? array_slice($before, $k) : $before;
+ if (! empty($before) && \count($new) > 1) {
+ $preSharedParts = $k > 0 ? \array_slice($before, 0, $k) : [];
+ $postSharedParts = $k > 0 ? \array_slice($before, $k) : $before;
list($betweenSharedParts, $nonBreakabl2) = $this->extractRelationshipFromFragment($afterBefore);
@@ -652,7 +997,8 @@ class Compiler
}
array_pop($partsPile);
}
- while (count($outRecurs)) {
+
+ while (\count($outRecurs)) {
$result = array_shift($outRecurs);
$this->pushOrMergeExtentedSelector($out, $result);
}
@@ -660,16 +1006,21 @@ class Compiler
/**
* Test a part for being a pseudo selector
+ *
* @param string $part
- * @param array $matches
+ * @param array $matches
+ *
* @return bool
*/
protected function isPseudoSelector($part, &$matches)
{
- if (strpos($part, ":") === 0
- && preg_match(",^::?([\w-]+)\((.+)\)$,", $part, $matches)) {
+ if (
+ strpos($part, ':') === 0 &&
+ preg_match(",^::?([\w-]+)\((.+)\)$,", $part, $matches)
+ ) {
return true;
}
+
return false;
}
@@ -679,25 +1030,35 @@ class Compiler
* - same as previous
* - in a white list
* in this case we merge the pseudo selector content
+ *
* @param array $out
* @param array $extended
+ *
+ * @return void
*/
protected function pushOrMergeExtentedSelector(&$out, $extended)
{
- if (count($out) && count($extended) === 1 && count(reset($extended)) === 1) {
+ if (\count($out) && \count($extended) === 1 && \count(reset($extended)) === 1) {
$single = reset($extended);
$part = reset($single);
- if ($this->isPseudoSelector($part, $matchesExtended)
- && in_array($matchesExtended[1], [ 'slotted' ])) {
+
+ if (
+ $this->isPseudoSelector($part, $matchesExtended) &&
+ \in_array($matchesExtended[1], [ 'slotted' ])
+ ) {
$prev = end($out);
$prev = $this->glueFunctionSelectors($prev);
- if (count($prev) === 1 && count(reset($prev)) === 1) {
+
+ if (\count($prev) === 1 && \count(reset($prev)) === 1) {
$single = reset($prev);
$part = reset($single);
- if ($this->isPseudoSelector($part, $matchesPrev)
- && $matchesPrev[1] === $matchesExtended[1]) {
+
+ if (
+ $this->isPseudoSelector($part, $matchesPrev) &&
+ $matchesPrev[1] === $matchesExtended[1]
+ ) {
$extended = explode($matchesExtended[1] . '(', $matchesExtended[0], 2);
- $extended[1] = $matchesPrev[2] . ", " . $extended[1];
+ $extended[1] = $matchesPrev[2] . ', ' . $extended[1];
$extended = implode($matchesExtended[1] . '(', $extended);
$extended = [ [ $extended ]];
array_pop($out);
@@ -713,9 +1074,9 @@ class Compiler
*
* @param array $rawSingle
* @param array $outOrigin
- * @param bool $initial
+ * @param bool $initial
*
- * @return boolean
+ * @return bool
*/
protected function matchExtendsSingle($rawSingle, &$outOrigin, $initial = true)
{
@@ -723,18 +1084,18 @@ class Compiler
$single = [];
// simple usual cases, no need to do the whole trick
- if (in_array($rawSingle, [['>'],['+'],['~']])) {
+ if (\in_array($rawSingle, [['>'],['+'],['~']])) {
return false;
}
foreach ($rawSingle as $part) {
// matches Number
- if (! is_string($part)) {
+ if (! \is_string($part)) {
return false;
}
- if (! preg_match('/^[\[.:#%]/', $part) && count($single)) {
- $single[count($single) - 1] .= $part;
+ if (! preg_match('/^[\[.:#%]/', $part) && \count($single)) {
+ $single[\count($single) - 1] .= $part;
} else {
$single[] = $part;
}
@@ -742,7 +1103,7 @@ class Compiler
$extendingDecoratedTag = false;
- if (count($single) > 1) {
+ if (\count($single) > 1) {
$matches = null;
$extendingDecoratedTag = preg_match('/^[a-z0-9]+$/i', $single[0], $matches) ? $matches[0] : false;
}
@@ -756,24 +1117,31 @@ class Compiler
$counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1;
}
}
- if ($initial
- && $this->isPseudoSelector($part, $matches)
- && ! in_array($matches[1], [ 'not' ])) {
+
+ if (
+ $initial &&
+ $this->isPseudoSelector($part, $matches) &&
+ ! \in_array($matches[1], [ 'not' ])
+ ) {
$buffer = $matches[2];
$parser = $this->parserFactory(__METHOD__);
- if ($parser->parseSelector($buffer, $subSelectors)) {
+
+ if ($parser->parseSelector($buffer, $subSelectors, false)) {
foreach ($subSelectors as $ksub => $subSelector) {
$subExtended = [];
$this->matchExtends($subSelector, $subExtended, 0, false);
+
if ($subExtended) {
$subSelectorsExtended = $subSelectors;
$subSelectorsExtended[$ksub] = $subExtended;
+
foreach ($subSelectorsExtended as $ksse => $sse) {
$subSelectorsExtended[$ksse] = $this->collapseSelectors($sse);
}
+
$subSelectorsExtended = implode(', ', $subSelectorsExtended);
$singleExtended = $single;
- $singleExtended[$k] = str_replace("(".$buffer.")", "($subSelectorsExtended)", $part);
+ $singleExtended[$k] = str_replace('(' . $buffer . ')', "($subSelectorsExtended)", $part);
$outOrigin[] = [ $singleExtended ];
$found = true;
}
@@ -788,7 +1156,7 @@ class Compiler
$origin = $this->glueFunctionSelectors($origin);
// check count
- if ($count !== count($target)) {
+ if ($count !== \count($target)) {
continue;
}
@@ -798,14 +1166,15 @@ class Compiler
foreach ($origin as $j => $new) {
// prevent infinite loop when target extends itself
- if ($this->isSelfExtend($single, $origin)) {
+ if ($this->isSelfExtend($single, $origin) && ! $initial) {
return false;
}
$replacement = end($new);
// Extending a decorated tag with another tag is not possible.
- if ($extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag &&
+ if (
+ $extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag &&
preg_match('/^[a-z0-9]+$/i', $replacement[0])
) {
unset($origin[$j]);
@@ -814,8 +1183,8 @@ class Compiler
$combined = $this->combineSelectorSingle($replacement, $rem);
- if (count(array_diff($combined, $origin[$j][count($origin[$j]) - 1]))) {
- $origin[$j][count($origin[$j]) - 1] = $combined;
+ if (\count(array_diff($combined, $origin[$j][\count($origin[$j]) - 1]))) {
+ $origin[$j][\count($origin[$j]) - 1] = $combined;
}
}
@@ -844,11 +1213,11 @@ class Compiler
$parents = [];
$children = [];
- $j = $i = count($fragment);
+ $j = $i = \count($fragment);
for (;;) {
- $children = $j != $i ? array_slice($fragment, $j, $i - $j) : [];
- $parents = array_slice($fragment, 0, $j);
+ $children = $j != $i ? \array_slice($fragment, $j, $i - $j) : [];
+ $parents = \array_slice($fragment, 0, $j);
$slice = end($parents);
if (empty($slice) || ! $this->isImmediateRelationshipCombinator($slice[0])) {
@@ -874,8 +1243,15 @@ class Compiler
$tag = [];
$out = [];
$wasTag = false;
+ $pseudo = [];
+
+ while (\count($other) && strpos(end($other), ':') === 0) {
+ array_unshift($pseudo, array_pop($other));
+ }
foreach ([array_reverse($base), array_reverse($other)] as $single) {
+ $rang = count($single);
+
foreach ($single as $part) {
if (preg_match('/^[\[:]/', $part)) {
$out[] = $part;
@@ -883,21 +1259,26 @@ class Compiler
} elseif (preg_match('/^[\.#]/', $part)) {
array_unshift($out, $part);
$wasTag = false;
- } elseif (preg_match('/^[^_-]/', $part)) {
+ } elseif (preg_match('/^[^_-]/', $part) && $rang === 1) {
$tag[] = $part;
$wasTag = true;
} elseif ($wasTag) {
- $tag[count($tag) - 1] .= $part;
+ $tag[\count($tag) - 1] .= $part;
} else {
- $out[] = $part;
+ array_unshift($out, $part);
}
+ $rang--;
}
}
- if (count($tag)) {
+ if (\count($tag)) {
array_unshift($out, $tag[0]);
}
+ while (\count($pseudo)) {
+ $out[] = array_shift($pseudo);
+ }
+
return $out;
}
@@ -905,14 +1286,18 @@ class Compiler
* Compile media
*
* @param \ScssPhp\ScssPhp\Block $media
+ *
+ * @return void
*/
protected function compileMedia(Block $media)
{
+ assert($media instanceof MediaBlock);
$this->pushEnv($media);
$mediaQueries = $this->compileMediaQuery($this->multiplyMedia($this->env));
- if (! empty($mediaQueries) && $mediaQueries) {
+ if (! empty($mediaQueries)) {
+ assert($this->scope !== null);
$previousScope = $this->scope;
$parentScope = $this->mediaParent($this->scope);
@@ -929,7 +1314,8 @@ class Compiler
foreach ($media->children as $child) {
$type = $child[0];
- if ($type !== Type::T_BLOCK &&
+ if (
+ $type !== Type::T_BLOCK &&
$type !== Type::T_MEDIA &&
$type !== Type::T_DIRECTIVE &&
$type !== Type::T_IMPORT
@@ -940,7 +1326,7 @@ class Compiler
}
if ($needsWrap) {
- $wrapped = new Block;
+ $wrapped = new Block();
$wrapped->sourceName = $media->sourceName;
$wrapped->sourceIndex = $media->sourceIndex;
$wrapped->sourceLine = $media->sourceLine;
@@ -951,30 +1337,6 @@ class Compiler
$wrapped->children = $media->children;
$media->children = [[Type::T_BLOCK, $wrapped]];
-
- if (isset($this->lineNumberStyle)) {
- $annotation = $this->makeOutputBlock(Type::T_COMMENT);
- $annotation->depth = 0;
-
- $file = $this->sourceNames[$media->sourceIndex];
- $line = $media->sourceLine;
-
- switch ($this->lineNumberStyle) {
- case static::LINE_COMMENTS:
- $annotation->lines[] = '/* line ' . $line
- . ($file ? ', ' . $file : '')
- . ' */';
- break;
-
- case static::DEBUG_INFO:
- $annotation->lines[] = '@media -sass-debug-info{'
- . ($file ? 'filename{font-family:"' . $file . '"}' : '')
- . 'line{font-family:' . $line . '}}';
- break;
- }
-
- $this->scope->children[] = $annotation;
- }
}
$this->compileChildrenNoReturn($media->children, $this->scope);
@@ -1008,18 +1370,33 @@ class Compiler
/**
* Compile directive
*
- * @param \ScssPhp\ScssPhp\Block|array $block
+ * @param DirectiveBlock|array $directive
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+ *
+ * @return void
*/
protected function compileDirective($directive, OutputBlock $out)
{
- if (is_array($directive)) {
- $s = '@' . $directive[0];
+ if (\is_array($directive)) {
+ $directiveName = $this->compileDirectiveName($directive[0]);
+ $s = '@' . $directiveName;
+
if (! empty($directive[1])) {
$s .= ' ' . $this->compileValue($directive[1]);
}
- $this->appendRootDirective($s . ';', $out);
+ // sass-spec compliance on newline after directives, a bit tricky :/
+ $appendNewLine = (! empty($directive[2]) || strpos($s, "\n")) ? "\n" : "";
+ if (\is_array($directive[0]) && empty($directive[1])) {
+ $appendNewLine = "\n";
+ }
+
+ if (empty($directive[3])) {
+ $this->appendRootDirective($s . ';' . $appendNewLine, $out, [Type::T_COMMENT, Type::T_DIRECTIVE]);
+ } else {
+ $this->appendOutputLine($out, Type::T_DIRECTIVE, $s . ';');
+ }
} else {
+ $directive->name = $this->compileDirectiveName($directive->name);
$s = '@' . $directive->name;
if (! empty($directive->value)) {
@@ -1034,20 +1411,39 @@ class Compiler
}
}
+ /**
+ * directive names can include some interpolation
+ *
+ * @param string|array $directiveName
+ * @return string
+ * @throws CompilerException
+ */
+ protected function compileDirectiveName($directiveName)
+ {
+ if (is_string($directiveName)) {
+ return $directiveName;
+ }
+
+ return $this->compileValue($directiveName);
+ }
+
/**
* Compile at-root
*
* @param \ScssPhp\ScssPhp\Block $block
+ *
+ * @return void
*/
protected function compileAtRoot(Block $block)
{
+ assert($block instanceof AtRootBlock);
$env = $this->pushEnv($block);
$envs = $this->compactEnv($env);
list($with, $without) = $this->compileWith(isset($block->with) ? $block->with : null);
// wrap inline selector
if ($block->selector) {
- $wrapped = new Block;
+ $wrapped = new Block();
$wrapped->sourceName = $block->sourceName;
$wrapped->sourceIndex = $block->sourceIndex;
$wrapped->sourceLine = $block->sourceLine;
@@ -1063,8 +1459,11 @@ class Compiler
}
$selfParent = $block->selfParent;
+ assert($selfParent !== null, 'at-root blocks must have a selfParent set.');
- if (! $block->selfParent->selectors && isset($block->parent) && $block->parent &&
+ if (
+ ! $selfParent->selectors &&
+ isset($block->parent) &&
isset($block->parent->selectors) && $block->parent->selectors
) {
$selfParent = $block->parent;
@@ -1072,13 +1471,15 @@ class Compiler
$this->env = $this->filterWithWithout($envs, $with, $without);
+ assert($this->scope !== null);
$saveScope = $this->scope;
$this->scope = $this->filterScopeWithWithout($saveScope, $with, $without);
// propagate selfParent to the children where they still can be useful
$this->compileChildrenNoReturn($block->children, $this->scope, $selfParent);
- $this->scope = $this->completeScope($this->scope, $saveScope);
+ assert($this->scope !== null);
+ $this->completeScope($this->scope, $saveScope);
$this->scope = $saveScope;
$this->env = $this->extractEnv($envs);
@@ -1086,25 +1487,26 @@ class Compiler
}
/**
- * Filter at-root scope depending of with/without option
+ * Filter at-root scope depending on with/without option
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope
* @param array $with
* @param array $without
*
- * @return mixed
+ * @return OutputBlock
*/
protected function filterScopeWithWithout($scope, $with, $without)
{
$filteredScopes = [];
$childStash = [];
- if ($scope->type === TYPE::T_ROOT) {
+ if ($scope->type === Type::T_ROOT) {
return $scope;
}
+ assert($this->rootBlock !== null);
// start from the root
- while ($scope->parent && $scope->parent->type !== TYPE::T_ROOT) {
+ while ($scope->parent && $scope->parent->type !== Type::T_ROOT) {
array_unshift($childStash, $scope);
$scope = $scope->parent;
}
@@ -1127,7 +1529,7 @@ class Compiler
$filteredScopes[] = $s;
}
- if (count($childStash)) {
+ if (\count($childStash)) {
$scope = array_shift($childStash);
} elseif ($scope->children) {
$scope = end($scope->children);
@@ -1136,7 +1538,7 @@ class Compiler
}
}
- if (! count($filteredScopes)) {
+ if (! \count($filteredScopes)) {
return $this->rootBlock;
}
@@ -1147,7 +1549,7 @@ class Compiler
$p = &$newScope;
- while (count($filteredScopes)) {
+ while (\count($filteredScopes)) {
$s = array_shift($filteredScopes);
$s->parent = $p;
$p->children[] = $s;
@@ -1165,11 +1567,11 @@ class Compiler
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $previousScope
*
- * @return mixed
+ * @return OutputBlock
*/
protected function completeScope($scope, $previousScope)
{
- if (! $scope->type && (! $scope->selectors || ! count($scope->selectors)) && count($scope->lines)) {
+ if (! $scope->type && ! $scope->selectors && \count($scope->lines)) {
$scope->selectors = $this->findScopeSelectors($previousScope, $scope->depth);
}
@@ -1186,7 +1588,7 @@ class Compiler
* Find a selector by the depth node in the scope
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope
- * @param integer $depth
+ * @param int $depth
*
* @return array
*/
@@ -1210,9 +1612,11 @@ class Compiler
/**
* Compile @at-root's with: inclusion / without: exclusion into 2 lists uses to filter scope/env later
*
- * @param array $withCondition
+ * @param array|null $withCondition
*
* @return array
+ *
+ * @phpstan-return array{array, array}
*/
protected function compileWith($withCondition)
{
@@ -1221,9 +1625,21 @@ class Compiler
$without = ['rule' => true];
if ($withCondition) {
- if ($this->libMapHasKey([$withCondition, static::$with])) {
+ if ($withCondition[0] === Type::T_INTERPOLATE) {
+ $w = $this->compileValue($withCondition);
+
+ $buffer = "($w)";
+ $parser = $this->parserFactory(__METHOD__);
+
+ if ($parser->parseValue($buffer, $reParsedWith)) {
+ $withCondition = $reParsedWith;
+ }
+ }
+
+ $withConfig = $this->mapGet($withCondition, static::$with);
+ if ($withConfig !== null) {
$without = []; // cancel the default
- $list = $this->coerceList($this->libMapGet([$withCondition, static::$with]));
+ $list = $this->coerceList($withConfig);
foreach ($list[2] as $item) {
$keyword = $this->compileStringContent($this->coerceString($item));
@@ -1232,9 +1648,10 @@ class Compiler
}
}
- if ($this->libMapHasKey([$withCondition, static::$without])) {
+ $withoutConfig = $this->mapGet($withCondition, static::$without);
+ if ($withoutConfig !== null) {
$without = []; // cancel the default
- $list = $this->coerceList($this->libMapGet([$withCondition, static::$without]));
+ $list = $this->coerceList($withoutConfig);
foreach ($list[2] as $item) {
$keyword = $this->compileStringContent($this->coerceString($item));
@@ -1250,11 +1667,13 @@ class Compiler
/**
* Filter env stack
*
- * @param array $envs
+ * @param Environment[] $envs
* @param array $with
* @param array $without
*
- * @return \ScssPhp\ScssPhp\Compiler\Environment
+ * @return Environment
+ *
+ * @phpstan-param non-empty-array $envs
*/
protected function filterWithWithout($envs, $with, $without)
{
@@ -1282,7 +1701,7 @@ class Compiler
* @param array $with
* @param array $without
*
- * @return boolean
+ * @return bool
*/
protected function isWith($block, $with, $without)
{
@@ -1292,8 +1711,9 @@ class Compiler
}
if ($block->type === Type::T_DIRECTIVE) {
+ assert($block instanceof DirectiveBlock || $block instanceof OutputBlock);
if (isset($block->name)) {
- return $this->testWithWithout($block->name, $with, $without);
+ return $this->testWithWithout($this->compileDirectiveName($block->name), $with, $without);
} elseif (isset($block->selectors) && preg_match(',@(\w+),ims', json_encode($block->selectors), $m)) {
return $this->testWithWithout($m[1], $with, $without);
} else {
@@ -1302,14 +1722,14 @@ class Compiler
}
} elseif (isset($block->selectors)) {
// a selector starting with number is a keyframe rule
- if (count($block->selectors)) {
+ if (\count($block->selectors)) {
$s = reset($block->selectors);
- while (is_array($s)) {
+ while (\is_array($s)) {
$s = reset($s);
}
- if (is_object($s) && $s instanceof Node\Number) {
+ if (\is_object($s) && $s instanceof Number) {
return $this->testWithWithout('keyframes', $with, $without);
}
}
@@ -1327,14 +1747,13 @@ class Compiler
* @param array $with
* @param array $without
*
- * @return boolean
+ * @return bool
* true if the block should be kept, false to reject
*/
protected function testWithWithout($what, $with, $without)
{
-
// if without, reject only if in the list (or 'all' is in the list)
- if (count($without)) {
+ if (\count($without)) {
return (isset($without[$what]) || isset($without['all'])) ? false : true;
}
@@ -1347,7 +1766,9 @@ class Compiler
* Compile keyframe block
*
* @param \ScssPhp\ScssPhp\Block $block
- * @param array $selectors
+ * @param string[] $selectors
+ *
+ * @return void
*/
protected function compileKeyframeBlock(Block $block, $selectors)
{
@@ -1361,10 +1782,12 @@ class Compiler
$this->scope = $this->makeOutputBlock($block->type, $selectors);
$this->scope->depth = 1;
+ assert($this->scope->parent !== null);
$this->scope->parent->children[] = $this->scope;
$this->compileChildrenNoReturn($block->children, $this->scope);
+ assert($this->scope !== null);
$this->scope = $this->scope->parent;
$this->env = $this->extractEnv($envs);
@@ -1374,11 +1797,14 @@ class Compiler
/**
* Compile nested properties lines
*
- * @param \ScssPhp\ScssPhp\Block $block
- * @param OutputBlock $out
+ * @param \ScssPhp\ScssPhp\Block $block
+ * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+ *
+ * @return void
*/
protected function compileNestedPropertiesBlock(Block $block, OutputBlock $out)
{
+ assert($block instanceof NestedPropertyBlock);
$prefix = $this->compileValue($block->prefix) . '-';
$nested = $this->makeOutputBlock($block->type);
@@ -1397,6 +1823,7 @@ class Compiler
break;
case Type::T_NESTED_PROPERTY:
+ assert($child[1] instanceof NestedPropertyBlock);
array_unshift($child[1]->prefix[2], $prefix);
break;
}
@@ -1409,18 +1836,21 @@ class Compiler
* Compile nested block
*
* @param \ScssPhp\ScssPhp\Block $block
- * @param array $selectors
+ * @param string[] $selectors
+ *
+ * @return void
*/
protected function compileNestedBlock(Block $block, $selectors)
{
$this->pushEnv($block);
$this->scope = $this->makeOutputBlock($block->type, $selectors);
+ assert($this->scope->parent !== null);
$this->scope->parent->children[] = $this->scope;
// wrap assign children in a block
// except for @font-face
- if ($block->type !== Type::T_DIRECTIVE || $block->name !== "font-face") {
+ if (!$block instanceof DirectiveBlock || $this->compileDirectiveName($block->name) !== 'font-face') {
// need wrapping?
$needWrapping = false;
@@ -1432,7 +1862,7 @@ class Compiler
}
if ($needWrapping) {
- $wrapped = new Block;
+ $wrapped = new Block();
$wrapped->sourceName = $block->sourceName;
$wrapped->sourceIndex = $block->sourceIndex;
$wrapped->sourceLine = $block->sourceLine;
@@ -1449,6 +1879,7 @@ class Compiler
$this->compileChildrenNoReturn($block->children, $this->scope);
+ assert($this->scope !== null);
$this->scope = $this->scope->parent;
$this->popEnv();
@@ -1471,41 +1902,21 @@ class Compiler
* @see Compiler::compileChild()
*
* @param \ScssPhp\ScssPhp\Block $block
+ *
+ * @return void
*/
protected function compileBlock(Block $block)
{
$env = $this->pushEnv($block);
+ assert($block->selectors !== null);
$env->selectors = $this->evalSelectors($block->selectors);
$out = $this->makeOutputBlock(null);
- if (isset($this->lineNumberStyle) && count($env->selectors) && count($block->children)) {
- $annotation = $this->makeOutputBlock(Type::T_COMMENT);
- $annotation->depth = 0;
-
- $file = $this->sourceNames[$block->sourceIndex];
- $line = $block->sourceLine;
-
- switch ($this->lineNumberStyle) {
- case static::LINE_COMMENTS:
- $annotation->lines[] = '/* line ' . $line
- . ($file ? ', ' . $file : '')
- . ' */';
- break;
-
- case static::DEBUG_INFO:
- $annotation->lines[] = '@media -sass-debug-info{'
- . ($file ? 'filename{font-family:"' . $file . '"}' : '')
- . 'line{font-family:' . $line . '}}';
- break;
- }
-
- $this->scope->children[] = $annotation;
- }
-
+ assert($this->scope !== null);
$this->scope->children[] = $out;
- if (count($block->children)) {
+ if (\count($block->children)) {
$out->selectors = $this->multiplySelectors($env, $block->selfParent);
// propagate selfParent to the children where they still can be useful
@@ -1520,6 +1931,7 @@ class Compiler
// and revert for the following children of the same block
if ($selfParentSelectors) {
+ assert($block->selfParent !== null);
$block->selfParent->selectors = $selfParentSelectors;
}
}
@@ -1531,10 +1943,10 @@ class Compiler
/**
* Compile the value of a comment that can have interpolation
*
- * @param array $value
- * @param boolean $pushEnv
+ * @param array $value
+ * @param bool $pushEnv
*
- * @return array|mixed|string
+ * @return string
*/
protected function compileCommentValue($value, $pushEnv = false)
{
@@ -1543,18 +1955,19 @@ class Compiler
if (isset($value[2])) {
if ($pushEnv) {
$this->pushEnv();
- $storeEnv = $this->storeEnv;
- $this->storeEnv = $this->env;
}
try {
$c = $this->compileValue($value[2]);
- } catch (\Exception $e) {
+ } catch (SassScriptException $e) {
+ $this->logger->warn('Ignoring interpolation errors in multiline comments is deprecated and will be removed in ScssPhp 2.0. ' . $this->addLocationToMessage($e->getMessage()), true);
+ // ignore error in comment compilation which are only interpolation
+ } catch (SassException $e) {
+ $this->logger->warn('Ignoring interpolation errors in multiline comments is deprecated and will be removed in ScssPhp 2.0. ' . $e->getMessage(), true);
// ignore error in comment compilation which are only interpolation
}
if ($pushEnv) {
- $this->storeEnv = $storeEnv;
$this->popEnv();
}
}
@@ -1566,12 +1979,15 @@ class Compiler
* Compile root level comment
*
* @param array $block
+ *
+ * @return void
*/
protected function compileComment($block)
{
$out = $this->makeOutputBlock(Type::T_COMMENT);
$out->lines[] = $this->compileCommentValue($block, true);
+ assert($this->scope !== null);
$this->scope->children[] = $out;
}
@@ -1586,15 +2002,25 @@ class Compiler
{
$this->shouldEvaluate = false;
- $selectors = array_map([$this, 'evalSelector'], $selectors);
+ $evaluatedSelectors = [];
+ foreach ($selectors as $selector) {
+ $evaluatedSelectors[] = $this->evalSelector($selector);
+ }
+ $selectors = $evaluatedSelectors;
// after evaluating interpolates, we might need a second pass
if ($this->shouldEvaluate) {
- $selectors = $this->revertSelfSelector($selectors);
+ $selectors = $this->replaceSelfSelector($selectors, '&');
$buffer = $this->collapseSelectors($selectors);
$parser = $this->parserFactory(__METHOD__);
- if ($parser->parseSelector($buffer, $newSelectors)) {
+ try {
+ $isValid = $parser->parseSelector($buffer, $newSelectors, true);
+ } catch (ParserException $e) {
+ throw $this->error($e->getMessage());
+ }
+
+ if ($isValid) {
$selectors = array_map([$this, 'evalSelector'], $newSelectors);
}
}
@@ -1608,6 +2034,8 @@ class Compiler
* @param array $selector
*
* @return array
+ *
+ * @phpstan-impure
*/
protected function evalSelector($selector)
{
@@ -1620,20 +2048,23 @@ class Compiler
* @param array $part
*
* @return array
+ *
+ * @phpstan-impure
*/
protected function evalSelectorPart($part)
{
foreach ($part as &$p) {
- if (is_array($p) && ($p[0] === Type::T_INTERPOLATE || $p[0] === Type::T_STRING)) {
+ if (\is_array($p) && ($p[0] === Type::T_INTERPOLATE || $p[0] === Type::T_STRING)) {
$p = $this->compileValue($p);
- // force re-evaluation
- if (strpos($p, '&') !== false || strpos($p, ',') !== false) {
+ // force re-evaluation if self char or non standard char
+ if (preg_match(',[^\w-],', $p)) {
$this->shouldEvaluate = true;
}
- } elseif (is_string($p) && strlen($p) >= 2 &&
- ($first = $p[0]) && ($first === '"' || $first === "'") &&
- substr($p, -1) === $first
+ } elseif (
+ \is_string($p) && \strlen($p) >= 2 &&
+ ($p[0] === '"' || $p[0] === "'") &&
+ substr($p, -1) === $p[0]
) {
$p = substr($p, 1, -1);
}
@@ -1645,14 +2076,44 @@ class Compiler
/**
* Collapse selectors
*
- * @param array $selectors
- * @param boolean $selectorFormat
- * if false return a collapsed string
- * if true return an array description of a structured selector
+ * @param array $selectors
*
* @return string
*/
- protected function collapseSelectors($selectors, $selectorFormat = false)
+ protected function collapseSelectors($selectors)
+ {
+ $parts = [];
+
+ foreach ($selectors as $selector) {
+ $output = [];
+
+ foreach ($selector as $node) {
+ $compound = '';
+
+ array_walk_recursive(
+ $node,
+ function ($value, $key) use (&$compound) {
+ $compound .= $value;
+ }
+ );
+
+ $output[] = $compound;
+ }
+
+ $parts[] = implode(' ', $output);
+ }
+
+ return implode(', ', $parts);
+ }
+
+ /**
+ * Collapse selectors
+ *
+ * @param array $selectors
+ *
+ * @return array
+ */
+ private function collapseSelectorsAsList($selectors)
{
$parts = [];
@@ -1670,59 +2131,52 @@ class Compiler
}
);
- if ($selectorFormat && $this->isImmediateRelationshipCombinator($compound)) {
- if (count($output)) {
- $output[count($output) - 1] .= ' ' . $compound;
+ if ($this->isImmediateRelationshipCombinator($compound)) {
+ if (\count($output)) {
+ $output[\count($output) - 1] .= ' ' . $compound;
} else {
$output[] = $compound;
}
$glueNext = true;
} elseif ($glueNext) {
- $output[count($output) - 1] .= ' ' . $compound;
+ $output[\count($output) - 1] .= ' ' . $compound;
$glueNext = false;
} else {
$output[] = $compound;
}
}
- if ($selectorFormat) {
- foreach ($output as &$o) {
- $o = [Type::T_STRING, '', [$o]];
- }
-
- $output = [Type::T_LIST, ' ', $output];
- } else {
- $output = implode(' ', $output);
+ foreach ($output as &$o) {
+ $o = [Type::T_STRING, '', [$o]];
}
- $parts[] = $output;
+ $parts[] = [Type::T_LIST, ' ', $output];
}
- if ($selectorFormat) {
- $parts = [Type::T_LIST, ',', $parts];
- } else {
- $parts = implode(', ', $parts);
- }
-
- return $parts;
+ return [Type::T_LIST, ',', $parts];
}
/**
* Parse down the selector and revert [self] to "&" before a reparsing
*
- * @param array $selectors
+ * @param array $selectors
+ * @param string|null $replace
*
* @return array
*/
- protected function revertSelfSelector($selectors)
+ protected function replaceSelfSelector($selectors, $replace = null)
{
foreach ($selectors as &$part) {
- if (is_array($part)) {
+ if (\is_array($part)) {
if ($part === [Type::T_SELF]) {
- $part = '&';
+ if (\is_null($replace)) {
+ $replace = $this->reduce([Type::T_SELF]);
+ $replace = $this->compileValue($replace);
+ }
+ $part = $replace;
} else {
- $part = $this->revertSelfSelector($part);
+ $part = $this->replaceSelfSelector($part, $replace);
}
}
}
@@ -1742,18 +2196,19 @@ class Compiler
$joined = [];
foreach ($single as $part) {
- if (empty($joined) ||
- ! is_string($part) ||
+ if (
+ empty($joined) ||
+ ! \is_string($part) ||
preg_match('/[\[.:#%]/', $part)
) {
$joined[] = $part;
continue;
}
- if (is_array(end($joined))) {
+ if (\is_array(end($joined))) {
$joined[] = $part;
} else {
- $joined[count($joined) - 1] .= $part;
+ $joined[\count($joined) - 1] .= $part;
}
}
@@ -1769,7 +2224,7 @@ class Compiler
*/
protected function compileSelector($selector)
{
- if (! is_array($selector)) {
+ if (! \is_array($selector)) {
return $selector; // media and the like
}
@@ -1792,7 +2247,7 @@ class Compiler
protected function compileSelectorPart($piece)
{
foreach ($piece as &$p) {
- if (! is_array($p)) {
+ if (! \is_array($p)) {
continue;
}
@@ -1815,17 +2270,17 @@ class Compiler
*
* @param array $selector
*
- * @return boolean
+ * @return bool
*/
protected function hasSelectorPlaceholder($selector)
{
- if (! is_array($selector)) {
+ if (! \is_array($selector)) {
return false;
}
foreach ($selector as $parts) {
foreach ($parts as $part) {
- if (strlen($part) && '%' === $part[0]) {
+ if (\strlen($part) && '%' === $part[0]) {
return true;
}
}
@@ -1834,6 +2289,11 @@ class Compiler
return false;
}
+ /**
+ * @param string $name
+ *
+ * @return void
+ */
protected function pushCallStack($name = '')
{
$this->callStack[] = [
@@ -1844,15 +2304,18 @@ class Compiler
];
// infinite calling loop
- if (count($this->callStack) > 25000) {
+ if (\count($this->callStack) > 25000) {
// not displayed but you can var_dump it to deep debug
$msg = $this->callStackMessage(true, 100);
- $msg = "Infinite calling loop";
+ $msg = 'Infinite calling loop';
- $this->throwError($msg);
+ throw $this->error($msg);
}
}
+ /**
+ * @return void
+ */
protected function popCallStack()
{
array_pop($this->callStack);
@@ -1865,7 +2328,7 @@ class Compiler
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
* @param string $traceName
*
- * @return array|null
+ * @return array|Number|null
*/
protected function compileChildren($stms, OutputBlock $out, $traceName = '')
{
@@ -1875,6 +2338,8 @@ class Compiler
$ret = $this->compileChild($stm, $out);
if (isset($ret)) {
+ $this->popCallStack();
+
return $ret;
}
}
@@ -1885,13 +2350,15 @@ class Compiler
}
/**
- * Compile children and throw exception if unexpected @return
+ * Compile children and throw exception if unexpected at-return
*
- * @param array $stms
+ * @param array[] $stms
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
* @param \ScssPhp\ScssPhp\Block $selfParent
* @param string $traceName
*
+ * @return void
+ *
* @throws \Exception
*/
protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
@@ -1899,22 +2366,20 @@ class Compiler
$this->pushCallStack($traceName);
foreach ($stms as $stm) {
- if ($selfParent && isset($stm[1]) && is_object($stm[1]) && $stm[1] instanceof Block) {
+ if ($selfParent && isset($stm[1]) && \is_object($stm[1]) && $stm[1] instanceof Block) {
+ $oldSelfParent = $stm[1]->selfParent;
$stm[1]->selfParent = $selfParent;
$ret = $this->compileChild($stm, $out);
- $stm[1]->selfParent = null;
- } elseif ($selfParent && in_array($stm[0], [TYPE::T_INCLUDE, TYPE::T_EXTEND])) {
+ $stm[1]->selfParent = $oldSelfParent;
+ } elseif ($selfParent && \in_array($stm[0], [Type::T_INCLUDE, Type::T_EXTEND])) {
$stm['selfParent'] = $selfParent;
$ret = $this->compileChild($stm, $out);
- unset($stm['selfParent']);
} else {
$ret = $this->compileChild($stm, $out);
}
if (isset($ret)) {
- $this->throwError('@return may only be used within a function');
-
- return;
+ throw $this->error('@return may only be used within a function');
}
}
@@ -1923,7 +2388,7 @@ class Compiler
/**
- * evaluate media query : compile internal value keeping the structure inchanged
+ * evaluate media query : compile internal value keeping the structure unchanged
*
* @param array $queryList
*
@@ -1939,12 +2404,13 @@ class Compiler
$shouldReparse = false;
foreach ($query as $kq => $q) {
- for ($i = 1; $i < count($q); $i++) {
+ for ($i = 1; $i < \count($q); $i++) {
$value = $this->compileValue($q[$i]);
// the parser had no mean to know if media type or expression if it was an interpolation
// so you need to reparse if the T_MEDIA_TYPE looks like anything else a media type
- if ($q[0] == Type::T_MEDIA_TYPE &&
+ if (
+ $q[0] == Type::T_MEDIA_TYPE &&
(strpos($value, '(') !== false ||
strpos($value, ')') !== false ||
strpos($value, ':') !== false ||
@@ -1958,21 +2424,21 @@ class Compiler
}
if ($shouldReparse) {
- if (is_null($parser)) {
+ if (\is_null($parser)) {
$parser = $this->parserFactory(__METHOD__);
}
$queryString = $this->compileMediaQuery([$queryList[$kql]]);
$queryString = reset($queryString);
- if (strpos($queryString, '@media ') === 0) {
+ if ($queryString !== false && strpos($queryString, '@media ') === 0) {
$queryString = substr($queryString, 7);
$queries = [];
if ($parser->parseMediaQueryList($queryString, $queries)) {
$queries = $this->evaluateMediaQuery($queries[2]);
- while (count($queries)) {
+ while (\count($queries)) {
$outQueryList[] = array_shift($queries);
}
@@ -1992,14 +2458,14 @@ class Compiler
*
* @param array $queryList
*
- * @return array
+ * @return string[]
*/
protected function compileMediaQuery($queryList)
{
$start = '@media ';
$default = trim($start);
$out = [];
- $current = "";
+ $current = '';
foreach ($queryList as $query) {
$type = null;
@@ -2017,17 +2483,17 @@ class Compiler
foreach ($query as $q) {
switch ($q[0]) {
case Type::T_MEDIA_TYPE:
- $newType = array_map([$this, 'compileValue'], array_slice($q, 1));
+ $newType = array_map([$this, 'compileValue'], \array_slice($q, 1));
// combining not and anything else than media type is too risky and should be avoided
if (! $mediaTypeOnly) {
- if (in_array(Type::T_NOT, $newType) || ($type && in_array(Type::T_NOT, $type) )) {
+ if (\in_array(Type::T_NOT, $newType) || ($type && \in_array(Type::T_NOT, $type) )) {
if ($type) {
array_unshift($parts, implode(' ', array_filter($type)));
}
if (! empty($parts)) {
- if (strlen($current)) {
+ if (\strlen($current)) {
$current .= $this->formatter->tagSeparator;
}
@@ -2038,7 +2504,7 @@ class Compiler
$out[] = $start . $current;
}
- $current = "";
+ $current = '';
$type = null;
$parts = [];
}
@@ -2090,7 +2556,7 @@ class Compiler
}
if (! empty($parts)) {
- if (strlen($current)) {
+ if (\strlen($current)) {
$current .= $this->formatter->tagSeparator;
}
@@ -2172,7 +2638,7 @@ class Compiler
return $type1;
}
- if (count($type1) > 1) {
+ if (\count($type1) > 1) {
$m1 = strtolower($type1[0]);
$t1 = strtolower($type1[1]);
} else {
@@ -2180,7 +2646,7 @@ class Compiler
$t1 = strtolower($type1[0]);
}
- if (count($type2) > 1) {
+ if (\count($type2) > 1) {
$m2 = strtolower($type2[0]);
$t2 = strtolower($type2[1]);
} else {
@@ -2213,7 +2679,7 @@ class Compiler
}
// t1 == t2, neither m1 nor m2 are "not"
- return [empty($m1)? $m2 : $m1, $t1];
+ return [empty($m1) ? $m2 : $m1, $t1];
}
/**
@@ -2221,38 +2687,40 @@ class Compiler
*
* @param array $rawPath
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
- * @param boolean $once
+ * @param bool $once
*
- * @return boolean
+ * @return bool
*/
protected function compileImport($rawPath, OutputBlock $out, $once = false)
{
if ($rawPath[0] === Type::T_STRING) {
$path = $this->compileStringContent($rawPath);
- if ($path = $this->findImport($path)) {
- if (! $once || ! in_array($path, $this->importedFiles)) {
- $this->importFile($path, $out);
- $this->importedFiles[] = $path;
+ if (strpos($path, 'url(') !== 0 && $filePath = $this->findImport($path, $this->currentDirectory)) {
+ $this->registerImport($this->currentDirectory, $path, $filePath);
+
+ if (! $once || ! \in_array($filePath, $this->importedFiles)) {
+ $this->importFile($filePath, $out);
+ $this->importedFiles[] = $filePath;
}
return true;
}
- $this->appendRootDirective('@import ' . $this->compileValue($rawPath). ';', $out);
+ $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out);
return false;
}
if ($rawPath[0] === Type::T_LIST) {
// handle a list of strings
- if (count($rawPath[2]) === 0) {
+ if (\count($rawPath[2]) === 0) {
return false;
}
foreach ($rawPath[2] as $path) {
if ($path[0] !== Type::T_STRING) {
- $this->appendRootDirective('@import ' . $this->compileValue($rawPath) . ';', $out);
+ $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out);
return false;
}
@@ -2265,19 +2733,68 @@ class Compiler
return true;
}
- $this->appendRootDirective('@import ' . $this->compileValue($rawPath) . ';', $out);
+ $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out);
return false;
}
+ /**
+ * @param array $rawPath
+ * @return string
+ * @throws CompilerException
+ */
+ protected function compileImportPath($rawPath)
+ {
+ $path = $this->compileValue($rawPath);
+
+ // case url() without quotes : suppress \r \n remaining in the path
+ // if this is a real string there can not be CR or LF char
+ if (strpos($path, 'url(') === 0) {
+ $path = str_replace(array("\r", "\n"), array('', ' '), $path);
+ } else {
+ // if this is a file name in a string, spaces should be escaped
+ $path = $this->reduce($rawPath);
+ $path = $this->escapeImportPathString($path);
+ $path = $this->compileValue($path);
+ }
+
+ return $path;
+ }
+
+ /**
+ * @param array $path
+ * @return array
+ * @throws CompilerException
+ */
+ protected function escapeImportPathString($path)
+ {
+ switch ($path[0]) {
+ case Type::T_LIST:
+ foreach ($path[2] as $k => $v) {
+ $path[2][$k] = $this->escapeImportPathString($v);
+ }
+ break;
+ case Type::T_STRING:
+ if ($path[1]) {
+ $path = $this->compileValue($path);
+ $path = str_replace(' ', '\\ ', $path);
+ $path = [Type::T_KEYWORD, $path];
+ }
+ break;
+ }
+
+ return $path;
+ }
/**
* Append a root directive like @import or @charset as near as the possible from the source code
* (keeping before comments, @import and @charset coming before in the source code)
*
- * @param string $line
- * @param @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
- * @param array $allowed
+ * @param string $line
+ * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+ * @param array $allowed
+ *
+ * @return void
*/
protected function appendRootDirective($line, $out, $allowed = [Type::T_COMMENT])
{
@@ -2289,8 +2806,8 @@ class Compiler
$i = 0;
- while ($i < count($root->children)) {
- if (! isset($root->children[$i]->type) || ! in_array($root->children[$i]->type, $allowed)) {
+ while ($i < \count($root->children)) {
+ if (! isset($root->children[$i]->type) || ! \in_array($root->children[$i]->type, $allowed)) {
break;
}
@@ -2300,21 +2817,21 @@ class Compiler
// remove incompatible children from the bottom of the list
$saveChildren = [];
- while ($i < count($root->children)) {
+ while ($i < \count($root->children)) {
$saveChildren[] = array_pop($root->children);
}
// insert the directive as a comment
$child = $this->makeOutputBlock(Type::T_COMMENT);
$child->lines[] = $line;
- $child->sourceName = $this->sourceNames[$this->sourceIndex];
+ $child->sourceName = $this->sourceNames[$this->sourceIndex] ?: '(stdin)';
$child->sourceLine = $this->sourceLine;
$child->sourceColumn = $this->sourceColumn;
$root->children[] = $child;
// repush children
- while (count($saveChildren)) {
+ while (\count($saveChildren)) {
$root->children[] = array_pop($saveChildren);
}
}
@@ -2325,25 +2842,23 @@ class Compiler
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
* @param string $type
- * @param string|mixed $line
+ * @param string $line
+ *
+ * @return void
*/
protected function appendOutputLine(OutputBlock $out, $type, $line)
{
$outWrite = &$out;
- if ($type === Type::T_COMMENT) {
- $parent = $out->parent;
-
- if (end($parent->children) !== $out) {
- $outWrite = &$parent->children[count($parent->children) - 1];
- }
- }
-
// check if it's a flat output or not
- if (count($out->children)) {
- $lastChild = &$out->children[count($out->children) - 1];
+ if (\count($out->children)) {
+ $lastChild = &$out->children[\count($out->children) - 1];
- if ($lastChild->depth === $out->depth && is_null($lastChild->selectors) && ! count($lastChild->children)) {
+ if (
+ $lastChild->depth === $out->depth &&
+ \is_null($lastChild->selectors) &&
+ ! \count($lastChild->children)
+ ) {
$outWrite = $lastChild;
} else {
$nextLines = $this->makeOutputBlock($type);
@@ -2364,7 +2879,7 @@ class Compiler
* @param array $child
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
*
- * @return array
+ * @return array|Number|null
*/
protected function compileChild($child, OutputBlock $out)
{
@@ -2372,18 +2887,19 @@ class Compiler
$this->sourceIndex = isset($child[Parser::SOURCE_INDEX]) ? $child[Parser::SOURCE_INDEX] : null;
$this->sourceLine = isset($child[Parser::SOURCE_LINE]) ? $child[Parser::SOURCE_LINE] : -1;
$this->sourceColumn = isset($child[Parser::SOURCE_COLUMN]) ? $child[Parser::SOURCE_COLUMN] : -1;
- } elseif (is_array($child) && isset($child[1]->sourceLine)) {
+ } elseif (\is_array($child) && isset($child[1]->sourceLine) && $child[1] instanceof Block) {
$this->sourceIndex = $child[1]->sourceIndex;
$this->sourceLine = $child[1]->sourceLine;
$this->sourceColumn = $child[1]->sourceColumn;
} elseif (! empty($out->sourceLine) && ! empty($out->sourceName)) {
$this->sourceLine = $out->sourceLine;
- $this->sourceIndex = array_search($out->sourceName, $this->sourceNames);
+ $sourceIndex = array_search($out->sourceName, $this->sourceNames);
$this->sourceColumn = $out->sourceColumn;
- if ($this->sourceIndex === false) {
- $this->sourceIndex = null;
+ if ($sourceIndex === false) {
+ $sourceIndex = null;
}
+ $this->sourceIndex = $sourceIndex;
}
switch ($child[0]) {
@@ -2416,10 +2932,30 @@ class Compiler
break;
case Type::T_CHARSET:
- if (! $this->charsetSeen) {
- $this->charsetSeen = true;
- $this->appendRootDirective('@charset ' . $this->compileValue($child[1]) . ';', $out);
+ break;
+
+ case Type::T_CUSTOM_PROPERTY:
+ list(, $name, $value) = $child;
+ $compiledName = $this->compileValue($name);
+
+ // if the value reduces to null from something else then
+ // the property should be discarded
+ if ($value[0] !== Type::T_NULL) {
+ $value = $this->reduce($value);
+
+ if ($value[0] === Type::T_NULL || $value === static::$nullString) {
+ break;
+ }
}
+
+ $compiledValue = $this->compileValue($value);
+
+ $line = $this->formatter->customProperty(
+ $compiledName,
+ $compiledValue
+ );
+
+ $this->appendOutputLine($out, Type::T_ASSIGN, $line);
break;
case Type::T_ASSIGN:
@@ -2427,8 +2963,8 @@ class Compiler
if ($name[0] === Type::T_VARIABLE) {
$flags = isset($child[3]) ? $child[3] : [];
- $isDefault = in_array('!default', $flags);
- $isGlobal = in_array('!global', $flags);
+ $isDefault = \in_array('!default', $flags);
+ $isGlobal = \in_array('!global', $flags);
if ($isGlobal) {
$this->set($name[1], $this->reduce($value), false, $this->rootEnv, $value);
@@ -2436,7 +2972,7 @@ class Compiler
}
$shouldSet = $isDefault &&
- (is_null($result = $this->get($name[1], false)) ||
+ (\is_null($result = $this->get($name[1], false)) ||
$result === static::$null);
if (! $isDefault || $shouldSet) {
@@ -2448,7 +2984,7 @@ class Compiler
$compiledName = $this->compileValue($name);
// handle shorthand syntaxes : size / line-height...
- if (in_array($compiledName, ['font', 'grid-row', 'grid-column', 'border-radius'])) {
+ if (\in_array($compiledName, ['font', 'grid-row', 'grid-column', 'border-radius'])) {
if ($value[0] === Type::T_VARIABLE) {
// if the font value comes from variable, the content is already reduced
// (i.e., formulas were already calculated), so we need the original unreduced value
@@ -2468,7 +3004,7 @@ class Compiler
break;
}
- if ($compiledName === 'font' and $value[0] === Type::T_LIST && $value[1]==',') {
+ if ($compiledName === 'font' && $value[0] === Type::T_LIST && $value[1] === ',') {
// this is the case if more than one font is given: example: "font: 400 1em/1.3 arial,helvetica"
// we need to handle the first list element
$shorthandValue=&$value[2][0];
@@ -2480,11 +3016,11 @@ class Compiler
if ($shorthandDividerNeedsUnit) {
$divider = $shorthandValue[3];
- if (is_array($divider)) {
+ if (\is_array($divider)) {
$divider = $this->reduce($divider, true);
}
- if (intval($divider->dimension) and !count($divider->units)) {
+ if ($divider instanceof Number && \intval($divider->getDimension()) && $divider->unitless()) {
$revert = false;
}
}
@@ -2497,17 +3033,18 @@ class Compiler
if ($item[0] === Type::T_EXPRESSION && $item[1] === '/') {
if ($maxShorthandDividers > 0) {
$revert = true;
+
// if the list of values is too long, this has to be a shorthand,
// otherwise it could be a real division
- if (is_null($maxListElements) or count($shorthandValue[2]) <= $maxListElements) {
+ if (\is_null($maxListElements) || \count($shorthandValue[2]) <= $maxListElements) {
if ($shorthandDividerNeedsUnit) {
$divider = $item[3];
- if (is_array($divider)) {
+ if (\is_array($divider)) {
$divider = $this->reduce($divider, true);
}
- if (intval($divider->dimension) and !count($divider->units)) {
+ if ($divider instanceof Number && \intval($divider->getDimension()) && $divider->unitless()) {
$revert = false;
}
}
@@ -2535,11 +3072,14 @@ class Compiler
$compiledValue = $this->compileValue($value);
- $line = $this->formatter->property(
- $compiledName,
- $compiledValue
- );
- $this->appendOutputLine($out, Type::T_ASSIGN, $line);
+ // ignore empty value
+ if (\strlen($compiledValue)) {
+ $line = $this->formatter->property(
+ $compiledName,
+ $compiledValue
+ );
+ $this->appendOutputLine($out, Type::T_ASSIGN, $line);
+ }
break;
case Type::T_COMMENT:
@@ -2555,6 +3095,7 @@ class Compiler
case Type::T_MIXIN:
case Type::T_FUNCTION:
list(, $block) = $child;
+ assert($block instanceof CallableBlock);
// the block need to be able to go up to it's parent env to resolve vars
$block->parentEnv = $this->getStoreEnv();
$this->set(static::$namespaces[$block->type] . $block->name, $block, true);
@@ -2562,16 +3103,42 @@ class Compiler
case Type::T_EXTEND:
foreach ($child[1] as $sel) {
+ $replacedSel = $this->replaceSelfSelector($sel);
+
+ if ($replacedSel !== $sel) {
+ throw $this->error('Parent selectors aren\'t allowed here.');
+ }
+
$results = $this->evalSelectors([$sel]);
foreach ($results as $result) {
+ if (\count($result) !== 1) {
+ throw $this->error('complex selectors may not be extended.');
+ }
+
// only use the first one
- $result = current($result);
+ $result = $result[0];
$selectors = $out->selectors;
if (! $selectors && isset($child['selfParent'])) {
$selectors = $this->multiplySelectors($this->env, $child['selfParent']);
}
+ assert($selectors !== null);
+
+ if (\count($result) > 1) {
+ $replacement = implode(', ', $result);
+ $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]);
+ $line = $this->sourceLine;
+
+ $message = <<logger->warn($message);
+ }
$this->pushExtends($result, $selectors, $child);
}
@@ -2580,14 +3147,16 @@ class Compiler
case Type::T_IF:
list(, $if) = $child;
+ assert($if instanceof IfBlock);
if ($this->isTruthy($this->reduce($if->cond, true))) {
return $this->compileChildren($if->children, $out);
}
foreach ($if->cases as $case) {
- if ($case->type === Type::T_ELSE ||
- $case->type === Type::T_ELSEIF && $this->isTruthy($this->reduce($case->cond))
+ if (
+ $case instanceof ElseBlock ||
+ $case instanceof ElseifBlock && $this->isTruthy($this->reduce($case->cond))
) {
return $this->compileChildren($case->children, $out);
}
@@ -2596,13 +3165,14 @@ class Compiler
case Type::T_EACH:
list(, $each) = $child;
+ assert($each instanceof EachBlock);
- $list = $this->coerceList($this->reduce($each->list));
+ $list = $this->coerceList($this->reduce($each->list), ',', true);
$this->pushEnv();
foreach ($list[2] as $item) {
- if (count($each->vars) === 1) {
+ if (\count($each->vars) === 1) {
$this->set($each->vars[0], $item, true);
} else {
list(,, $values) = $this->coerceList($item);
@@ -2615,87 +3185,78 @@ class Compiler
$ret = $this->compileChildren($each->children, $out);
if ($ret) {
- if ($ret[0] !== Type::T_CONTROL) {
- $this->popEnv();
+ $store = $this->env->store;
+ $this->popEnv();
+ $this->backPropagateEnv($store, $each->vars);
- return $ret;
- }
-
- if ($ret[1]) {
- break;
- }
+ return $ret;
}
}
-
+ $store = $this->env->store;
$this->popEnv();
+ $this->backPropagateEnv($store, $each->vars);
+
break;
case Type::T_WHILE:
list(, $while) = $child;
+ assert($while instanceof WhileBlock);
while ($this->isTruthy($this->reduce($while->cond, true))) {
$ret = $this->compileChildren($while->children, $out);
if ($ret) {
- if ($ret[0] !== Type::T_CONTROL) {
- return $ret;
- }
-
- if ($ret[1]) {
- break;
- }
+ return $ret;
}
}
break;
case Type::T_FOR:
list(, $for) = $child;
+ assert($for instanceof ForBlock);
- $start = $this->reduce($for->start, true);
- $end = $this->reduce($for->end, true);
+ $startNumber = $this->assertNumber($this->reduce($for->start, true));
+ $endNumber = $this->assertNumber($this->reduce($for->end, true));
- if (! ($start[2] == $end[2] || $end->unitless())) {
- $this->throwError('Incompatible units: "%s" and "%s".', $start->unitStr(), $end->unitStr());
+ $start = $this->assertInteger($startNumber);
- break;
- }
+ $numeratorUnits = $startNumber->getNumeratorUnits();
+ $denominatorUnits = $startNumber->getDenominatorUnits();
- $unit = $start[2];
- $start = $start[1];
- $end = $end[1];
+ $end = $this->assertInteger($endNumber->coerce($numeratorUnits, $denominatorUnits));
$d = $start < $end ? 1 : -1;
+ $this->pushEnv();
+
for (;;) {
- if ((! $for->until && $start - $d == $end) ||
+ if (
+ (! $for->until && $start - $d == $end) ||
($for->until && $start == $end)
) {
break;
}
- $this->set($for->var, new Node\Number($start, $unit));
+ $this->set($for->var, new Number($start, $numeratorUnits, $denominatorUnits));
$start += $d;
$ret = $this->compileChildren($for->children, $out);
if ($ret) {
- if ($ret[0] !== Type::T_CONTROL) {
- return $ret;
- }
+ $store = $this->env->store;
+ $this->popEnv();
+ $this->backPropagateEnv($store, [$for->var]);
- if ($ret[1]) {
- break;
- }
+ return $ret;
}
}
+
+ $store = $this->env->store;
+ $this->popEnv();
+ $this->backPropagateEnv($store, [$for->var]);
+
break;
- case Type::T_BREAK:
- return [Type::T_CONTROL, true];
-
- case Type::T_CONTINUE:
- return [Type::T_CONTROL, false];
-
case Type::T_RETURN:
return $this->reduce($child[1], true);
@@ -2710,24 +3271,22 @@ class Compiler
$mixin = $this->get(static::$namespaces['mixin'] . $name, false);
if (! $mixin) {
- $this->throwError("Undefined mixin $name");
- break;
+ throw $this->error("Undefined mixin $name");
}
+ assert($mixin instanceof CallableBlock);
+
$callingScope = $this->getStoreEnv();
// push scope, apply args
$this->pushEnv();
$this->env->depth--;
- $storeEnv = $this->storeEnv;
- $this->storeEnv = $this->env;
-
// Find the parent selectors in the env to be able to know what '&' refers to in the mixin
// and assign this fake parent to childs
$selfParent = null;
- if (isset($child['selfParent']) && isset($child['selfParent']->selectors)) {
+ if (isset($child['selfParent']) && $child['selfParent'] instanceof Block && isset($child['selfParent']->selectors)) {
$selfParent = $child['selfParent'];
} else {
$parentSelectors = $this->multiplySelectors($this->env);
@@ -2737,7 +3296,7 @@ class Compiler
$parent->selectors = $parentSelectors;
foreach ($mixin->children as $k => $child) {
- if (isset($child[1]) && is_object($child[1]) && $child[1] instanceof Block) {
+ if (isset($child[1]) && $child[1] instanceof Block) {
$mixin->children[$k][1]->parent = $parent;
}
}
@@ -2771,12 +3330,10 @@ class Compiler
if (! empty($mixin->parentEnv)) {
$this->env->declarationScopeParent = $mixin->parentEnv;
} else {
- $this->throwError("@mixin $name() without parentEnv");
+ throw $this->error("@mixin $name() without parentEnv");
}
- $this->compileChildrenNoReturn($mixin->children, $out, $selfParent, $this->env->marker . " " . $name);
-
- $this->storeEnv = $storeEnv;
+ $this->compileChildrenNoReturn($mixin->children, $out, $selfParent, $this->env->marker . ' ' . $name);
$this->popEnv();
break;
@@ -2788,9 +3345,6 @@ class Compiler
$argContent = $child[1];
if (! $content) {
- $content = new \stdClass();
- $content->scope = new \stdClass();
- $content->children = $env->parent->block->children;
break;
}
@@ -2799,7 +3353,7 @@ class Compiler
if (isset($argUsing) && isset($argContent)) {
// Get the arguments provided for the content with the names provided in the "using" argument list
- $this->storeEnv = $this->env;
+ $this->storeEnv = null;
$varsUsing = $this->applyArguments($argUsing, $argContent, false);
}
@@ -2819,54 +3373,58 @@ class Compiler
case Type::T_DEBUG:
list(, $value) = $child;
- $fname = $this->sourceNames[$this->sourceIndex];
+ $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]);
$line = $this->sourceLine;
- $value = $this->compileValue($this->reduce($value, true));
+ $value = $this->compileDebugValue($value);
- fwrite($this->stderr, "File $fname on line $line DEBUG: $value\n");
+ $this->logger->debug("$fname:$line DEBUG: $value");
break;
case Type::T_WARN:
list(, $value) = $child;
- $fname = $this->sourceNames[$this->sourceIndex];
+ $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]);
$line = $this->sourceLine;
- $value = $this->compileValue($this->reduce($value, true));
+ $value = $this->compileDebugValue($value);
- fwrite($this->stderr, "File $fname on line $line WARN: $value\n");
+ $this->logger->warn("$value\n on line $line of $fname");
break;
case Type::T_ERROR:
list(, $value) = $child;
- $fname = $this->sourceNames[$this->sourceIndex];
+ $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]);
$line = $this->sourceLine;
$value = $this->compileValue($this->reduce($value, true));
- $this->throwError("File $fname on line $line ERROR: $value\n");
- break;
-
- case Type::T_CONTROL:
- $this->throwError('@break/@continue not permitted in this scope');
- break;
+ throw $this->error("File $fname on line $line ERROR: $value\n");
default:
- $this->throwError("unknown child type: $child[0]");
+ throw $this->error("unknown child type: $child[0]");
}
+
+ return null;
}
/**
* Reduce expression to string
*
* @param array $exp
+ * @param bool $keepParens
*
* @return array
*/
- protected function expToString($exp)
+ protected function expToString($exp, $keepParens = false)
{
- list(, $op, $left, $right, /* $inParens */, $whiteLeft, $whiteRight) = $exp;
+ list(, $op, $left, $right, $inParens, $whiteLeft, $whiteRight) = $exp;
- $content = [$this->reduce($left)];
+ $content = [];
+
+ if ($keepParens && $inParens) {
+ $content[] = '(';
+ }
+
+ $content[] = $this->reduce($left);
if ($whiteLeft) {
$content[] = ' ';
@@ -2880,17 +3438,21 @@ class Compiler
$content[] = $this->reduce($right);
+ if ($keepParens && $inParens) {
+ $content[] = ')';
+ }
+
return [Type::T_STRING, '', $content];
}
/**
* Is truthy?
*
- * @param array $value
+ * @param array|Number $value
*
- * @return boolean
+ * @return bool
*/
- protected function isTruthy($value)
+ public function isTruthy($value)
{
return $value !== static::$false && $value !== static::$null;
}
@@ -2900,7 +3462,7 @@ class Compiler
*
* @param string $value
*
- * @return boolean
+ * @return bool
*/
protected function isImmediateRelationshipCombinator($value)
{
@@ -2912,7 +3474,7 @@ class Compiler
*
* @param array $value
*
- * @return boolean
+ * @return bool
*/
protected function shouldEval($value)
{
@@ -2934,15 +3496,15 @@ class Compiler
/**
* Reduce value
*
- * @param array $value
- * @param boolean $inExp
+ * @param array|Number $value
+ * @param bool $inExp
*
- * @return null|string|array|\ScssPhp\ScssPhp\Node\Number
+ * @return array|Number
*/
protected function reduce($value, $inExp = false)
{
- if (is_null($value)) {
- return null;
+ if ($value instanceof Number) {
+ return $value;
}
switch ($value[0]) {
@@ -2959,8 +3521,9 @@ class Compiler
}
// special case: looks like css shorthand
- if ($opName == 'div' && ! $inParens && ! $inExp && isset($right[2]) &&
- (($right[0] !== Type::T_NUMBER && $right[2] != '') ||
+ if (
+ $opName == 'div' && ! $inParens && ! $inExp &&
+ (($right[0] !== Type::T_NUMBER && isset($right[2]) && $right[2] != '') ||
($right[0] === Type::T_NUMBER && ! $right->unitless()))
) {
return $this->expToString($value);
@@ -2975,73 +3538,24 @@ class Compiler
$ucLType = ucfirst($ltype);
$ucRType = ucfirst($rtype);
+ $shouldEval = $inParens || $inExp;
+
// this tries:
// 1. op[op name][left type][right type]
- // 2. op[left type][right type] (passing the op as first arg
+ // 2. op[left type][right type] (passing the op as first arg)
// 3. op[op name]
- $fn = "op${ucOpName}${ucLType}${ucRType}";
+ if (\is_callable([$this, $fn = "op${ucOpName}${ucLType}${ucRType}"])) {
+ $out = $this->$fn($left, $right, $shouldEval);
+ } elseif (\is_callable([$this, $fn = "op${ucLType}${ucRType}"])) {
+ $out = $this->$fn($op, $left, $right, $shouldEval);
+ } elseif (\is_callable([$this, $fn = "op${ucOpName}"])) {
+ $out = $this->$fn($left, $right, $shouldEval);
+ } else {
+ $out = null;
+ }
- if (is_callable([$this, $fn]) ||
- (($fn = "op${ucLType}${ucRType}") &&
- is_callable([$this, $fn]) &&
- $passOp = true) ||
- (($fn = "op${ucOpName}") &&
- is_callable([$this, $fn]) &&
- $genOp = true)
- ) {
- $coerceUnit = false;
-
- if (! isset($genOp) &&
- $left[0] === Type::T_NUMBER && $right[0] === Type::T_NUMBER
- ) {
- $coerceUnit = true;
-
- switch ($opName) {
- case 'mul':
- $targetUnit = $left[2];
-
- foreach ($right[2] as $unit => $exp) {
- $targetUnit[$unit] = (isset($targetUnit[$unit]) ? $targetUnit[$unit] : 0) + $exp;
- }
- break;
-
- case 'div':
- $targetUnit = $left[2];
-
- foreach ($right[2] as $unit => $exp) {
- $targetUnit[$unit] = (isset($targetUnit[$unit]) ? $targetUnit[$unit] : 0) - $exp;
- }
- break;
-
- case 'mod':
- $targetUnit = $left[2];
- break;
-
- default:
- $targetUnit = $left->unitless() ? $right[2] : $left[2];
- }
-
- if (! $left->unitless() && ! $right->unitless()) {
- $left = $left->normalize();
- $right = $right->normalize();
- }
- }
-
- $shouldEval = $inParens || $inExp;
-
- if (isset($passOp)) {
- $out = $this->$fn($op, $left, $right, $shouldEval);
- } else {
- $out = $this->$fn($left, $right, $shouldEval);
- }
-
- if (isset($out)) {
- if ($coerceUnit && $out[0] === Type::T_NUMBER) {
- $out = $out->coerce($targetUnit);
- }
-
- return $out;
- }
+ if (isset($out)) {
+ return $out;
}
return $this->expToString($value);
@@ -3052,13 +3566,13 @@ class Compiler
$inExp = $inExp || $this->shouldEval($exp);
$exp = $this->reduce($exp);
- if ($exp[0] === Type::T_NUMBER) {
+ if ($exp instanceof Number) {
switch ($op) {
case '+':
- return new Node\Number($exp[1], $exp[2]);
+ return $exp;
case '-':
- return new Node\Number(-$exp[1], $exp[2]);
+ return $exp->unaryMinus();
}
}
@@ -3083,6 +3597,14 @@ class Compiler
foreach ($value[2] as &$item) {
$item = $this->reduce($item);
}
+ unset($item);
+
+ if (isset($value[3]) && \is_array($value[3])) {
+ foreach ($value[3] as &$item) {
+ $item = $this->reduce($item);
+ }
+ unset($item);
+ }
return $value;
@@ -3099,7 +3621,7 @@ class Compiler
case Type::T_STRING:
foreach ($value[2] as &$item) {
- if (is_array($item) || $item instanceof \ArrayAccess) {
+ if (\is_array($item) || $item instanceof Number) {
$item = $this->reduce($item);
}
}
@@ -3110,7 +3632,7 @@ class Compiler
$value[1] = $this->reduce($value[1]);
if ($inExp) {
- return $value[1];
+ return [Type::T_KEYWORD, $this->compileValue($value, false)];
}
return $value;
@@ -3119,8 +3641,9 @@ class Compiler
return $this->fncall($value[1], $value[2]);
case Type::T_SELF:
- $selfSelector = $this->multiplySelectors($this->env);
- $selfSelector = $this->collapseSelectors($selfSelector, true);
+ $selfParent = ! empty($this->env->block->selfParent) ? $this->env->block->selfParent : null;
+ $selfSelector = $this->multiplySelectors($this->env, $selfParent);
+ $selfSelector = $this->collapseSelectorsAsList($selfSelector);
return $selfSelector;
@@ -3132,35 +3655,301 @@ class Compiler
/**
* Function caller
*
- * @param string $name
- * @param array $argValues
+ * @param string|array $functionReference
+ * @param array $argValues
*
- * @return array|null
+ * @return array|Number
*/
- protected function fncall($name, $argValues)
+ protected function fncall($functionReference, $argValues)
{
- // SCSS @function
- if ($this->callScssFunction($name, $argValues, $returnValue)) {
- return $returnValue;
- }
+ // a string means this is a static hard reference coming from the parsing
+ if (is_string($functionReference)) {
+ $name = $functionReference;
- // native PHP functions
- if ($this->callNativeFunction($name, $argValues, $returnValue)) {
- return $returnValue;
- }
-
- // for CSS functions, simply flatten the arguments into a list
- $listArgs = [];
-
- foreach ((array) $argValues as $arg) {
- if (empty($arg[0])) {
- $listArgs[] = $this->reduce($arg[1]);
+ $functionReference = $this->getFunctionReference($name);
+ if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) {
+ $functionReference = [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]];
}
}
- return [Type::T_FUNCTION, $name, [Type::T_LIST, ',', $listArgs]];
+ // a function type means we just want a plain css function call
+ if ($functionReference[0] === Type::T_FUNCTION) {
+ // for CSS functions, simply flatten the arguments into a list
+ $listArgs = [];
+
+ foreach ((array) $argValues as $arg) {
+ if (empty($arg[0]) || count($argValues) === 1) {
+ $listArgs[] = $this->reduce($this->stringifyFncallArgs($arg[1]));
+ }
+ }
+
+ return [Type::T_FUNCTION, $functionReference[1], [Type::T_LIST, ',', $listArgs]];
+ }
+
+ if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) {
+ return static::$defaultValue;
+ }
+
+
+ switch ($functionReference[1]) {
+ // SCSS @function
+ case 'scss':
+ return $this->callScssFunction($functionReference[3], $argValues);
+
+ // native PHP functions
+ case 'user':
+ case 'native':
+ list(,,$name, $fn, $prototype) = $functionReference;
+
+ // special cases of css valid functions min/max
+ $name = strtolower($name);
+ if (\in_array($name, ['min', 'max']) && count($argValues) >= 1) {
+ $cssFunction = $this->cssValidArg(
+ [Type::T_FUNCTION_CALL, $name, $argValues],
+ ['min', 'max', 'calc', 'env', 'var']
+ );
+ if ($cssFunction !== false) {
+ return $cssFunction;
+ }
+ }
+ $returnValue = $this->callNativeFunction($name, $fn, $prototype, $argValues);
+
+ if (! isset($returnValue)) {
+ return $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $argValues);
+ }
+
+ return $returnValue;
+
+ default:
+ return static::$defaultValue;
+ }
}
+ /**
+ * @param array|Number $arg
+ * @param string[] $allowed_function
+ * @param bool $inFunction
+ *
+ * @return array|Number|false
+ */
+ protected function cssValidArg($arg, $allowed_function = [], $inFunction = false)
+ {
+ if ($arg instanceof Number) {
+ return $this->stringifyFncallArgs($arg);
+ }
+
+ switch ($arg[0]) {
+ case Type::T_INTERPOLATE:
+ return [Type::T_KEYWORD, $this->CompileValue($arg)];
+
+ case Type::T_FUNCTION:
+ if (! \in_array($arg[1], $allowed_function)) {
+ return false;
+ }
+ if ($arg[2][0] === Type::T_LIST) {
+ foreach ($arg[2][2] as $k => $subarg) {
+ $arg[2][2][$k] = $this->cssValidArg($subarg, $allowed_function, $arg[1]);
+ if ($arg[2][2][$k] === false) {
+ return false;
+ }
+ }
+ }
+ return $arg;
+
+ case Type::T_FUNCTION_CALL:
+ if (! \in_array($arg[1], $allowed_function)) {
+ return false;
+ }
+ $cssArgs = [];
+ foreach ($arg[2] as $argValue) {
+ if ($argValue === static::$null) {
+ return false;
+ }
+ $cssArg = $this->cssValidArg($argValue[1], $allowed_function, $arg[1]);
+ if (empty($argValue[0]) && $cssArg !== false) {
+ $cssArgs[] = [$argValue[0], $cssArg];
+ } else {
+ return false;
+ }
+ }
+
+ return $this->fncall([Type::T_FUNCTION, $arg[1], [Type::T_LIST, ',', []]], $cssArgs);
+
+ case Type::T_STRING:
+ case Type::T_KEYWORD:
+ if (!$inFunction or !\in_array($inFunction, ['calc', 'env', 'var'])) {
+ return false;
+ }
+ return $this->stringifyFncallArgs($arg);
+
+ case Type::T_LIST:
+ if (!$inFunction) {
+ return false;
+ }
+ if (empty($arg['enclosing']) and $arg[1] === '') {
+ foreach ($arg[2] as $k => $subarg) {
+ $arg[2][$k] = $this->cssValidArg($subarg, $allowed_function, $inFunction);
+ if ($arg[2][$k] === false) {
+ return false;
+ }
+ }
+ $arg[0] = Type::T_STRING;
+ return $arg;
+ }
+ return false;
+
+ case Type::T_EXPRESSION:
+ if (! \in_array($arg[1], ['+', '-', '/', '*'])) {
+ return false;
+ }
+ $arg[2] = $this->cssValidArg($arg[2], $allowed_function, $inFunction);
+ $arg[3] = $this->cssValidArg($arg[3], $allowed_function, $inFunction);
+ if ($arg[2] === false || $arg[3] === false) {
+ return false;
+ }
+ return $this->expToString($arg, true);
+
+ case Type::T_VARIABLE:
+ case Type::T_SELF:
+ default:
+ return false;
+ }
+ }
+
+
+ /**
+ * Reformat fncall arguments to proper css function output
+ *
+ * @param array|Number $arg
+ *
+ * @return array|Number
+ */
+ protected function stringifyFncallArgs($arg)
+ {
+ if ($arg instanceof Number) {
+ return $arg;
+ }
+
+ switch ($arg[0]) {
+ case Type::T_LIST:
+ foreach ($arg[2] as $k => $v) {
+ $arg[2][$k] = $this->stringifyFncallArgs($v);
+ }
+ break;
+
+ case Type::T_EXPRESSION:
+ if ($arg[1] === '/') {
+ $arg[2] = $this->stringifyFncallArgs($arg[2]);
+ $arg[3] = $this->stringifyFncallArgs($arg[3]);
+ $arg[5] = $arg[6] = false; // no space around /
+ $arg = $this->expToString($arg);
+ }
+ break;
+
+ case Type::T_FUNCTION_CALL:
+ $name = strtolower($arg[1]);
+
+ if (in_array($name, ['max', 'min', 'calc'])) {
+ $args = $arg[2];
+ $arg = $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $args);
+ }
+ break;
+ }
+
+ return $arg;
+ }
+
+ /**
+ * Find a function reference
+ * @param string $name
+ * @param bool $safeCopy
+ * @return array
+ */
+ protected function getFunctionReference($name, $safeCopy = false)
+ {
+ // SCSS @function
+ if ($func = $this->get(static::$namespaces['function'] . $name, false)) {
+ if ($safeCopy) {
+ $func = clone $func;
+ }
+
+ return [Type::T_FUNCTION_REFERENCE, 'scss', $name, $func];
+ }
+
+ // native PHP functions
+
+ // try to find a native lib function
+ $normalizedName = $this->normalizeName($name);
+
+ if (isset($this->userFunctions[$normalizedName])) {
+ // see if we can find a user function
+ list($f, $prototype) = $this->userFunctions[$normalizedName];
+
+ return [Type::T_FUNCTION_REFERENCE, 'user', $name, $f, $prototype];
+ }
+
+ $lowercasedName = strtolower($normalizedName);
+
+ // Special functions overriding a CSS function are case-insensitive. We normalize them as lowercase
+ // to avoid the deprecation warning about the wrong case being used.
+ if ($lowercasedName === 'min' || $lowercasedName === 'max') {
+ $normalizedName = $lowercasedName;
+ }
+
+ if (($f = $this->getBuiltinFunction($normalizedName)) && \is_callable($f)) {
+ /** @var string $libName */
+ $libName = $f[1];
+ $prototype = isset(static::$$libName) ? static::$$libName : null;
+
+ // All core functions have a prototype defined. Not finding the
+ // prototype can mean 2 things:
+ // - the function comes from a child class (deprecated just after)
+ // - the function was found with a different case, which relates to calling the
+ // wrong Sass function due to our camelCase usage (`fade-in()` vs `fadein()`),
+ // because PHP method names are case-insensitive while property names are
+ // case-sensitive.
+ if ($prototype === null || strtolower($normalizedName) !== $normalizedName) {
+ $r = new \ReflectionMethod($this, $libName);
+ $actualLibName = $r->name;
+
+ if ($actualLibName !== $libName || strtolower($normalizedName) !== $normalizedName) {
+ $kebabCaseName = preg_replace('~(?<=\\w)([A-Z])~', '-$1', substr($actualLibName, 3));
+ assert($kebabCaseName !== null);
+ $originalName = strtolower($kebabCaseName);
+ $warning = "Calling built-in functions with a non-standard name is deprecated since Scssphp 1.8.0 and will not work anymore in 2.0 (they will be treated as CSS function calls instead).\nUse \"$originalName\" instead of \"$name\".";
+ @trigger_error($warning, E_USER_DEPRECATED);
+ $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]);
+ $line = $this->sourceLine;
+ Warn::deprecation("$warning\n on line $line of $fname");
+
+ // Use the actual function definition
+ $prototype = isset(static::$$actualLibName) ? static::$$actualLibName : null;
+ $f[1] = $libName = $actualLibName;
+ }
+ }
+
+ if (\get_class($this) !== __CLASS__ && !isset($this->warnedChildFunctions[$libName])) {
+ $r = new \ReflectionMethod($this, $libName);
+ $declaringClass = $r->getDeclaringClass()->name;
+
+ $needsWarning = $this->warnedChildFunctions[$libName] = $declaringClass !== __CLASS__;
+
+ if ($needsWarning) {
+ if (method_exists(__CLASS__, $libName)) {
+ @trigger_error(sprintf('Overriding the "%s" core function by extending the Compiler is deprecated and will be unsupported in 2.0. Remove the "%s::%s" method.', $normalizedName, $declaringClass, $libName), E_USER_DEPRECATED);
+ } else {
+ @trigger_error(sprintf('Registering custom functions by extending the Compiler and using the lib* discovery mechanism is deprecated and will be removed in 2.0. Replace the "%s::%s" method with registering the "%s" function through "Compiler::registerFunction".', $declaringClass, $libName, $normalizedName), E_USER_DEPRECATED);
+ }
+ }
+ }
+
+ return [Type::T_FUNCTION_REFERENCE, 'native', $name, $f, $prototype];
+ }
+
+ return static::$null;
+ }
+
+
/**
* Normalize name
*
@@ -3176,14 +3965,20 @@ class Compiler
/**
* Normalize value
*
- * @param array $value
+ * @internal
*
- * @return array
+ * @param array|Number $value
+ *
+ * @return array|Number
*/
public function normalizeValue($value)
{
$value = $this->coerceForExpression($this->reduce($value));
+ if ($value instanceof Number) {
+ return $value;
+ }
+
switch ($value[0]) {
case Type::T_LIST:
$value = $this->extractInterpolation($value);
@@ -3200,14 +3995,15 @@ class Compiler
unset($value['enclosing']);
}
+ if ($value[1] === '' && count($value[2]) > 1) {
+ $value[1] = ' ';
+ }
+
return $value;
case Type::T_STRING:
return [$value[0], '"', [$this->compileStringContent($value)]];
- case Type::T_NUMBER:
- return $value->normalize();
-
case Type::T_INTERPOLATE:
return [Type::T_KEYWORD, $this->compileValue($value)];
@@ -3219,70 +4015,66 @@ class Compiler
/**
* Add numbers
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
- * @return \ScssPhp\ScssPhp\Node\Number
+ * @return Number
*/
- protected function opAddNumberNumber($left, $right)
+ protected function opAddNumberNumber(Number $left, Number $right)
{
- return new Node\Number($left[1] + $right[1], $left[2]);
+ return $left->plus($right);
}
/**
* Multiply numbers
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
- * @return \ScssPhp\ScssPhp\Node\Number
+ * @return Number
*/
- protected function opMulNumberNumber($left, $right)
+ protected function opMulNumberNumber(Number $left, Number $right)
{
- return new Node\Number($left[1] * $right[1], $left[2]);
+ return $left->times($right);
}
/**
* Subtract numbers
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
- * @return \ScssPhp\ScssPhp\Node\Number
+ * @return Number
*/
- protected function opSubNumberNumber($left, $right)
+ protected function opSubNumberNumber(Number $left, Number $right)
{
- return new Node\Number($left[1] - $right[1], $left[2]);
+ return $left->minus($right);
}
/**
* Divide numbers
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
- * @return array|\ScssPhp\ScssPhp\Node\Number
+ * @return Number
*/
- protected function opDivNumberNumber($left, $right)
+ protected function opDivNumberNumber(Number $left, Number $right)
{
- if ($right[1] == 0) {
- return [Type::T_STRING, '', [$left[1] . $left[2] . '/' . $right[1] . $right[2]]];
- }
-
- return new Node\Number($left[1] / $right[1], $left[2]);
+ return $left->dividedBy($right);
}
/**
* Mod numbers
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
- * @return \ScssPhp\ScssPhp\Node\Number
+ * @return Number
*/
- protected function opModNumberNumber($left, $right)
+ protected function opModNumberNumber(Number $left, Number $right)
{
- return new Node\Number($left[1] % $right[1], $left[2]);
+ return $left->modulo($right);
}
/**
@@ -3321,11 +4113,11 @@ class Compiler
/**
* Boolean and
*
- * @param array $left
- * @param array $right
- * @param boolean $shouldEval
+ * @param array|Number $left
+ * @param array|Number $right
+ * @param bool $shouldEval
*
- * @return array|null
+ * @return array|Number|null
*/
protected function opAnd($left, $right, $shouldEval)
{
@@ -3349,11 +4141,11 @@ class Compiler
/**
* Boolean or
*
- * @param array $left
- * @param array $right
- * @param boolean $shouldEval
+ * @param array|Number $left
+ * @param array|Number $right
+ * @param bool $shouldEval
*
- * @return array|null
+ * @return array|Number|null
*/
protected function opOr($left, $right, $shouldEval)
{
@@ -3385,6 +4177,15 @@ class Compiler
*/
protected function opColorColor($op, $left, $right)
{
+ if ($op !== '==' && $op !== '!=') {
+ $warning = "Color arithmetic is deprecated and will be an error in future versions.\n"
+ . "Consider using Sass's color functions instead.";
+ $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]);
+ $line = $this->sourceLine;
+
+ Warn::deprecation("$warning\n on line $line of $fname");
+ }
+
$out = [Type::T_COLOR];
foreach ([1, 2, 3] as $i) {
@@ -3405,13 +4206,16 @@ class Compiler
break;
case '%':
+ if ($rval == 0) {
+ throw $this->error("color: Can't take modulo by zero");
+ }
+
$out[] = $lval % $rval;
break;
case '/':
if ($rval == 0) {
- $this->throwError("color: Can't divide by zero");
- break 2;
+ throw $this->error("color: Can't divide by zero");
}
$out[] = (int) ($lval / $rval);
@@ -3424,8 +4228,7 @@ class Compiler
return $this->opNeq($left, $right);
default:
- $this->throwError("color: unknown op $op");
- break 2;
+ throw $this->error("color: unknown op $op");
}
}
@@ -3443,13 +4246,21 @@ class Compiler
*
* @param string $op
* @param array $left
- * @param array $right
+ * @param Number $right
*
* @return array
*/
- protected function opColorNumber($op, $left, $right)
+ protected function opColorNumber($op, $left, Number $right)
{
- $value = $right[1];
+ if ($op === '==') {
+ return static::$false;
+ }
+
+ if ($op === '!=') {
+ return static::$true;
+ }
+
+ $value = $right->getDimension();
return $this->opColorColor(
$op,
@@ -3462,14 +4273,22 @@ class Compiler
* Compare number and color
*
* @param string $op
- * @param array $left
+ * @param Number $left
* @param array $right
*
* @return array
*/
- protected function opNumberColor($op, $left, $right)
+ protected function opNumberColor($op, Number $left, $right)
{
- $value = $left[1];
+ if ($op === '==') {
+ return static::$false;
+ }
+
+ if ($op === '!=') {
+ return static::$true;
+ }
+
+ $value = $left->getDimension();
return $this->opColorColor(
$op,
@@ -3481,8 +4300,8 @@ class Compiler
/**
* Compare number1 == number2
*
- * @param array $left
- * @param array $right
+ * @param array|Number $left
+ * @param array|Number $right
*
* @return array
*/
@@ -3502,8 +4321,8 @@ class Compiler
/**
* Compare number1 != number2
*
- * @param array $left
- * @param array $right
+ * @param array|Number $left
+ * @param array|Number $right
*
* @return array
*/
@@ -3521,70 +4340,81 @@ class Compiler
}
/**
- * Compare number1 >= number2
+ * Compare number1 == number2
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
* @return array
*/
- protected function opGteNumberNumber($left, $right)
+ protected function opEqNumberNumber(Number $left, Number $right)
{
- return $this->toBool($left[1] >= $right[1]);
+ return $this->toBool($left->equals($right));
+ }
+
+ /**
+ * Compare number1 != number2
+ *
+ * @param Number $left
+ * @param Number $right
+ *
+ * @return array
+ */
+ protected function opNeqNumberNumber(Number $left, Number $right)
+ {
+ return $this->toBool(!$left->equals($right));
+ }
+
+ /**
+ * Compare number1 >= number2
+ *
+ * @param Number $left
+ * @param Number $right
+ *
+ * @return array
+ */
+ protected function opGteNumberNumber(Number $left, Number $right)
+ {
+ return $this->toBool($left->greaterThanOrEqual($right));
}
/**
* Compare number1 > number2
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
* @return array
*/
- protected function opGtNumberNumber($left, $right)
+ protected function opGtNumberNumber(Number $left, Number $right)
{
- return $this->toBool($left[1] > $right[1]);
+ return $this->toBool($left->greaterThan($right));
}
/**
* Compare number1 <= number2
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
* @return array
*/
- protected function opLteNumberNumber($left, $right)
+ protected function opLteNumberNumber(Number $left, Number $right)
{
- return $this->toBool($left[1] <= $right[1]);
+ return $this->toBool($left->lessThanOrEqual($right));
}
/**
* Compare number1 < number2
*
- * @param array $left
- * @param array $right
+ * @param Number $left
+ * @param Number $right
*
* @return array
*/
- protected function opLtNumberNumber($left, $right)
+ protected function opLtNumberNumber(Number $left, Number $right)
{
- return $this->toBool($left[1] < $right[1]);
- }
-
- /**
- * Three-way comparison, aka spaceship operator
- *
- * @param array $left
- * @param array $right
- *
- * @return \ScssPhp\ScssPhp\Node\Number
- */
- protected function opCmpNumberNumber($left, $right)
- {
- $n = $left[1] - $right[1];
-
- return new Node\Number($n ? $n / abs($n) : 0, '');
+ return $this->toBool($left->lessThan($right));
}
/**
@@ -3592,7 +4422,7 @@ class Compiler
*
* @api
*
- * @param mixed $thing
+ * @param bool $thing
*
* @return array
*/
@@ -3601,6 +4431,53 @@ class Compiler
return $thing ? static::$true : static::$false;
}
+ /**
+ * Escape non printable chars in strings output as in dart-sass
+ *
+ * @internal
+ *
+ * @param string $string
+ * @param bool $inKeyword
+ *
+ * @return string
+ */
+ public function escapeNonPrintableChars($string, $inKeyword = false)
+ {
+ static $replacement = [];
+ if (empty($replacement[$inKeyword])) {
+ for ($i = 0; $i < 32; $i++) {
+ if ($i !== 9 || $inKeyword) {
+ $replacement[$inKeyword][chr($i)] = '\\' . dechex($i) . ($inKeyword ? ' ' : chr(0));
+ }
+ }
+ }
+ $string = str_replace(array_keys($replacement[$inKeyword]), array_values($replacement[$inKeyword]), $string);
+ // chr(0) is not a possible char from the input, so any chr(0) comes from our escaping replacement
+ if (strpos($string, chr(0)) !== false) {
+ if (substr($string, -1) === chr(0)) {
+ $string = substr($string, 0, -1);
+ }
+ $string = str_replace(
+ [chr(0) . '\\',chr(0) . ' '],
+ [ '\\', ' '],
+ $string
+ );
+ if (strpos($string, chr(0)) !== false) {
+ $parts = explode(chr(0), $string);
+ $string = array_shift($parts);
+ while (count($parts)) {
+ $next = array_shift($parts);
+ if (strpos("0123456789abcdefABCDEF" . chr(9), $next[0]) !== false) {
+ $string .= " ";
+ }
+ $string .= $next;
+ }
+ }
+ }
+
+ return $string;
+ }
+
/**
* Compiles a primitive value into a CSS property value.
*
@@ -3614,17 +4491,22 @@ class Compiler
*
* @api
*
- * @param array $value
+ * @param array|Number $value
+ * @param bool $quote
*
- * @return string|array
+ * @return string
*/
- public function compileValue($value)
+ public function compileValue($value, $quote = true)
{
$value = $this->reduce($value);
+ if ($value instanceof Number) {
+ return $value->output($this);
+ }
+
switch ($value[0]) {
case Type::T_KEYWORD:
- return $value[1];
+ return $this->escapeNonPrintableChars($value[1], true);
case Type::T_COLOR:
// [1] - red component (either number for a %)
@@ -3637,18 +4519,18 @@ class Compiler
$g = $this->compileRGBAValue($g);
$b = $this->compileRGBAValue($b);
- if (count($value) === 5) {
+ if (\count($value) === 5) {
$alpha = $this->compileRGBAValue($value[4], true);
if (! is_numeric($alpha) || $alpha < 1) {
$colorName = Colors::RGBaToColorName($r, $g, $b, $alpha);
- if (! is_null($colorName)) {
+ if (! \is_null($colorName)) {
return $colorName;
}
if (is_numeric($alpha)) {
- $a = new Node\Number($alpha, '');
+ $a = new Number($alpha, '');
} else {
$a = $alpha;
}
@@ -3663,7 +4545,7 @@ class Compiler
$colorName = Colors::RGBaToColorName($r, $g, $b);
- if (! is_null($colorName)) {
+ if (! \is_null($colorName)) {
return $colorName;
}
@@ -3676,72 +4558,119 @@ class Compiler
return $h;
- case Type::T_NUMBER:
- return $value->output($this);
-
case Type::T_STRING:
- return $value[1] . $this->compileStringContent($value) . $value[1];
+ $content = $this->compileStringContent($value, $quote);
+
+ if ($value[1] && $quote) {
+ $content = str_replace('\\', '\\\\', $content);
+
+ $content = $this->escapeNonPrintableChars($content);
+
+ // force double quote as string quote for the output in certain cases
+ if (
+ $value[1] === "'" &&
+ (strpos($content, '"') === false or strpos($content, "'") !== false)
+ ) {
+ $value[1] = '"';
+ } elseif (
+ $value[1] === '"' &&
+ (strpos($content, '"') !== false and strpos($content, "'") === false)
+ ) {
+ $value[1] = "'";
+ }
+
+ $content = str_replace($value[1], '\\' . $value[1], $content);
+ }
+
+ return $value[1] . $content . $value[1];
case Type::T_FUNCTION:
- $args = ! empty($value[2]) ? $this->compileValue($value[2]) : '';
+ $args = ! empty($value[2]) ? $this->compileValue($value[2], $quote) : '';
return "$value[1]($args)";
+ case Type::T_FUNCTION_REFERENCE:
+ $name = ! empty($value[2]) ? $value[2] : '';
+
+ return "get-function(\"$name\")";
+
case Type::T_LIST:
$value = $this->extractInterpolation($value);
if ($value[0] !== Type::T_LIST) {
- return $this->compileValue($value);
+ return $this->compileValue($value, $quote);
}
list(, $delim, $items) = $value;
- $pre = $post = "";
+ $pre = $post = '';
+
if (! empty($value['enclosing'])) {
switch ($value['enclosing']) {
case 'parent':
- //$pre = "(";
- //$post = ")";
+ //$pre = '(';
+ //$post = ')';
break;
case 'forced_parent':
- $pre = "(";
- $post = ")";
+ $pre = '(';
+ $post = ')';
break;
case 'bracket':
case 'forced_bracket':
- $pre = "[";
- $post = "]";
+ $pre = '[';
+ $post = ']';
break;
}
}
+ $separator = $delim === '/' ? ' /' : $delim;
+
$prefix_value = '';
+
if ($delim !== ' ') {
$prefix_value = ' ';
}
$filtered = [];
+ $same_string_quote = null;
foreach ($items as $item) {
+ if (\is_null($same_string_quote)) {
+ $same_string_quote = false;
+ if ($item[0] === Type::T_STRING) {
+ $same_string_quote = $item[1];
+ foreach ($items as $ii) {
+ if ($ii[0] !== Type::T_STRING) {
+ $same_string_quote = false;
+ break;
+ }
+ }
+ }
+ }
if ($item[0] === Type::T_NULL) {
continue;
}
+ if ($same_string_quote === '"' && $item[0] === Type::T_STRING && $item[1]) {
+ $item[1] = $same_string_quote;
+ }
- $compiled = $this->compileValue($item);
- if ($prefix_value && strlen($compiled)) {
+ $compiled = $this->compileValue($item, $quote);
+
+ if ($prefix_value && \strlen($compiled)) {
$compiled = $prefix_value . $compiled;
}
+
$filtered[] = $compiled;
}
- return $pre . substr(implode("$delim", $filtered), strlen($prefix_value)) . $post;
+ return $pre . substr(implode($separator, $filtered), \strlen($prefix_value)) . $post;
case Type::T_MAP:
$keys = $value[1];
$values = $value[2];
$filtered = [];
- for ($i = 0, $s = count($keys); $i < $s; $i++) {
- $filtered[$this->compileValue($keys[$i])] = $this->compileValue($values[$i]);
+ for ($i = 0, $s = \count($keys); $i < $s; $i++) {
+ $filtered[$this->compileValue($keys[$i], $quote)] = $this->compileValue($values[$i], $quote);
}
array_walk($filtered, function (&$value, $key) {
@@ -3761,8 +4690,9 @@ class Compiler
$delim .= ' ';
}
- $left = count($left[2]) > 0 ?
- $this->compileValue($left) . $delim . $whiteLeft: '';
+ $left = \count($left[2]) > 0
+ ? $this->compileValue($left, $quote) . $delim . $whiteLeft
+ : '';
$delim = $right[1];
@@ -3770,15 +4700,19 @@ class Compiler
$delim .= ' ';
}
- $right = count($right[2]) > 0 ?
- $whiteRight . $delim . $this->compileValue($right) : '';
+ $right = \count($right[2]) > 0 ?
+ $whiteRight . $delim . $this->compileValue($right, $quote) : '';
- return $left . $this->compileValue($interpolate) . $right;
+ return $left . $this->compileValue($interpolate, $quote) . $right;
case Type::T_INTERPOLATE:
// strip quotes if it's a string
$reduced = $this->reduce($value[1]);
+ if ($reduced instanceof Number) {
+ return $this->compileValue($reduced, $quote);
+ }
+
switch ($reduced[0]) {
case Type::T_LIST:
$reduced = $this->extractInterpolation($reduced);
@@ -3800,14 +4734,12 @@ class Compiler
continue;
}
- $temp = $this->compileValue([Type::T_KEYWORD, $item]);
-
- if ($temp[0] === Type::T_STRING) {
- $filtered[] = $this->compileStringContent($temp);
- } elseif ($temp[0] === Type::T_KEYWORD) {
- $filtered[] = $temp[1];
+ if ($item[0] === Type::T_STRING) {
+ $filtered[] = $this->compileStringContent($item, $quote);
+ } elseif ($item[0] === Type::T_KEYWORD) {
+ $filtered[] = $item[1];
} else {
- $filtered[] = $this->compileValue($temp);
+ $filtered[] = $this->compileValue($item, $quote);
}
}
@@ -3815,14 +4747,14 @@ class Compiler
break;
case Type::T_STRING:
- $reduced = [Type::T_KEYWORD, $this->compileStringContent($reduced)];
+ $reduced = [Type::T_STRING, '', [$this->compileStringContent($reduced)]];
break;
case Type::T_NULL:
$reduced = [Type::T_KEYWORD, ''];
}
- return $this->compileValue($reduced);
+ return $this->compileValue($reduced, $quote);
case Type::T_NULL:
return 'null';
@@ -3831,7 +4763,29 @@ class Compiler
return $this->compileCommentValue($value);
default:
- $this->throwError("unknown value type: ".json_encode($value));
+ throw $this->error('unknown value type: ' . json_encode($value));
+ }
+ }
+
+ /**
+ * @param array|Number $value
+ *
+ * @return string
+ */
+ protected function compileDebugValue($value)
+ {
+ $value = $this->reduce($value, true);
+
+ if ($value instanceof Number) {
+ return $this->compileValue($value);
+ }
+
+ switch ($value[0]) {
+ case Type::T_STRING:
+ return $this->compileStringContent($value);
+
+ default:
+ return $this->compileValue($value);
}
}
@@ -3841,26 +4795,50 @@ class Compiler
* @param array $list
*
* @return string
+ *
+ * @deprecated
*/
protected function flattenList($list)
{
+ @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED);
+
return $this->compileValue($list);
}
+ /**
+ * Gets the text of a Sass string
+ *
+ * Calling this method on anything else than a SassString is unsupported. Use {@see assertString} first
+ * to ensure that the value is indeed a string.
+ *
+ * @param array $value
+ *
+ * @return string
+ */
+ public function getStringText(array $value)
+ {
+ if ($value[0] !== Type::T_STRING) {
+ throw new \InvalidArgumentException('The argument is not a sass string. Did you forgot to use "assertString"?');
+ }
+
+ return $this->compileStringContent($value);
+ }
+
/**
* Compile string content
*
* @param array $string
+ * @param bool $quote
*
* @return string
*/
- protected function compileStringContent($string)
+ protected function compileStringContent($string, $quote = true)
{
$parts = [];
foreach ($string[2] as $part) {
- if (is_array($part) || $part instanceof \ArrayAccess) {
- $parts[] = $this->compileValue($part);
+ if (\is_array($part) || $part instanceof Number) {
+ $parts[] = $this->compileValue($part, $quote);
} else {
$parts[] = $part;
}
@@ -3882,8 +4860,8 @@ class Compiler
foreach ($items as $i => $item) {
if ($item[0] === Type::T_INTERPOLATE) {
- $before = [Type::T_LIST, $list[1], array_slice($items, 0, $i)];
- $after = [Type::T_LIST, $list[1], array_slice($items, $i + 1)];
+ $before = [Type::T_LIST, $list[1], \array_slice($items, 0, $i)];
+ $after = [Type::T_LIST, $list[1], \array_slice($items, $i + 1)];
return [Type::T_INTERPOLATED, $item, $before, $after];
}
@@ -3908,7 +4886,7 @@ class Compiler
$selfParentSelectors = null;
- if (! is_null($selfParent) && $selfParent->selectors) {
+ if (! \is_null($selfParent) && $selfParent->selectors) {
$selfParentSelectors = $this->evalSelectors($selfParent->selectors);
}
@@ -3924,8 +4902,8 @@ class Compiler
$prevSelectors = $selectors;
$selectors = [];
- foreach ($prevSelectors as $selector) {
- foreach ($parentSelectors as $parent) {
+ foreach ($parentSelectors as $parent) {
+ foreach ($prevSelectors as $selector) {
if ($selfParentSelectors) {
foreach ($selfParentSelectors as $selfParent) {
// if no '&' in the selector, each call will give same result, only add once
@@ -3945,16 +4923,21 @@ class Compiler
$selectors = array_values($selectors);
+ // case we are just starting a at-root : nothing to multiply but parentSelectors
+ if (! $selectors && $selfParentSelectors) {
+ $selectors = $selfParentSelectors;
+ }
+
return $selectors;
}
/**
* Join selectors; looks for & to replace, or append parent before child
*
- * @param array $parent
- * @param array $child
- * @param boolean &$stillHasSelf
- * @param array $selfParentSelectors
+ * @param array $parent
+ * @param array $child
+ * @param bool $stillHasSelf
+ * @param array $selfParentSelectors
* @return array
*/
@@ -3975,7 +4958,7 @@ class Compiler
if ($p === static::$selfSelector && ! $setSelf) {
$setSelf = true;
- if (is_null($selfParentSelectors)) {
+ if (\is_null($selfParentSelectors)) {
$selfParentSelectors = $parent;
}
@@ -3986,7 +4969,7 @@ class Compiler
}
foreach ($parentPart as $pp) {
- if (is_array($pp)) {
+ if (\is_array($pp)) {
$flatten = [];
array_walk_recursive($pp, function ($a) use (&$flatten) {
@@ -4020,7 +5003,8 @@ class Compiler
*/
protected function multiplyMedia(Environment $env = null, $childQueries = null)
{
- if (! isset($env) ||
+ if (
+ ! isset($env) ||
! empty($env->block->type) && $env->block->type !== Type::T_MEDIA
) {
return $childQueries;
@@ -4031,6 +5015,8 @@ class Compiler
return $this->multiplyMedia($env->parent, $childQueries);
}
+ assert($env->block instanceof MediaBlock);
+
$parentQueries = isset($env->block->queryList)
? $env->block->queryList
: [[[Type::T_MEDIA_VALUE, $env->block->value]]];
@@ -4043,7 +5029,7 @@ class Compiler
list($this->env, $this->storeEnv) = $store;
- if (is_null($childQueries)) {
+ if (\is_null($childQueries)) {
$childQueries = $parentQueries;
} else {
$originalQueries = $childQueries;
@@ -4066,9 +5052,11 @@ class Compiler
/**
* Convert env linked list to stack
*
- * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+ * @param Environment $env
*
- * @return array
+ * @return Environment[]
+ *
+ * @phpstan-return non-empty-array
*/
protected function compactEnv(Environment $env)
{
@@ -4082,9 +5070,11 @@ class Compiler
/**
* Convert env stack to singly linked list
*
- * @param array $envs
+ * @param Environment[] $envs
*
- * @return \ScssPhp\ScssPhp\Compiler\Environment
+ * @return Environment
+ *
+ * @phpstan-param non-empty-array $envs
*/
protected function extractEnv($envs)
{
@@ -4105,25 +5095,47 @@ class Compiler
*/
protected function pushEnv(Block $block = null)
{
- $env = new Environment;
+ $env = new Environment();
$env->parent = $this->env;
+ $env->parentStore = $this->storeEnv;
$env->store = [];
$env->block = $block;
$env->depth = isset($this->env->depth) ? $this->env->depth + 1 : 0;
$this->env = $env;
+ $this->storeEnv = null;
return $env;
}
/**
* Pop environment
+ *
+ * @return void
*/
protected function popEnv()
{
+ $this->storeEnv = $this->env->parentStore;
$this->env = $this->env->parent;
}
+ /**
+ * Propagate vars from a just poped Env (used in @each and @for)
+ *
+ * @param array $store
+ * @param null|string[] $excludedVars
+ *
+ * @return void
+ */
+ protected function backPropagateEnv($store, $excludedVars = null)
+ {
+ foreach ($store as $key => $value) {
+ if (empty($excludedVars) || ! \in_array($key, $excludedVars)) {
+ $this->set($key, $value, true);
+ }
+ }
+ }
+
/**
* Get store environment
*
@@ -4139,9 +5151,11 @@ class Compiler
*
* @param string $name
* @param mixed $value
- * @param boolean $shadow
+ * @param bool $shadow
* @param \ScssPhp\ScssPhp\Compiler\Environment $env
* @param mixed $valueUnreduced
+ *
+ * @return void
*/
protected function set($name, $value, $shadow = false, Environment $env = null, $valueUnreduced = null)
{
@@ -4165,29 +5179,50 @@ class Compiler
* @param mixed $value
* @param \ScssPhp\ScssPhp\Compiler\Environment $env
* @param mixed $valueUnreduced
+ *
+ * @return void
*/
protected function setExisting($name, $value, Environment $env, $valueUnreduced = null)
{
$storeEnv = $env;
+ $specialContentKey = static::$namespaces['special'] . 'content';
$hasNamespace = $name[0] === '^' || $name[0] === '@' || $name[0] === '%';
+ $maxDepth = 10000;
+
for (;;) {
- if (array_key_exists($name, $env->store)) {
+ if ($maxDepth-- <= 0) {
+ break;
+ }
+
+ if (\array_key_exists($name, $env->store)) {
break;
}
if (! $hasNamespace && isset($env->marker)) {
+ if (! empty($env->store[$specialContentKey])) {
+ $env = $env->store[$specialContentKey]->scope;
+ continue;
+ }
+
+ if (! empty($env->declarationScopeParent)) {
+ $env = $env->declarationScopeParent;
+ continue;
+ } else {
+ $env = $storeEnv;
+ break;
+ }
+ }
+
+ if (isset($env->parentStore)) {
+ $env = $env->parentStore;
+ } elseif (isset($env->parent)) {
+ $env = $env->parent;
+ } else {
$env = $storeEnv;
break;
}
-
- if (! isset($env->parent)) {
- $env = $storeEnv;
- break;
- }
-
- $env = $env->parent;
}
$env->store[$name] = $value;
@@ -4204,6 +5239,8 @@ class Compiler
* @param mixed $value
* @param \ScssPhp\ScssPhp\Compiler\Environment $env
* @param mixed $valueUnreduced
+ *
+ * @return void
*/
protected function setRaw($name, $value, Environment $env, $valueUnreduced = null)
{
@@ -4217,12 +5254,12 @@ class Compiler
/**
* Get variable
*
- * @api
+ * @internal
*
* @param string $name
- * @param boolean $shouldThrow
+ * @param bool $shouldThrow
* @param \ScssPhp\ScssPhp\Compiler\Environment $env
- * @param boolean $unreduced
+ * @param bool $unreduced
*
* @return mixed|null
*/
@@ -4244,7 +5281,7 @@ class Compiler
break;
}
- if (array_key_exists($normalizedName, $env->store)) {
+ if (\array_key_exists($normalizedName, $env->store)) {
if ($unreduced && isset($env->storeUnreduced[$normalizedName])) {
return $env->storeUnreduced[$normalizedName];
}
@@ -4266,15 +5303,17 @@ class Compiler
continue;
}
- if (! isset($env->parent)) {
+ if (isset($env->parentStore)) {
+ $env = $env->parentStore;
+ } elseif (isset($env->parent)) {
+ $env = $env->parent;
+ } else {
break;
}
-
- $env = $env->parent;
}
if ($shouldThrow) {
- $this->throwError("Undefined variable \$$name" . ($maxDepth <= 0 ? " (infinite recursion)" : ""));
+ throw $this->error("Undefined variable \$$name" . ($maxDepth <= 0 ? ' (infinite recursion)' : ''));
}
// found nothing
@@ -4287,17 +5326,19 @@ class Compiler
* @param string $name
* @param \ScssPhp\ScssPhp\Compiler\Environment $env
*
- * @return boolean
+ * @return bool
*/
protected function has($name, Environment $env = null)
{
- return ! is_null($this->get($name, false, $env));
+ return ! \is_null($this->get($name, false, $env));
}
/**
* Inject variables
*
* @param array $args
+ *
+ * @return void
*/
protected function injectVariables(array $args)
{
@@ -4312,7 +5353,7 @@ class Compiler
$name = substr($name, 1);
}
- if (! $parser->parseValue($strValue, $value)) {
+ if (!\is_string($strValue) || ! $parser->parseValue($strValue, $value)) {
$value = $this->coerceValue($strValue);
}
@@ -4320,16 +5361,59 @@ class Compiler
}
}
+ /**
+ * Replaces variables.
+ *
+ * @param array $variables
+ *
+ * @return void
+ */
+ public function replaceVariables(array $variables)
+ {
+ $this->registeredVars = [];
+ $this->addVariables($variables);
+ }
+
+ /**
+ * Replaces variables.
+ *
+ * @param array $variables
+ *
+ * @return void
+ */
+ public function addVariables(array $variables)
+ {
+ $triggerWarning = false;
+
+ foreach ($variables as $name => $value) {
+ if (!$value instanceof Number && !\is_array($value)) {
+ $triggerWarning = true;
+ }
+
+ $this->registeredVars[$name] = $value;
+ }
+
+ if ($triggerWarning) {
+ @trigger_error('Passing raw values to as custom variables to the Compiler is deprecated. Use "\ScssPhp\ScssPhp\ValueConverter::parseValue" or "\ScssPhp\ScssPhp\ValueConverter::fromPhp" to convert them instead.', E_USER_DEPRECATED);
+ }
+ }
+
/**
* Set variables
*
* @api
*
* @param array $variables
+ *
+ * @return void
+ *
+ * @deprecated Use "addVariables" or "replaceVariables" instead.
*/
public function setVariables(array $variables)
{
- $this->registeredVars = array_merge($this->registeredVars, $variables);
+ @trigger_error('The method "setVariables" of the Compiler is deprecated. Use the "addVariables" method for the equivalent behavior or "replaceVariables" if merging with previous variables was not desired.');
+
+ $this->addVariables($variables);
}
/**
@@ -4338,6 +5422,8 @@ class Compiler
* @api
*
* @param string $name
+ *
+ * @return void
*/
public function unsetVariable($name)
{
@@ -4359,13 +5445,15 @@ class Compiler
/**
* Adds to list of parsed files
*
- * @api
+ * @internal
*
- * @param string $path
+ * @param string|null $path
+ *
+ * @return void
*/
public function addParsedFile($path)
{
- if (isset($path) && is_file($path)) {
+ if (! \is_null($path) && is_file($path)) {
$this->parsedFiles[realpath($path)] = filemtime($path);
}
}
@@ -4373,12 +5461,12 @@ class Compiler
/**
* Returns list of parsed files
*
- * @api
- *
- * @return array
+ * @deprecated
+ * @return array
*/
public function getParsedFiles()
{
+ @trigger_error('The method "getParsedFiles" of the Compiler is deprecated. Use the "getIncludedFiles" method on the CompilationResult instance returned by compileString() instead. Be careful that the signature of the method is different.', E_USER_DEPRECATED);
return $this->parsedFiles;
}
@@ -4388,10 +5476,12 @@ class Compiler
* @api
*
* @param string|callable $path
+ *
+ * @return void
*/
public function addImportPath($path)
{
- if (! in_array($path, $this->importPaths)) {
+ if (! \in_array($path, $this->importPaths)) {
$this->importPaths[] = $path;
}
}
@@ -4401,11 +5491,24 @@ class Compiler
*
* @api
*
- * @param string|array $path
+ * @param string|array $path
+ *
+ * @return void
*/
public function setImportPaths($path)
{
- $this->importPaths = (array) $path;
+ $paths = (array) $path;
+ $actualImportPaths = array_filter($paths, function ($path) {
+ return $path !== '';
+ });
+
+ $this->legacyCwdImportPath = \count($actualImportPaths) !== \count($paths);
+
+ if ($this->legacyCwdImportPath) {
+ @trigger_error('Passing an empty string in the import paths to refer to the current working directory is deprecated. If that\'s the intended behavior, the value of "getcwd()" should be used directly instead. If this was used for resolving relative imports of the input alongside "chdir" with the source directory, the path of the input file should be passed to "compileString()" instead.', E_USER_DEPRECATED);
+ }
+
+ $this->importPaths = $actualImportPaths;
}
/**
@@ -4413,11 +5516,43 @@ class Compiler
*
* @api
*
- * @param integer $numberPrecision
+ * @param int $numberPrecision
+ *
+ * @return void
+ *
+ * @deprecated The number precision is not configurable anymore. The default is enough for all browsers.
*/
public function setNumberPrecision($numberPrecision)
{
- Node\Number::$precision = $numberPrecision;
+ @trigger_error('The number precision is not configurable anymore. '
+ . 'The default is enough for all browsers.', E_USER_DEPRECATED);
+ }
+
+ /**
+ * Sets the output style.
+ *
+ * @api
+ *
+ * @param string $style One of the OutputStyle constants
+ *
+ * @return void
+ *
+ * @phpstan-param OutputStyle::* $style
+ */
+ public function setOutputStyle($style)
+ {
+ switch ($style) {
+ case OutputStyle::EXPANDED:
+ $this->configuredFormatter = Expanded::class;
+ break;
+
+ case OutputStyle::COMPRESSED:
+ $this->configuredFormatter = Compressed::class;
+ break;
+
+ default:
+ throw new \InvalidArgumentException(sprintf('Invalid output style "%s".', $style));
+ }
}
/**
@@ -4426,10 +5561,21 @@ class Compiler
* @api
*
* @param string $formatterName
+ *
+ * @return void
+ *
+ * @deprecated Use {@see setOutputStyle} instead.
+ *
+ * @phpstan-param class-string $formatterName
*/
public function setFormatter($formatterName)
{
- $this->formatter = $formatterName;
+ if (!\in_array($formatterName, [Expanded::class, Compressed::class], true)) {
+ @trigger_error('Formatters other than Expanded and Compressed are deprecated.', E_USER_DEPRECATED);
+ }
+ @trigger_error('The method "setFormatter" is deprecated. Use "setOutputStyle" instead.', E_USER_DEPRECATED);
+
+ $this->configuredFormatter = $formatterName;
}
/**
@@ -4438,10 +5584,34 @@ class Compiler
* @api
*
* @param string $lineNumberStyle
+ *
+ * @return void
+ *
+ * @deprecated The line number output is not supported anymore. Use source maps instead.
*/
public function setLineNumberStyle($lineNumberStyle)
{
- $this->lineNumberStyle = $lineNumberStyle;
+ @trigger_error('The line number output is not supported anymore. '
+ . 'Use source maps instead.', E_USER_DEPRECATED);
+ }
+
+ /**
+ * Configures the handling of non-ASCII outputs.
+ *
+ * If $charset is `true`, this will include a `@charset` declaration or a
+ * UTF-8 [byte-order mark][] if the stylesheet contains any non-ASCII
+ * characters. Otherwise, it will never include a `@charset` declaration or a
+ * byte-order mark.
+ *
+ * [byte-order mark]: https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8
+ *
+ * @param bool $charset
+ *
+ * @return void
+ */
+ public function setCharset($charset)
+ {
+ $this->charset = $charset;
}
/**
@@ -4449,7 +5619,11 @@ class Compiler
*
* @api
*
- * @param integer $sourceMap
+ * @param int $sourceMap
+ *
+ * @return void
+ *
+ * @phpstan-param self::SOURCE_MAP_* $sourceMap
*/
public function setSourceMap($sourceMap)
{
@@ -4462,6 +5636,10 @@ class Compiler
* @api
*
* @param array $sourceMapOptions
+ *
+ * @phpstan-param array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} $sourceMapOptions
+ *
+ * @return void
*/
public function setSourceMapOptions($sourceMapOptions)
{
@@ -4473,13 +5651,23 @@ class Compiler
*
* @api
*
- * @param string $name
- * @param callable $func
- * @param array $prototype
+ * @param string $name
+ * @param callable $callback
+ * @param string[]|null $argumentDeclaration
+ *
+ * @return void
*/
- public function registerFunction($name, $func, $prototype = null)
+ public function registerFunction($name, $callback, $argumentDeclaration = null)
{
- $this->userFunctions[$this->normalizeName($name)] = [$func, $prototype];
+ if (self::isNativeFunction($name)) {
+ @trigger_error(sprintf('The "%s" function is a core sass function. Overriding it with a custom implementation through "%s" is deprecated and won\'t be supported in ScssPhp 2.0 anymore.', $name, __METHOD__), E_USER_DEPRECATED);
+ }
+
+ if ($argumentDeclaration === null) {
+ @trigger_error('Omitting the argument declaration when registering custom function is deprecated and won\'t be supported in ScssPhp 2.0 anymore.', E_USER_DEPRECATED);
+ }
+
+ $this->userFunctions[$this->normalizeName($name)] = [$callback, $argumentDeclaration];
}
/**
@@ -4488,6 +5676,8 @@ class Compiler
* @api
*
* @param string $name
+ *
+ * @return void
*/
public function unregisterFunction($name)
{
@@ -4500,9 +5690,15 @@ class Compiler
* @api
*
* @param string $name
+ *
+ * @return void
+ *
+ * @deprecated Registering additional features is deprecated.
*/
public function addFeature($name)
{
+ @trigger_error('Registering additional features is deprecated.', E_USER_DEPRECATED);
+
$this->registeredFeatures[$name] = true;
}
@@ -4511,12 +5707,28 @@ class Compiler
*
* @param string $path
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+ *
+ * @return void
*/
protected function importFile($path, OutputBlock $out)
{
+ $this->pushCallStack('import ' . $this->getPrettyPath($path));
// see if tree is cached
$realPath = realpath($path);
+ if ($realPath === false) {
+ $realPath = $path;
+ }
+
+ if (substr($path, -5) === '.sass') {
+ $this->sourceIndex = \count($this->sourceNames);
+ $this->sourceNames[] = $path;
+ $this->sourceLine = 1;
+ $this->sourceColumn = 1;
+
+ throw $this->error('The Sass indented syntax is not implemented.');
+ }
+
if (isset($this->importCache[$realPath])) {
$this->handleImportLoop($realPath);
@@ -4529,62 +5741,261 @@ class Compiler
$this->importCache[$realPath] = $tree;
}
- $pi = pathinfo($path);
+ $currentDirectory = $this->currentDirectory;
+ $this->currentDirectory = dirname($path);
- array_unshift($this->importPaths, $pi['dirname']);
$this->compileChildrenNoReturn($tree->children, $out);
- array_shift($this->importPaths);
+ $this->currentDirectory = $currentDirectory;
+ $this->popCallStack();
+ }
+
+ /**
+ * Save the imported files with their resolving path context
+ *
+ * @param string|null $currentDirectory
+ * @param string $path
+ * @param string $filePath
+ *
+ * @return void
+ */
+ private function registerImport($currentDirectory, $path, $filePath)
+ {
+ $this->resolvedImports[] = ['currentDir' => $currentDirectory, 'path' => $path, 'filePath' => $filePath];
+ }
+
+ /**
+ * Detects whether the import is a CSS import.
+ *
+ * For legacy reasons, custom importers are called for those, allowing them
+ * to replace them with an actual Sass import. However this behavior is
+ * deprecated. Custom importers are expected to return null when they receive
+ * a CSS import.
+ *
+ * @param string $url
+ *
+ * @return bool
+ */
+ public static function isCssImport($url)
+ {
+ return 1 === preg_match('~\.css$|^https?://|^//~', $url);
}
/**
* Return the file path for an import url if it exists
*
- * @api
+ * @internal
*
- * @param string $url
+ * @param string $url
+ * @param string|null $currentDir
*
* @return string|null
*/
- public function findImport($url)
+ public function findImport($url, $currentDir = null)
{
- $urls = [];
+ // Vanilla css and external requests. These are not meant to be Sass imports.
+ // Callback importers are still called for BC.
+ if (self::isCssImport($url)) {
+ foreach ($this->importPaths as $dir) {
+ if (\is_string($dir)) {
+ continue;
+ }
- // for "normal" scss imports (ignore vanilla css and external requests)
- if (! preg_match('~\.css$|^https?://~', $url)) {
- // try both normal and the _partial filename
- $urls = [$url, preg_replace('~[^/]+$~', '_\0', $url)];
- }
+ if (\is_callable($dir)) {
+ // check custom callback for import path
+ $file = \call_user_func($dir, $url);
- $hasExtension = preg_match('/[.]s?css$/', $url);
+ if (! \is_null($file)) {
+ if (\is_array($dir)) {
+ $callableDescription = (\is_object($dir[0]) ? \get_class($dir[0]) : $dir[0]).'::'.$dir[1];
+ } elseif ($dir instanceof \Closure) {
+ $r = new \ReflectionFunction($dir);
+ if (false !== strpos($r->name, '{closure}')) {
+ $callableDescription = sprintf('closure{%s:%s}', $r->getFileName(), $r->getStartLine());
+ } elseif ($class = $r->getClosureScopeClass()) {
+ $callableDescription = $class->name.'::'.$r->name;
+ } else {
+ $callableDescription = $r->name;
+ }
+ } elseif (\is_object($dir)) {
+ $callableDescription = \get_class($dir) . '::__invoke';
+ } else {
+ $callableDescription = 'callable'; // Fallback if we don't have a dedicated description
+ }
+ @trigger_error(sprintf('Returning a file to import for CSS or external references in custom importer callables is deprecated and will not be supported anymore in ScssPhp 2.0. This behavior is not compliant with the Sass specification. Update your "%s" importer.', $callableDescription), E_USER_DEPRECATED);
- foreach ($this->importPaths as $dir) {
- if (is_string($dir)) {
- // check urls for normal import paths
- foreach ($urls as $full) {
- $separator = (
- ! empty($dir) &&
- substr($dir, -1) !== '/' &&
- substr($full, 0, 1) !== '/'
- ) ? '/' : '';
- $full = $dir . $separator . $full;
-
- if (is_file($file = $full . '.scss') ||
- ($hasExtension && is_file($file = $full))
- ) {
return $file;
}
}
- } elseif (is_callable($dir)) {
- // check custom callback for import path
- $file = call_user_func($dir, $url);
+ }
+ return null;
+ }
- if (! is_null($file)) {
+ if (!\is_null($currentDir)) {
+ $relativePath = $this->resolveImportPath($url, $currentDir);
+
+ if (!\is_null($relativePath)) {
+ return $relativePath;
+ }
+ }
+
+ foreach ($this->importPaths as $dir) {
+ if (\is_string($dir)) {
+ $path = $this->resolveImportPath($url, $dir);
+
+ if (!\is_null($path)) {
+ return $path;
+ }
+ } elseif (\is_callable($dir)) {
+ // check custom callback for import path
+ $file = \call_user_func($dir, $url);
+
+ if (! \is_null($file)) {
return $file;
}
}
}
- return null;
+ if ($this->legacyCwdImportPath) {
+ $path = $this->resolveImportPath($url, getcwd());
+
+ if (!\is_null($path)) {
+ @trigger_error('Resolving imports relatively to the current working directory is deprecated. If that\'s the intended behavior, the value of "getcwd()" should be added as an import path explicitly instead. If this was used for resolving relative imports of the input alongside "chdir" with the source directory, the path of the input file should be passed to "compileString()" instead.', E_USER_DEPRECATED);
+
+ return $path;
+ }
+ }
+
+ throw $this->error("`$url` file not found for @import");
+ }
+
+ /**
+ * @param string $url
+ * @param string $baseDir
+ *
+ * @return string|null
+ */
+ private function resolveImportPath($url, $baseDir)
+ {
+ $path = Path::join($baseDir, $url);
+
+ $hasExtension = preg_match('/.s[ac]ss$/', $url);
+
+ if ($hasExtension) {
+ return $this->checkImportPathConflicts($this->tryImportPath($path));
+ }
+
+ $result = $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path));
+
+ if (!\is_null($result)) {
+ return $result;
+ }
+
+ return $this->tryImportPathAsDirectory($path);
+ }
+
+ /**
+ * @param string[] $paths
+ *
+ * @return string|null
+ */
+ private function checkImportPathConflicts(array $paths)
+ {
+ if (\count($paths) === 0) {
+ return null;
+ }
+
+ if (\count($paths) === 1) {
+ return $paths[0];
+ }
+
+ $formattedPrettyPaths = [];
+
+ foreach ($paths as $path) {
+ $formattedPrettyPaths[] = ' ' . $this->getPrettyPath($path);
+ }
+
+ throw $this->error("It's not clear which file to import. Found:\n" . implode("\n", $formattedPrettyPaths));
+ }
+
+ /**
+ * @param string $path
+ *
+ * @return string[]
+ */
+ private function tryImportPathWithExtensions($path)
+ {
+ $result = array_merge(
+ $this->tryImportPath($path.'.sass'),
+ $this->tryImportPath($path.'.scss')
+ );
+
+ if ($result) {
+ return $result;
+ }
+
+ return $this->tryImportPath($path.'.css');
+ }
+
+ /**
+ * @param string $path
+ *
+ * @return string[]
+ */
+ private function tryImportPath($path)
+ {
+ $partial = dirname($path).'/_'.basename($path);
+
+ $candidates = [];
+
+ if (is_file($partial)) {
+ $candidates[] = $partial;
+ }
+
+ if (is_file($path)) {
+ $candidates[] = $path;
+ }
+
+ return $candidates;
+ }
+
+ /**
+ * @param string $path
+ *
+ * @return string|null
+ */
+ private function tryImportPathAsDirectory($path)
+ {
+ if (!is_dir($path)) {
+ return null;
+ }
+
+ return $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path.'/index'));
+ }
+
+ /**
+ * @param string|null $path
+ *
+ * @return string
+ */
+ private function getPrettyPath($path)
+ {
+ if ($path === null) {
+ return '(unknown file)';
+ }
+
+ $normalizedPath = $path;
+ $normalizedRootDirectory = $this->rootDirectory.'/';
+
+ if (\DIRECTORY_SEPARATOR === '\\') {
+ $normalizedRootDirectory = str_replace('\\', '/', $normalizedRootDirectory);
+ $normalizedPath = str_replace('\\', '/', $path);
+ }
+
+ if (0 === strpos($normalizedPath, $normalizedRootDirectory)) {
+ return substr($path, \strlen($normalizedRootDirectory));
+ }
+
+ return $path;
}
/**
@@ -4592,10 +6003,20 @@ class Compiler
*
* @api
*
- * @param string $encoding
+ * @param string|null $encoding
+ *
+ * @return void
+ *
+ * @deprecated Non-compliant support for other encodings than UTF-8 is deprecated.
*/
public function setEncoding($encoding)
{
+ if (!$encoding || strtolower($encoding) === 'utf-8') {
+ @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED);
+ } else {
+ @trigger_error(sprintf('The "%s" method is deprecated. Parsing will only support UTF-8 in ScssPhp 2.0. The non-UTF-8 parsing of ScssPhp 1.x is not spec compliant.', __METHOD__), E_USER_DEPRECATED);
+ }
+
$this->encoding = $encoding;
}
@@ -4604,17 +6025,37 @@ class Compiler
*
* @api
*
- * @param boolean $ignoreErrors
+ * @param bool $ignoreErrors
*
* @return \ScssPhp\ScssPhp\Compiler
+ *
+ * @deprecated Ignoring Sass errors is not longer supported.
*/
public function setIgnoreErrors($ignoreErrors)
{
- $this->ignoreErrors = $ignoreErrors;
+ @trigger_error('Ignoring Sass errors is not longer supported.', E_USER_DEPRECATED);
return $this;
}
+ /**
+ * Get source position
+ *
+ * @api
+ *
+ * @return array
+ *
+ * @deprecated
+ */
+ public function getSourcePosition()
+ {
+ @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED);
+
+ $sourceFile = isset($this->sourceNames[$this->sourceIndex]) ? $this->sourceNames[$this->sourceIndex] : '';
+
+ return [$sourceFile, $this->sourceLine, $this->sourceColumn];
+ }
+
/**
* Throw error (exception)
*
@@ -4622,24 +6063,58 @@ class Compiler
*
* @param string $msg Message with optional sprintf()-style vararg parameters
*
+ * @return never
+ *
* @throws \ScssPhp\ScssPhp\Exception\CompilerException
+ *
+ * @deprecated use "error" and throw the exception in the caller instead.
*/
public function throwError($msg)
{
- if ($this->ignoreErrors) {
- return;
+ @trigger_error(
+ 'The method "throwError" is deprecated. Use "error" and throw the exception in the caller instead',
+ E_USER_DEPRECATED
+ );
+
+ throw $this->error(...func_get_args());
+ }
+
+ /**
+ * Build an error (exception)
+ *
+ * @internal
+ *
+ * @param string $msg Message with optional sprintf()-style vararg parameters
+ * @param bool|float|int|string|null ...$args
+ *
+ * @return CompilerException
+ */
+ public function error($msg, ...$args)
+ {
+ if ($args) {
+ $msg = sprintf($msg, ...$args);
}
+ if (! $this->ignoreCallStackMessage) {
+ $msg = $this->addLocationToMessage($msg);
+ }
+
+ return new CompilerException($msg);
+ }
+
+ /**
+ * @param string $msg
+ *
+ * @return string
+ */
+ private function addLocationToMessage($msg)
+ {
$line = $this->sourceLine;
$column = $this->sourceColumn;
$loc = isset($this->sourceNames[$this->sourceIndex])
- ? $this->sourceNames[$this->sourceIndex] . " on line $line, at column $column"
- : "line: $line, column: $column";
-
- if (func_num_args() > 1) {
- $msg = call_user_func_array('sprintf', func_get_args());
- }
+ ? $this->getPrettyPath($this->sourceNames[$this->sourceIndex]) . " on line $line, at column $column"
+ : "line: $line, column: $column";
$msg = "$msg: $loc";
@@ -4649,14 +6124,51 @@ class Compiler
$msg .= "\nCall Stack:\n" . $callStackMsg;
}
- throw new CompilerException($msg);
+ return $msg;
+ }
+
+ /**
+ * @param string $functionName
+ * @param array $ExpectedArgs
+ * @param int $nbActual
+ * @return CompilerException
+ *
+ * @deprecated
+ */
+ public function errorArgsNumber($functionName, $ExpectedArgs, $nbActual)
+ {
+ @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED);
+
+ $nbExpected = \count($ExpectedArgs);
+
+ if ($nbActual > $nbExpected) {
+ return $this->error(
+ 'Error: Only %d arguments allowed in %s(), but %d were passed.',
+ $nbExpected,
+ $functionName,
+ $nbActual
+ );
+ } else {
+ $missing = [];
+
+ while (count($ExpectedArgs) && count($ExpectedArgs) > $nbActual) {
+ array_unshift($missing, array_pop($ExpectedArgs));
+ }
+
+ return $this->error(
+ 'Error: %s() argument%s %s missing.',
+ $functionName,
+ count($missing) > 1 ? 's' : '',
+ implode(', ', $missing)
+ );
+ }
}
/**
* Beautify call stack for output
*
- * @param boolean $all
- * @param null $limit
+ * @param bool $all
+ * @param int|null $limit
*
* @return string
*/
@@ -4668,15 +6180,15 @@ class Compiler
if ($this->callStack) {
foreach (array_reverse($this->callStack) as $call) {
if ($all || (isset($call['n']) && $call['n'])) {
- $msg = "#" . $ncall++ . " " . $call['n'] . " ";
+ $msg = '#' . $ncall++ . ' ' . $call['n'] . ' ';
$msg .= (isset($this->sourceNames[$call[Parser::SOURCE_INDEX]])
- ? $this->sourceNames[$call[Parser::SOURCE_INDEX]]
+ ? $this->getPrettyPath($this->sourceNames[$call[Parser::SOURCE_INDEX]])
: '(unknown file)');
- $msg .= " on line " . $call[Parser::SOURCE_LINE];
+ $msg .= ' on line ' . $call[Parser::SOURCE_LINE];
$callStackMsg[] = $msg;
- if (! is_null($limit) && $ncall > $limit) {
+ if (! \is_null($limit) && $ncall > $limit) {
break;
}
}
@@ -4691,6 +6203,8 @@ class Compiler
*
* @param string $name
*
+ * @return void
+ *
* @throws \Exception
*/
protected function handleImportLoop($name)
@@ -4702,9 +6216,12 @@ class Compiler
$file = $this->sourceNames[$env->block->sourceIndex];
+ if ($file === null) {
+ continue;
+ }
+
if (realpath($file) === $name) {
- $this->throwError('An @import loop has been found: %s imports %s', $file, basename($file));
- break;
+ throw $this->error('An @import loop has been found: %s imports %s', $file, basename($file));
}
}
}
@@ -4712,100 +6229,86 @@ class Compiler
/**
* Call SCSS @function
*
- * @param string $name
- * @param array $argValues
- * @param array $returnValue
+ * @param CallableBlock|null $func
+ * @param array $argValues
*
- * @return boolean Returns true if returnValue is set; otherwise, false
+ * @return array|Number
*/
- protected function callScssFunction($name, $argValues, &$returnValue)
+ protected function callScssFunction($func, $argValues)
{
- $func = $this->get(static::$namespaces['function'] . $name, false);
-
if (! $func) {
- return false;
+ return static::$defaultValue;
}
+ $name = $func->name;
$this->pushEnv();
- $storeEnv = $this->storeEnv;
- $this->storeEnv = $this->env;
-
// set the args
if (isset($func->args)) {
$this->applyArguments($func->args, $argValues);
}
// throw away lines and children
- $tmp = new OutputBlock;
+ $tmp = new OutputBlock();
$tmp->lines = [];
$tmp->children = [];
$this->env->marker = 'function';
+
if (! empty($func->parentEnv)) {
$this->env->declarationScopeParent = $func->parentEnv;
} else {
- $this->throwError("@function $name() without parentEnv");
+ throw $this->error("@function $name() without parentEnv");
}
- $ret = $this->compileChildren($func->children, $tmp, $this->env->marker . " " . $name);
-
- $this->storeEnv = $storeEnv;
+ $ret = $this->compileChildren($func->children, $tmp, $this->env->marker . ' ' . $name);
$this->popEnv();
- $returnValue = ! isset($ret) ? static::$defaultValue : $ret;
-
- return true;
+ return ! isset($ret) ? static::$defaultValue : $ret;
}
/**
* Call built-in and registered (PHP) functions
*
* @param string $name
+ * @param callable $function
+ * @param array $prototype
* @param array $args
- * @param array $returnValue
*
- * @return boolean Returns true if returnValue is set; otherwise, false
+ * @return array|Number|null
*/
- protected function callNativeFunction($name, $args, &$returnValue)
+ protected function callNativeFunction($name, $function, $prototype, $args)
{
- // try a lib function
- $name = $this->normalizeName($name);
+ $libName = (is_array($function) ? end($function) : null);
+ $sorted_kwargs = $this->sortNativeFunctionArgs($libName, $prototype, $args);
- if (isset($this->userFunctions[$name])) {
- // see if we can find a user function
- list($f, $prototype) = $this->userFunctions[$name];
- } elseif (($f = $this->getBuiltinFunction($name)) && is_callable($f)) {
- $libName = $f[1];
- $prototype = isset(static::$$libName) ? static::$$libName : null;
- } else {
- return false;
+ if (\is_null($sorted_kwargs)) {
+ return null;
}
+ @list($sorted, $kwargs) = $sorted_kwargs;
- @list($sorted, $kwargs) = $this->sortNativeFunctionArgs($libName, $prototype, $args);
-
- if ($name !== 'if' && $name !== 'call') {
- $inExp = true;
-
- if ($name === 'join') {
- $inExp = false;
- }
-
+ if ($name !== 'if') {
foreach ($sorted as &$val) {
- $val = $this->reduce($val, $inExp);
+ if ($val !== null) {
+ $val = $this->reduce($val, true);
+ }
}
}
- $returnValue = call_user_func($f, $sorted, $kwargs);
+ $returnValue = \call_user_func($function, $sorted, $kwargs);
if (! isset($returnValue)) {
- return false;
+ return null;
}
- $returnValue = $this->coerceValue($returnValue);
+ if (\is_array($returnValue) || $returnValue instanceof Number) {
+ return $returnValue;
+ }
- return true;
+ @trigger_error(sprintf('Returning a PHP value from the "%s" custom function is deprecated. A sass value must be returned instead.', $name), E_USER_DEPRECATED);
+
+ return $this->coerceValue($returnValue);
}
/**
@@ -4817,6 +6320,22 @@ class Compiler
*/
protected function getBuiltinFunction($name)
{
+ $libName = self::normalizeNativeFunctionName($name);
+ return [$this, $libName];
+ }
+
+ /**
+ * Normalize native function name
+ *
+ * @internal
+ *
+ * @param string $name
+ *
+ * @return string
+ */
+ public static function normalizeNativeFunctionName($name)
+ {
+ $name = str_replace("-", "_", $name);
$libName = 'lib' . preg_replace_callback(
'/_(.)/',
function ($m) {
@@ -4824,18 +6343,31 @@ class Compiler
},
ucfirst($name)
);
+ return $libName;
+ }
- return [$this, $libName];
+ /**
+ * Check if a function is a native built-in scss function, for css parsing
+ *
+ * @internal
+ *
+ * @param string $name
+ *
+ * @return bool
+ */
+ public static function isNativeFunction($name)
+ {
+ return method_exists(Compiler::class, self::normalizeNativeFunctionName($name));
}
/**
* Sorts keyword arguments
*
* @param string $functionName
- * @param array $prototypes
+ * @param array|null $prototypes
* @param array $args
*
- * @return array
+ * @return array|null
*/
protected function sortNativeFunctionArgs($functionName, $prototypes, $args)
{
@@ -4845,16 +6377,18 @@ class Compiler
$keyArgs = [];
$posArgs = [];
+ if (\is_array($args) && \count($args) && \end($args) === static::$null) {
+ array_pop($args);
+ }
+
// separate positional and keyword arguments
foreach ($args as $arg) {
list($key, $value) = $arg;
- $key = $key[1];
-
- if (empty($key)) {
+ if (empty($key) or empty($key[1])) {
$posArgs[] = empty($arg[2]) ? $value : $arg;
} else {
- $keyArgs[$key] = $value;
+ $keyArgs[$key[1]] = $value;
}
}
@@ -4862,209 +6396,359 @@ class Compiler
}
// specific cases ?
- if (in_array($functionName, ['libRgb', 'libRgba', 'libHsl', 'libHsla'])) {
+ if (\in_array($functionName, ['libRgb', 'libRgba', 'libHsl', 'libHsla'])) {
// notation 100 127 255 / 0 is in fact a simple list of 4 values
foreach ($args as $k => $arg) {
- if ($arg[1][0] === Type::T_LIST && count($arg[1][2]) === 3) {
- $last = end($arg[1][2]);
-
- if ($last[0] === Type::T_EXPRESSION && $last[1] === '/') {
- array_pop($arg[1][2]);
- $arg[1][2][] = $last[2];
- $arg[1][2][] = $last[3];
- $args[$k] = $arg;
- }
+ if (!isset($arg[1])) {
+ continue; // This happens when using a trailing comma
+ }
+ if ($arg[1][0] === Type::T_LIST && \count($arg[1][2]) === 3) {
+ $args[$k][1][2] = $this->extractSlashAlphaInColorFunction($arg[1][2]);
}
}
}
- $finalArgs = [];
+ list($positionalArgs, $namedArgs, $names, $separator, $hasSplat) = $this->evaluateArguments($args, false);
- if (! is_array(reset($prototypes))) {
+ if (! \is_array(reset($prototypes))) {
$prototypes = [$prototypes];
}
+ $parsedPrototypes = array_map([$this, 'parseFunctionPrototype'], $prototypes);
+ assert(!empty($parsedPrototypes));
+ $matchedPrototype = $this->selectFunctionPrototype($parsedPrototypes, \count($positionalArgs), $names);
+
+ $this->verifyPrototype($matchedPrototype, \count($positionalArgs), $names, $hasSplat);
+
+ $vars = $this->applyArgumentsToDeclaration($matchedPrototype, $positionalArgs, $namedArgs, $separator);
+
+ $finalArgs = [];
$keyArgs = [];
- // trying each prototypes
- $prototypeHasMatch = false;
- $exceptionMessage = '';
+ foreach ($matchedPrototype['arguments'] as $argument) {
+ list($normalizedName, $originalName, $default) = $argument;
- foreach ($prototypes as $prototype) {
- $argDef = [];
-
- foreach ($prototype as $i => $p) {
- $default = null;
- $p = explode(':', $p, 2);
- $name = array_shift($p);
-
- if (count($p)) {
- $p = trim(reset($p));
-
- if ($p === 'null') {
- // differentiate this null from the static::$null
- $default = [Type::T_KEYWORD, 'null'];
- } else {
- if (is_null($parser)) {
- $parser = $this->parserFactory(__METHOD__);
- }
-
- $parser->parseValue($p, $default);
- }
- }
-
- $isVariable = false;
-
- if (substr($name, -3) === '...') {
- $isVariable = true;
- $name = substr($name, 0, -3);
- }
-
- $argDef[] = [$name, $default, $isVariable];
+ if (isset($vars[$normalizedName])) {
+ $value = $vars[$normalizedName];
+ } else {
+ $value = $default;
}
- try {
- $vars = $this->applyArguments($argDef, $args, false, false);
-
- // ensure all args are populated
- foreach ($prototype as $i => $p) {
- $name = explode(':', $p)[0];
-
- if (! isset($finalArgs[$i])) {
- $finalArgs[$i] = null;
- }
- }
-
- // apply positional args
- foreach (array_values($vars) as $i => $val) {
- $finalArgs[$i] = $val;
- }
-
- $keyArgs = array_merge($keyArgs, $vars);
- $prototypeHasMatch = true;
-
- // overwrite positional args with keyword args
- foreach ($prototype as $i => $p) {
- $name = explode(':', $p)[0];
-
- if (isset($keyArgs[$name])) {
- $finalArgs[$i] = $keyArgs[$name];
- }
-
- // special null value as default: translate to real null here
- if ($finalArgs[$i] === [Type::T_KEYWORD, 'null']) {
- $finalArgs[$i] = null;
- }
- }
- // should we break if this prototype seems fulfilled?
- } catch (CompilerException $e) {
- $exceptionMessage = $e->getMessage();
+ // special null value as default: translate to real null here
+ if ($value === [Type::T_KEYWORD, 'null']) {
+ $value = null;
}
+
+ $finalArgs[] = $value;
+ $keyArgs[$originalName] = $value;
}
- if ($exceptionMessage && ! $prototypeHasMatch) {
- $this->throwError($exceptionMessage);
+ if ($matchedPrototype['rest_argument'] !== null) {
+ $value = $vars[$matchedPrototype['rest_argument']];
+
+ $finalArgs[] = $value;
+ $keyArgs[$matchedPrototype['rest_argument']] = $value;
}
return [$finalArgs, $keyArgs];
}
/**
- * Apply argument values per definition
+ * Parses a function prototype to the internal representation of arguments.
*
- * @param array $argDef
- * @param array $argValues
- * @param boolean $storeInEnv
- * @param boolean $reduce
- * only used if $storeInEnv = false
+ * The input is an array of strings describing each argument, as supported
+ * in {@see registerFunction}. Argument names don't include the `$`.
+ * The output contains the list of positional argument, with their normalized
+ * name (underscores are replaced by dashes), their original name (to be used
+ * in case of error reporting) and their default value. The output also contains
+ * the normalized name of the rest argument, or null if the function prototype
+ * is not variadic.
+ *
+ * @param string[] $prototype
+ *
+ * @return array
+ * @phpstan-return array{arguments: list, rest_argument: string|null}
+ */
+ private function parseFunctionPrototype(array $prototype)
+ {
+ static $parser = null;
+
+ $arguments = [];
+ $restArgument = null;
+
+ foreach ($prototype as $p) {
+ if (null !== $restArgument) {
+ throw new \InvalidArgumentException('The argument declaration is invalid. The rest argument must be the last one.');
+ }
+
+ $default = null;
+ $p = explode(':', $p, 2);
+ $name = str_replace('_', '-', $p[0]);
+
+ if (isset($p[1])) {
+ $defaultSource = trim($p[1]);
+
+ if ($defaultSource === 'null') {
+ // differentiate this null from the static::$null
+ $default = [Type::T_KEYWORD, 'null'];
+ } else {
+ if (\is_null($parser)) {
+ $parser = $this->parserFactory(__METHOD__);
+ }
+
+ $parser->parseValue($defaultSource, $default);
+ }
+ }
+
+ if (substr($name, -3) === '...') {
+ $restArgument = substr($name, 0, -3);
+ } else {
+ $arguments[] = [$name, $p[0], $default];
+ }
+ }
+
+ return [
+ 'arguments' => $arguments,
+ 'rest_argument' => $restArgument,
+ ];
+ }
+
+ /**
+ * Returns the function prototype for the given positional and named arguments.
+ *
+ * If no exact match is found, finds the closest approximation. Note that this
+ * doesn't guarantee that $positional and $names are valid for the returned
+ * prototype.
+ *
+ * @param array[] $prototypes
+ * @param int $positional
+ * @param array $names A set of names, as both keys and values
*
* @return array
*
- * @throws \Exception
+ * @phpstan-param non-empty-list, rest_argument: string|null}> $prototypes
+ * @phpstan-return array{arguments: list, rest_argument: string|null}
*/
- protected function applyArguments($argDef, $argValues, $storeInEnv = true, $reduce = true)
+ private function selectFunctionPrototype(array $prototypes, $positional, array $names)
{
- $output = [];
- if (is_array($argValues) && count($argValues) && end($argValues) === static::$null) {
- array_pop($argValues);
+ $fuzzyMatch = null;
+ $minMismatchDistance = null;
+
+ foreach ($prototypes as $prototype) {
+ // Ideally, find an exact match.
+ if ($this->checkPrototypeMatches($prototype, $positional, $names)) {
+ return $prototype;
+ }
+
+ $mismatchDistance = \count($prototype['arguments']) - $positional;
+
+ if ($minMismatchDistance !== null) {
+ if (abs($mismatchDistance) > abs($minMismatchDistance)) {
+ continue;
+ }
+
+ // If two overloads have the same mismatch distance, favor the overload
+ // that has more arguments.
+ if (abs($mismatchDistance) === abs($minMismatchDistance) && $mismatchDistance < 0) {
+ continue;
+ }
+ }
+
+ $minMismatchDistance = $mismatchDistance;
+ $fuzzyMatch = $prototype;
}
- if ($storeInEnv) {
- $storeEnv = $this->getStoreEnv();
+ return $fuzzyMatch;
+ }
- $env = new Environment;
- $env->store = $storeEnv->store;
+ /**
+ * Checks whether the argument invocation matches the callable prototype.
+ *
+ * The rules are similar to {@see verifyPrototype}. The boolean return value
+ * avoids the overhead of building and catching exceptions when the reason of
+ * not matching the prototype does not need to be known.
+ *
+ * @param array $prototype
+ * @param int $positional
+ * @param array $names
+ *
+ * @return bool
+ *
+ * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype
+ */
+ private function checkPrototypeMatches(array $prototype, $positional, array $names)
+ {
+ $nameUsed = 0;
+
+ foreach ($prototype['arguments'] as $i => $argument) {
+ list ($name, $originalName, $default) = $argument;
+
+ if ($i < $positional) {
+ if (isset($names[$name])) {
+ return false;
+ }
+ } elseif (isset($names[$name])) {
+ $nameUsed++;
+ } elseif ($default === null) {
+ return false;
+ }
}
- $hasVariable = false;
- $args = [];
-
- foreach ($argDef as $i => $arg) {
- list($name, $default, $isVariable) = $argDef[$i];
-
- $args[$name] = [$i, $name, $default, $isVariable];
- $hasVariable |= $isVariable;
+ if ($prototype['rest_argument'] !== null) {
+ return true;
}
- $splatSeparator = null;
- $keywordArgs = [];
- $deferredKeywordArgs = [];
- $remaining = [];
- $hasKeywordArgument = false;
+ if ($positional > \count($prototype['arguments'])) {
+ return false;
+ }
- // assign the keyword args
- foreach ((array) $argValues as $arg) {
- if (! empty($arg[0])) {
+ if ($nameUsed < \count($names)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Verifies that the argument invocation is valid for the callable prototype.
+ *
+ * @param array $prototype
+ * @param int $positional
+ * @param array $names
+ * @param bool $hasSplat
+ *
+ * @return void
+ *
+ * @throws SassScriptException
+ *
+ * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype
+ */
+ private function verifyPrototype(array $prototype, $positional, array $names, $hasSplat)
+ {
+ $nameUsed = 0;
+
+ foreach ($prototype['arguments'] as $i => $argument) {
+ list ($name, $originalName, $default) = $argument;
+
+ if ($i < $positional) {
+ if (isset($names[$name])) {
+ throw new SassScriptException(sprintf('Argument $%s was passed both by position and by name.', $originalName));
+ }
+ } elseif (isset($names[$name])) {
+ $nameUsed++;
+ } elseif ($default === null) {
+ throw new SassScriptException(sprintf('Missing argument $%s', $originalName));
+ }
+ }
+
+ if ($prototype['rest_argument'] !== null) {
+ return;
+ }
+
+ if ($positional > \count($prototype['arguments'])) {
+ $message = sprintf(
+ 'Only %d %sargument%s allowed, but %d %s passed.',
+ \count($prototype['arguments']),
+ empty($names) ? '' : 'positional ',
+ \count($prototype['arguments']) === 1 ? '' : 's',
+ $positional,
+ $positional === 1 ? 'was' : 'were'
+ );
+ if (!$hasSplat) {
+ throw new SassScriptException($message);
+ }
+
+ $message = $this->addLocationToMessage($message);
+ $message .= "\nThis will be an error in future versions of Sass.";
+ $this->logger->warn($message, true);
+ }
+
+ if ($nameUsed < \count($names)) {
+ $unknownNames = array_values(array_diff($names, array_column($prototype['arguments'], 0)));
+ $lastName = array_pop($unknownNames);
+ $message = sprintf(
+ 'No argument%s named $%s%s.',
+ $unknownNames ? 's' : '',
+ $unknownNames ? implode(', $', $unknownNames) . ' or $' : '',
+ $lastName
+ );
+ throw new SassScriptException($message);
+ }
+ }
+
+ /**
+ * Evaluates the argument from the invocation.
+ *
+ * This returns several things about this invocation:
+ * - the list of positional arguments
+ * - the map of named arguments, indexed by normalized names
+ * - the set of names used in the arguments (that's an array using the normalized names as keys for O(1) access)
+ * - the separator used by the list using the splat operator, if any
+ * - a boolean indicator whether any splat argument (list or map) was used, to support the incomplete error reporting.
+ *
+ * @param array[] $args
+ * @param bool $reduce Whether arguments should be reduced to their value
+ *
+ * @return array
+ *
+ * @throws SassScriptException
+ *
+ * @phpstan-return array{0: list, 1: array, 2: array, 3: string|null, 4: bool}
+ */
+ private function evaluateArguments(array $args, $reduce = true)
+ {
+ // this represents trailing commas
+ if (\count($args) && end($args) === static::$null) {
+ array_pop($args);
+ }
+
+ $splatSeparator = null;
+ $keywordArgs = [];
+ $names = [];
+ $positionalArgs = [];
+ $hasKeywordArgument = false;
+ $hasSplat = false;
+
+ foreach ($args as $arg) {
+ if (!empty($arg[0])) {
$hasKeywordArgument = true;
- $name = $arg[0][1];
- if (! isset($args[$name])) {
- foreach (array_keys($args) as $an) {
- if (str_replace("_", "-", $an) === str_replace("_", "-", $name)) {
- $name = $an;
- break;
- }
- }
+ assert(\is_string($arg[0][1]));
+ $name = str_replace('_', '-', $arg[0][1]);
+
+ if (isset($keywordArgs[$name])) {
+ throw new SassScriptException(sprintf('Duplicate named argument $%s.', $arg[0][1]));
}
- if (! isset($args[$name]) || $args[$name][3]) {
- if ($hasVariable) {
- $deferredKeywordArgs[$name] = $arg[1];
- } else {
- $this->throwError("Mixin or function doesn't have an argument named $%s.", $arg[0][1]);
- break;
- }
- } elseif ($args[$name][0] < count($remaining)) {
- $this->throwError("The argument $%s was passed both by position and by name.", $arg[0][1]);
- break;
- } else {
- $keywordArgs[$name] = $arg[1];
- }
- } elseif ($arg[2] === true) {
+
+ $keywordArgs[$name] = $this->maybeReduce($reduce, $arg[1]);
+ $names[$name] = $name;
+ } elseif (! empty($arg[2])) {
+ // $arg[2] means a var followed by ... in the arg ($list... )
$val = $this->reduce($arg[1], true);
+ $hasSplat = true;
if ($val[0] === Type::T_LIST) {
- foreach ($val[2] as $name => $item) {
- if (! is_numeric($name)) {
- if (! isset($args[$name])) {
- foreach (array_keys($args) as $an) {
- if (str_replace("_", "-", $an) === str_replace("_", "-", $name)) {
- $name = $an;
- break;
- }
- }
+ foreach ($val[2] as $item) {
+ if (\is_null($splatSeparator)) {
+ $splatSeparator = $val[1];
+ }
+
+ $positionalArgs[] = $this->maybeReduce($reduce, $item);
+ }
+
+ if (isset($val[3]) && \is_array($val[3])) {
+ foreach ($val[3] as $name => $item) {
+ assert(\is_string($name));
+
+ $normalizedName = str_replace('_', '-', $name);
+
+ if (isset($keywordArgs[$normalizedName])) {
+ throw new SassScriptException(sprintf('Duplicate named argument $%s.', $name));
}
- if ($hasVariable) {
- $deferredKeywordArgs[$name] = $item;
- } else {
- $keywordArgs[$name] = $item;
- }
- } else {
- if (is_null($splatSeparator)) {
- $splatSeparator = $val[1];
- }
-
- $remaining[] = $item;
+ $keywordArgs[$normalizedName] = $this->maybeReduce($reduce, $item);
+ $names[$normalizedName] = $normalizedName;
+ $hasKeywordArgument = true;
}
}
} elseif ($val[0] === Type::T_MAP) {
@@ -5073,62 +6757,121 @@ class Compiler
$item = $val[2][$i];
if (! is_numeric($name)) {
- if (! isset($args[$name])) {
- foreach (array_keys($args) as $an) {
- if (str_replace("_", "-", $an) === str_replace("_", "-", $name)) {
- $name = $an;
- break;
- }
- }
+ $normalizedName = str_replace('_', '-', $name);
+
+ if (isset($keywordArgs[$normalizedName])) {
+ throw new SassScriptException(sprintf('Duplicate named argument $%s.', $name));
}
- if ($hasVariable) {
- $deferredKeywordArgs[$name] = $item;
- } else {
- $keywordArgs[$name] = $item;
- }
+ $keywordArgs[$normalizedName] = $this->maybeReduce($reduce, $item);
+ $names[$normalizedName] = $normalizedName;
+ $hasKeywordArgument = true;
} else {
- if (is_null($splatSeparator)) {
+ if (\is_null($splatSeparator)) {
$splatSeparator = $val[1];
}
- $remaining[] = $item;
+ $positionalArgs[] = $this->maybeReduce($reduce, $item);
}
}
- } else {
- $remaining[] = $val;
+ } elseif ($val[0] !== Type::T_NULL) { // values other than null are treated a single-element lists, while null is the empty list
+ $positionalArgs[] = $this->maybeReduce($reduce, $val);
}
} elseif ($hasKeywordArgument) {
- $this->throwError('Positional arguments must come before keyword arguments.');
- break;
+ throw new SassScriptException('Positional arguments must come before keyword arguments.');
} else {
- $remaining[] = $arg[1];
+ $positionalArgs[] = $this->maybeReduce($reduce, $arg[1]);
}
}
- foreach ($args as $arg) {
- list($i, $name, $default, $isVariable) = $arg;
+ return [$positionalArgs, $keywordArgs, $names, $splatSeparator, $hasSplat];
+ }
+
+ /**
+ * @param bool $reduce
+ * @param array|Number $value
+ *
+ * @return array|Number
+ */
+ private function maybeReduce($reduce, $value)
+ {
+ if ($reduce) {
+ return $this->reduce($value, true);
+ }
+
+ return $value;
+ }
+
+ /**
+ * Apply argument values per definition
+ *
+ * @param array[] $argDef
+ * @param array|null $argValues
+ * @param bool $storeInEnv
+ * @param bool $reduce only used if $storeInEnv = false
+ *
+ * @return array
+ *
+ * @phpstan-param list $argDef
+ *
+ * @throws \Exception
+ */
+ protected function applyArguments($argDef, $argValues, $storeInEnv = true, $reduce = true)
+ {
+ $output = [];
+
+ if (\is_null($argValues)) {
+ $argValues = [];
+ }
+
+ if ($storeInEnv) {
+ $storeEnv = $this->getStoreEnv();
+
+ $env = new Environment();
+ $env->store = $storeEnv->store;
+ }
+
+ $prototype = ['arguments' => [], 'rest_argument' => null];
+ $originalRestArgumentName = null;
+
+ foreach ($argDef as $arg) {
+ list($name, $default, $isVariable) = $arg;
+ $normalizedName = str_replace('_', '-', $name);
if ($isVariable) {
- $val = [Type::T_LIST, is_null($splatSeparator) ? ',' : $splatSeparator , [], $isVariable];
-
- for ($count = count($remaining); $i < $count; $i++) {
- $val[2][] = $remaining[$i];
- }
-
- foreach ($deferredKeywordArgs as $itemName => $item) {
- $val[2][$itemName] = $item;
- }
- } elseif (isset($remaining[$i])) {
- $val = $remaining[$i];
- } elseif (isset($keywordArgs[$name])) {
- $val = $keywordArgs[$name];
- } elseif (! empty($default)) {
- continue;
+ $originalRestArgumentName = $name;
+ $prototype['rest_argument'] = $normalizedName;
} else {
- $this->throwError("Missing argument $name");
- break;
+ $prototype['arguments'][] = [$normalizedName, $name, !empty($default) ? $default : null];
}
+ }
+
+ list($positionalArgs, $namedArgs, $names, $splatSeparator, $hasSplat) = $this->evaluateArguments($argValues, $reduce);
+
+ $this->verifyPrototype($prototype, \count($positionalArgs), $names, $hasSplat);
+
+ $vars = $this->applyArgumentsToDeclaration($prototype, $positionalArgs, $namedArgs, $splatSeparator);
+
+ foreach ($prototype['arguments'] as $argument) {
+ list($normalizedName, $name) = $argument;
+
+ if (!isset($vars[$normalizedName])) {
+ continue;
+ }
+
+ $val = $vars[$normalizedName];
+
+ if ($storeInEnv) {
+ $this->set($name, $this->reduce($val, true), true, $env);
+ } else {
+ $output[$name] = ($reduce ? $this->reduce($val, true) : $val);
+ }
+ }
+
+ if ($prototype['rest_argument'] !== null) {
+ assert($originalRestArgumentName !== null);
+ $name = $originalRestArgumentName;
+ $val = $vars[$prototype['rest_argument']];
if ($storeInEnv) {
$this->set($name, $this->reduce($val, true), true, $env);
@@ -5141,12 +6884,13 @@ class Compiler
$storeEnv->store = $env->store;
}
- foreach ($args as $arg) {
- list($i, $name, $default, $isVariable) = $arg;
+ foreach ($prototype['arguments'] as $argument) {
+ list($normalizedName, $name, $default) = $argument;
- if ($isVariable || isset($remaining[$i]) || isset($keywordArgs[$name]) || empty($default)) {
+ if (isset($vars[$normalizedName])) {
continue;
}
+ assert($default !== null);
if ($storeInEnv) {
$this->set($name, $this->reduce($default, true), true);
@@ -5158,29 +6902,90 @@ class Compiler
return $output;
}
+ /**
+ * Apply argument values per definition.
+ *
+ * This method assumes that the arguments are valid for the provided prototype.
+ * The validation with {@see verifyPrototype} must have been run before calling
+ * it.
+ * Arguments are returned as a map from the normalized argument names to the
+ * value. Additional arguments are collected in a sass argument list available
+ * under the name of the rest argument in the result.
+ *
+ * Defaults are not applied as they are resolved in a different environment.
+ *
+ * @param array $prototype
+ * @param array $positionalArgs
+ * @param array $namedArgs
+ * @param string|null $splatSeparator
+ *
+ * @return array
+ *
+ * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype
+ */
+ private function applyArgumentsToDeclaration(array $prototype, array $positionalArgs, array $namedArgs, $splatSeparator)
+ {
+ $output = [];
+ $minLength = min(\count($positionalArgs), \count($prototype['arguments']));
+
+ for ($i = 0; $i < $minLength; $i++) {
+ list($name) = $prototype['arguments'][$i];
+ $val = $positionalArgs[$i];
+
+ $output[$name] = $val;
+ }
+
+ $restNamed = $namedArgs;
+
+ for ($i = \count($positionalArgs); $i < \count($prototype['arguments']); $i++) {
+ $argument = $prototype['arguments'][$i];
+ list($name) = $argument;
+
+ if (isset($namedArgs[$name])) {
+ $val = $namedArgs[$name];
+ unset($restNamed[$name]);
+ } else {
+ continue;
+ }
+
+ $output[$name] = $val;
+ }
+
+ if ($prototype['rest_argument'] !== null) {
+ $name = $prototype['rest_argument'];
+ $rest = array_values(array_slice($positionalArgs, \count($prototype['arguments'])));
+
+ $val = [Type::T_LIST, \is_null($splatSeparator) ? ',' : $splatSeparator , $rest, $restNamed];
+
+ $output[$name] = $val;
+ }
+
+ return $output;
+ }
+
/**
* Coerce a php value into a scss one
*
* @param mixed $value
*
- * @return array|\ScssPhp\ScssPhp\Node\Number
+ * @return array|Number
*/
protected function coerceValue($value)
{
- if (is_array($value) || $value instanceof \ArrayAccess) {
+ if (\is_array($value) || $value instanceof Number) {
return $value;
}
- if (is_bool($value)) {
+ if (\is_bool($value)) {
return $this->toBool($value);
}
- if (is_null($value)) {
+ if (\is_null($value)) {
return static::$null;
}
if (is_numeric($value)) {
- return new Node\Number($value, '');
+ return new Number($value, '');
}
if ($value === '') {
@@ -5198,80 +7003,102 @@ class Compiler
}
/**
- * Coerce something to map
+ * Tries to convert an item to a Sass map
*
- * @param array $item
+ * @param Number|array $item
*
- * @return array
+ * @return array|null
*/
- protected function coerceMap($item)
+ private function tryMap($item)
{
+ if ($item instanceof Number) {
+ return null;
+ }
+
if ($item[0] === Type::T_MAP) {
return $item;
}
- if ($item[0] === static::$emptyList[0]
- && $item[1] === static::$emptyList[1]
- && $item[2] === static::$emptyList[2]) {
+ if (
+ $item[0] === Type::T_LIST &&
+ $item[2] === []
+ ) {
return static::$emptyMap;
}
- return [Type::T_MAP, [$item], [static::$null]];
+ return null;
+ }
+
+ /**
+ * Coerce something to map
+ *
+ * @param array|Number $item
+ *
+ * @return array|Number
+ */
+ protected function coerceMap($item)
+ {
+ $map = $this->tryMap($item);
+
+ if ($map !== null) {
+ return $map;
+ }
+
+ return $item;
}
/**
* Coerce something to list
*
- * @param array $item
- * @param string $delim
+ * @param array|Number $item
+ * @param string $delim
+ * @param bool $removeTrailingNull
*
* @return array
*/
- protected function coerceList($item, $delim = ',')
+ protected function coerceList($item, $delim = ',', $removeTrailingNull = false)
{
- if (isset($item) && $item[0] === Type::T_LIST) {
+ if ($item instanceof Number) {
+ return [Type::T_LIST, '', [$item]];
+ }
+
+ if ($item[0] === Type::T_LIST) {
+ // remove trailing null from the list
+ if ($removeTrailingNull && end($item[2]) === static::$null) {
+ array_pop($item[2]);
+ }
+
return $item;
}
- if (isset($item) && $item[0] === Type::T_MAP) {
+ if ($item[0] === Type::T_MAP) {
$keys = $item[1];
$values = $item[2];
$list = [];
- for ($i = 0, $s = count($keys); $i < $s; $i++) {
+ for ($i = 0, $s = \count($keys); $i < $s; $i++) {
$key = $keys[$i];
$value = $values[$i];
- switch ($key[0]) {
- case Type::T_LIST:
- case Type::T_MAP:
- case Type::T_STRING:
- break;
-
- default:
- $key = [Type::T_KEYWORD, $this->compileStringContent($this->coerceString($key))];
- break;
- }
-
$list[] = [
Type::T_LIST,
- '',
+ ' ',
[$key, $value]
];
}
- return [Type::T_LIST, ',', $list];
+ return [Type::T_LIST, $list ? ',' : '', $list];
}
- return [Type::T_LIST, $delim, ! isset($item) ? []: [$item]];
+ return [Type::T_LIST, '', [$item]];
}
/**
* Coerce color for expression
*
- * @param array $value
+ * @param array|Number $value
*
- * @return array|null
+ * @return array|Number
*/
protected function coerceForExpression($value)
{
@@ -5285,12 +7112,17 @@ class Compiler
/**
* Coerce value to color
*
- * @param array $value
+ * @param array|Number $value
+ * @param bool $inRGBFunction
*
* @return array|null
*/
protected function coerceColor($value, $inRGBFunction = false)
{
+ if ($value instanceof Number) {
+ return null;
+ }
+
switch ($value[0]) {
case Type::T_COLOR:
for ($i = 1; $i <= 3; $i++) {
@@ -5321,7 +7153,7 @@ class Compiler
case Type::T_LIST:
if ($inRGBFunction) {
- if (count($value[2]) == 3 || count($value[2]) == 4) {
+ if (\count($value[2]) == 3 || \count($value[2]) == 4) {
$color = $value[2];
array_unshift($color, Type::T_COLOR);
@@ -5332,16 +7164,17 @@ class Compiler
return null;
case Type::T_KEYWORD:
- if (! is_string($value[1])) {
+ if (! \is_string($value[1])) {
return null;
}
$name = strtolower($value[1]);
+
// hexa color?
if (preg_match('/^#([0-9a-f]+)$/i', $name, $m)) {
- $nofValues = strlen($m[1]);
+ $nofValues = \strlen($m[1]);
- if (in_array($nofValues, [3, 4, 6, 8])) {
+ if (\in_array($nofValues, [3, 4, 6, 8])) {
$nbChannels = 3;
$color = [];
$num = hexdec($m[1]);
@@ -5375,7 +7208,7 @@ class Compiler
if ($color[3] === 255) {
$color[3] = 1; // fully opaque
} else {
- $color[3] = round($color[3] / 255, 3);
+ $color[3] = round($color[3] / 255, Number::PRECISION);
}
}
@@ -5398,10 +7231,10 @@ class Compiler
}
/**
- * @param integer|\ScssPhp\ScssPhp\Node\Number $value
- * @param boolean $isAlpha
+ * @param int|Number $value
+ * @param bool $isAlpha
*
- * @return integer|mixed
+ * @return int|mixed
*/
protected function compileRGBAValue($value, $isAlpha = false)
{
@@ -5413,44 +7246,35 @@ class Compiler
}
/**
- * @param mixed $value
- * @param integer|float $min
- * @param integer|float $max
- * @param boolean $isInt
- * @param boolean $clamp
- * @param boolean $modulo
+ * @param mixed $value
+ * @param int|float $min
+ * @param int|float $max
+ * @param bool $isInt
*
- * @return integer|mixed
+ * @return int|mixed
*/
- protected function compileColorPartValue($value, $min, $max, $isInt = true, $clamp = true, $modulo = false)
+ protected function compileColorPartValue($value, $min, $max, $isInt = true)
{
if (! is_numeric($value)) {
- if (is_array($value)) {
+ if (\is_array($value)) {
$reduced = $this->reduce($value);
- if (is_object($reduced) && $value->type === Type::T_NUMBER) {
+ if ($reduced instanceof Number) {
$value = $reduced;
}
}
- if (is_object($value) && $value->type === Type::T_NUMBER) {
- $num = $value->dimension;
-
- if (count($value->units)) {
- $unit = array_keys($value->units);
- $unit = reset($unit);
-
- switch ($unit) {
- case '%':
- $num *= $max / 100;
- break;
- default:
- break;
- }
+ if ($value instanceof Number) {
+ if ($value->unitless()) {
+ $num = $value->getDimension();
+ } elseif ($value->hasUnit('%')) {
+ $num = $max * $value->getDimension() / 100;
+ } else {
+ throw $this->error('Expected %s to have no units or "%%".', $value);
}
$value = $num;
- } elseif (is_array($value)) {
+ } elseif (\is_array($value)) {
$value = $this->compileValue($value);
}
}
@@ -5460,18 +7284,7 @@ class Compiler
$value = round($value);
}
- if ($clamp) {
- $value = min($max, max($min, $value));
- }
-
- if ($modulo) {
- $value = $value % $max;
-
- // still negative?
- while ($value < $min) {
- $value += $max;
- }
- }
+ $value = min($max, max($min, $value));
return $value;
}
@@ -5482,34 +7295,72 @@ class Compiler
/**
* Coerce value to string
*
- * @param array $value
+ * @param array|Number $value
*
- * @return array|null
+ * @return array
*/
protected function coerceString($value)
{
if ($value[0] === Type::T_STRING) {
+ assert(\is_array($value));
+
return $value;
}
return [Type::T_STRING, '', [$this->compileValue($value)]];
}
+ /**
+ * Assert value is a string
+ *
+ * This method deals with internal implementation details of the value
+ * representation where unquoted strings can sometimes be stored under
+ * other types.
+ * The returned value is always using the T_STRING type.
+ *
+ * @api
+ *
+ * @param array|Number $value
+ * @param string|null $varName
+ *
+ * @return array
+ *
+ * @throws SassScriptException
+ */
+ public function assertString($value, $varName = null)
+ {
+ // case of url(...) parsed a a function
+ if ($value[0] === Type::T_FUNCTION) {
+ $value = $this->coerceString($value);
+ }
+
+ if (! \in_array($value[0], [Type::T_STRING, Type::T_KEYWORD])) {
+ $value = $this->compileValue($value);
+ throw SassScriptException::forArgument("$value is not a string.", $varName);
+ }
+
+ return $this->coerceString($value);
+ }
+
/**
* Coerce value to a percentage
*
- * @param array $value
+ * @param array|Number $value
*
- * @return integer|float
+ * @return int|float
+ *
+ * @deprecated
*/
protected function coercePercent($value)
{
- if ($value[0] === Type::T_NUMBER) {
- if (! empty($value[2]['%'])) {
- return $value[1] / 100;
+ @trigger_error(sprintf('"%s" is deprecated since 1.7.0.', __METHOD__), E_USER_DEPRECATED);
+
+ if ($value instanceof Number) {
+ if ($value->hasUnit('%')) {
+ return $value->getDimension() / 100;
}
- return $value[1];
+ return $value->getDimension();
}
return 0;
@@ -5520,21 +7371,24 @@ class Compiler
*
* @api
*
- * @param array $value
+ * @param array|Number $value
+ * @param string|null $varName
*
* @return array
*
- * @throws \Exception
+ * @throws SassScriptException
*/
- public function assertMap($value)
+ public function assertMap($value, $varName = null)
{
- $value = $this->coerceMap($value);
+ $map = $this->tryMap($value);
- if ($value[0] !== Type::T_MAP) {
- $this->throwError('expecting map, %s received', $value[0]);
+ if ($map === null) {
+ $value = $this->compileValue($value);
+
+ throw SassScriptException::forArgument("$value is not a map.", $varName);
}
- return $value;
+ return $map;
}
/**
@@ -5542,7 +7396,7 @@ class Compiler
*
* @api
*
- * @param array $value
+ * @param array|Number $value
*
* @return array
*
@@ -5551,30 +7405,55 @@ class Compiler
public function assertList($value)
{
if ($value[0] !== Type::T_LIST) {
- $this->throwError('expecting list, %s received', $value[0]);
+ throw $this->error('expecting list, %s received', $value[0]);
}
+ assert(\is_array($value));
return $value;
}
+ /**
+ * Gets the keywords of an argument list.
+ *
+ * Keys in the returned array are normalized names (underscores are replaced with dashes)
+ * without the leading `$`.
+ * Calling this helper with anything that an argument list received for a rest argument
+ * of the function argument declaration is not supported.
+ *
+ * @param array|Number $value
+ *
+ * @return array
+ */
+ public function getArgumentListKeywords($value)
+ {
+ if ($value[0] !== Type::T_LIST || !isset($value[3]) || !\is_array($value[3])) {
+ throw new \InvalidArgumentException('The argument is not a sass argument list.');
+ }
+
+ return $value[3];
+ }
+
/**
* Assert value is a color
*
* @api
*
- * @param array $value
+ * @param array|Number $value
+ * @param string|null $varName
*
* @return array
*
- * @throws \Exception
+ * @throws SassScriptException
*/
- public function assertColor($value)
+ public function assertColor($value, $varName = null)
{
if ($color = $this->coerceColor($value)) {
return $color;
}
- $this->throwError('expecting color, %s received', $value[0]);
+ $value = $this->compileValue($value);
+
+ throw SassScriptException::forArgument("$value is not a color.", $varName);
}
/**
@@ -5582,21 +7461,64 @@ class Compiler
*
* @api
*
- * @param array $value
+ * @param array|Number $value
+ * @param string|null $varName
*
- * @return integer|float
+ * @return Number
*
- * @throws \Exception
+ * @throws SassScriptException
*/
- public function assertNumber($value)
+ public function assertNumber($value, $varName = null)
{
- if ($value[0] !== Type::T_NUMBER) {
- $this->throwError('expecting number, %s received', $value[0]);
+ if (!$value instanceof Number) {
+ $value = $this->compileValue($value);
+ throw SassScriptException::forArgument("$value is not a number.", $varName);
}
- return $value[1];
+ return $value;
}
+ /**
+ * Assert value is a integer
+ *
+ * @api
+ *
+ * @param array|Number $value
+ * @param string|null $varName
+ *
+ * @return int
+ *
+ * @throws SassScriptException
+ */
+ public function assertInteger($value, $varName = null)
+ {
+ $value = $this->assertNumber($value, $varName)->getDimension();
+ if (round($value - \intval($value), Number::PRECISION) > 0) {
+ throw SassScriptException::forArgument("$value is not an integer.", $varName);
+ }
+
+ return intval($value);
+ }
+
+ /**
+ * Extract the ... / alpha on the last argument of channel arg
+ * in color functions
+ *
+ * @param array $args
+ * @return array
+ */
+ private function extractSlashAlphaInColorFunction($args)
+ {
+ $last = end($args);
+ if (\count($args) === 3 && $last[0] === Type::T_EXPRESSION && $last[1] === '/') {
+ array_pop($args);
+ $args[] = $last[2];
+ $args[] = $last[3];
+ }
+ return $args;
+ }
+
+
/**
* Make sure a color's components don't go out of bounds
*
@@ -5614,6 +7536,10 @@ class Compiler
if ($c[$i] > 255) {
$c[$i] = 255;
}
+
+ if (!\is_int($c[$i])) {
+ $c[$i] = round($c[$i]);
+ }
}
return $c;
@@ -5622,11 +7548,11 @@ class Compiler
/**
* Convert RGB to HSL
*
- * @api
+ * @internal
*
- * @param integer $red
- * @param integer $green
- * @param integer $blue
+ * @param int $red
+ * @param int $green
+ * @param int $blue
*
* @return array
*/
@@ -5651,12 +7577,12 @@ class Compiler
$h = 60 * ($green - $blue) / $d;
} elseif ($green == $max) {
$h = 60 * ($blue - $red) / $d + 120;
- } elseif ($blue == $max) {
+ } else {
$h = 60 * ($red - $green) / $d + 240;
}
}
- return [Type::T_HSL, fmod($h, 360), $s * 100, $l / 5.1];
+ return [Type::T_HSL, fmod($h + 360, 360), $s * 100, $l / 5.1];
}
/**
@@ -5685,7 +7611,7 @@ class Compiler
}
if ($h * 3 < 2) {
- return $m1 + ($m2 - $m1) * (2/3 - $h) * 6;
+ return $m1 + ($m2 - $m1) * (2 / 3 - $h) * 6;
}
return $m1;
@@ -5694,11 +7620,11 @@ class Compiler
/**
* Convert HSL to RGB
*
- * @api
+ * @internal
*
- * @param integer $hue H from 0 to 360
- * @param integer $saturation S from 0 to 100
- * @param integer $lightness L from 0 to 100
+ * @param int|float $hue H from 0 to 360
+ * @param int|float $saturation S from 0 to 100
+ * @param int|float $lightness L from 0 to 100
*
* @return array
*/
@@ -5715,35 +7641,133 @@ class Compiler
$m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s;
$m1 = $l * 2 - $m2;
- $r = $this->hueToRGB($m1, $m2, $h + 1/3) * 255;
+ $r = $this->hueToRGB($m1, $m2, $h + 1 / 3) * 255;
$g = $this->hueToRGB($m1, $m2, $h) * 255;
- $b = $this->hueToRGB($m1, $m2, $h - 1/3) * 255;
+ $b = $this->hueToRGB($m1, $m2, $h - 1 / 3) * 255;
$out = [Type::T_COLOR, $r, $g, $b];
return $out;
}
- // Built in functions
-
- protected static $libCall = ['name', 'args...'];
- protected function libCall($args, $kwargs)
+ /**
+ * Convert HWB to RGB
+ * https://www.w3.org/TR/css-color-4/#hwb-to-rgb
+ *
+ * @api
+ *
+ * @param int|float $hue H from 0 to 360
+ * @param int|float $whiteness W from 0 to 100
+ * @param int|float $blackness B from 0 to 100
+ *
+ * @return array
+ */
+ private function HWBtoRGB($hue, $whiteness, $blackness)
{
- $name = $this->compileStringContent($this->coerceString($this->reduce(array_shift($args), true)));
- $callArgs = [];
+ $w = min(100, max(0, $whiteness)) / 100;
+ $b = min(100, max(0, $blackness)) / 100;
- // $kwargs['args'] is [Type::T_LIST, ',', [..]]
- foreach ($kwargs['args'][2] as $varname => $arg) {
- if (is_numeric($varname)) {
- $varname = null;
- } else {
- $varname = [ 'var', $varname];
- }
+ $sum = $w + $b;
+ if ($sum > 1.0) {
+ $w = $w / $sum;
+ $b = $b / $sum;
+ }
+ $b = min(1.0 - $w, $b);
- $callArgs[] = [$varname, $arg, false];
+ $rgb = $this->toRGB($hue, 100, 50);
+ for($i = 1; $i < 4; $i++) {
+ $rgb[$i] *= (1.0 - $w - $b);
+ $rgb[$i] = round($rgb[$i] + 255 * $w + 0.0001);
}
- return $this->reduce([Type::T_FUNCTION_CALL, $name, $callArgs]);
+ return $rgb;
+ }
+
+ /**
+ * Convert RGB to HWB
+ *
+ * @api
+ *
+ * @param int $red
+ * @param int $green
+ * @param int $blue
+ *
+ * @return array
+ */
+ private function RGBtoHWB($red, $green, $blue)
+ {
+ $min = min($red, $green, $blue);
+ $max = max($red, $green, $blue);
+
+ $d = $max - $min;
+
+ if ((int) $d === 0) {
+ $h = 0;
+ } else {
+
+ if ($red == $max) {
+ $h = 60 * ($green - $blue) / $d;
+ } elseif ($green == $max) {
+ $h = 60 * ($blue - $red) / $d + 120;
+ } else {
+ $h = 60 * ($red - $green) / $d + 240;
+ }
+ }
+
+ return [Type::T_HWB, fmod($h, 360), $min / 255 * 100, 100 - $max / 255 *100];
+ }
+
+
+ // Built in functions
+
+ protected static $libCall = ['function', 'args...'];
+ protected function libCall($args)
+ {
+ $functionReference = $args[0];
+
+ if (in_array($functionReference[0], [Type::T_STRING, Type::T_KEYWORD])) {
+ $name = $this->compileStringContent($this->coerceString($functionReference));
+ $warning = "Passing a string to call() is deprecated and will be illegal\n"
+ . "in Sass 4.0. Use call(function-reference($name)) instead.";
+ Warn::deprecation($warning);
+ $functionReference = $this->libGetFunction([$this->assertString($functionReference, 'function')]);
+ }
+
+ if ($functionReference === static::$null) {
+ return static::$null;
+ }
+
+ if (! in_array($functionReference[0], [Type::T_FUNCTION_REFERENCE, Type::T_FUNCTION])) {
+ throw $this->error('Function reference expected, got ' . $functionReference[0]);
+ }
+
+ $callArgs = [
+ [null, $args[1], true]
+ ];
+
+ return $this->reduce([Type::T_FUNCTION_CALL, $functionReference, $callArgs]);
+ }
+
+
+ protected static $libGetFunction = [
+ ['name'],
+ ['name', 'css']
+ ];
+ protected function libGetFunction($args)
+ {
+ $name = $this->compileStringContent($this->assertString(array_shift($args), 'name'));
+ $isCss = false;
+
+ if (count($args)) {
+ $isCss = array_shift($args);
+ $isCss = (($isCss === static::$true) ? true : false);
+ }
+
+ if ($isCss) {
+ return [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]];
+ }
+
+ return $this->getFunctionReference($name, true);
}
protected static $libIf = ['condition', 'if-true', 'if-false:'];
@@ -5763,11 +7787,8 @@ class Compiler
{
list($list, $value) = $args;
- if ($value[0] === Type::T_MAP) {
- return static::$null;
- }
-
- if ($list[0] === Type::T_MAP ||
+ if (
+ $list[0] === Type::T_MAP ||
$list[0] === Type::T_STRING ||
$list[0] === Type::T_KEYWORD ||
$list[0] === Type::T_INTERPOLATE
@@ -5779,6 +7800,22 @@ class Compiler
return static::$null;
}
+ // Numbers are represented with value objects, for which the PHP equality operator does not
+ // match the Sass rules (and we cannot overload it). As they are the only type of values
+ // represented with a value object for now, they require a special case.
+ if ($value instanceof Number) {
+ $key = 0;
+ foreach ($list[2] as $item) {
+ $key++;
+ $itemValue = $this->normalizeValue($item);
+
+ if ($itemValue instanceof Number && $value->equals($itemValue)) {
+ return new Number($key, '');
+ }
+ }
+ return static::$null;
+ }
+
$values = [];
foreach ($list[2] as $item) {
@@ -5787,7 +7824,7 @@ class Compiler
$key = array_search($this->normalizeValue($value), $values);
- return false === $key ? static::$null : $key + 1;
+ return false === $key ? static::$null : new Number($key + 1, '');
}
protected static $libRgb = [
@@ -5796,9 +7833,17 @@ class Compiler
['channels'],
['red', 'green', 'blue'],
['red', 'green', 'blue', 'alpha'] ];
+
+ /**
+ * @param array $args
+ * @param array $kwargs
+ * @param string $funcName
+ *
+ * @return array
+ */
protected function libRgb($args, $kwargs, $funcName = 'rgb')
{
- switch (count($args)) {
+ switch (\count($args)) {
case 1:
if (! $color = $this->coerceColor($args[0], true)) {
$color = [Type::T_STRING, '', [$funcName . '(', $args[0], ')']];
@@ -5809,7 +7854,7 @@ class Compiler
$color = [Type::T_COLOR, $args[0], $args[1], $args[2]];
if (! $color = $this->coerceColor($color)) {
- $color = [Type::T_STRING, '', [$funcName .'(', $args[0], ', ', $args[1], ', ', $args[2], ')']];
+ $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']];
}
return $color;
@@ -5825,7 +7870,7 @@ class Compiler
[$funcName . '(', $color[1], ', ', $color[2], ', ', $color[3], ', ', $alpha, ')']];
}
} else {
- $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ')']];
+ $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ')']];
}
break;
@@ -5854,33 +7899,126 @@ class Compiler
return $this->libRgb($args, $kwargs, 'rgba');
}
- // helper function for adjust_color, change_color, and scale_color
- protected function alterColor($args, $fn)
+ /**
+ * Helper function for adjust_color, change_color, and scale_color
+ *
+ * @param array $args
+ * @param string $operation
+ * @param callable $fn
+ *
+ * @return array
+ *
+ * @phpstan-param callable(float|int, float|int|null, float|int): (float|int) $fn
+ */
+ protected function alterColor(array $args, $operation, $fn)
{
- $color = $this->assertColor($args[0]);
+ $color = $this->assertColor($args[0], 'color');
- foreach ([1 => 1, 2 => 2, 3 => 3, 7 => 4] as $iarg => $irgba) {
- if (isset($args[$iarg])) {
- $val = $this->assertNumber($args[$iarg]);
-
- if (! isset($color[$irgba])) {
- $color[$irgba] = (($irgba < 4) ? 0 : 1);
- }
-
- $color[$irgba] = call_user_func($fn, $color[$irgba], $val, $iarg);
- }
+ if ($args[1][2]) {
+ throw new SassScriptException('Only one positional argument is allowed. All other arguments must be passed by name.');
}
- if (! empty($args[4]) || ! empty($args[5]) || ! empty($args[6])) {
- $hsl = $this->toHSL($color[1], $color[2], $color[3]);
+ $kwargs = $this->getArgumentListKeywords($args[1]);
- foreach ([4 => 1, 5 => 2, 6 => 3] as $iarg => $ihsl) {
- if (! empty($args[$iarg])) {
- $val = $this->assertNumber($args[$iarg]);
- $hsl[$ihsl] = call_user_func($fn, $hsl[$ihsl], $val, $iarg);
+ $scale = $operation === 'scale';
+ $change = $operation === 'change';
+
+ /** @phpstan-var callable(string, float|int, bool=, bool=): (float|int|null) $getParam */
+ $getParam = function ($name, $max, $checkPercent = false, $assertPercent = false) use (&$kwargs, $scale, $change) {
+ if (!isset($kwargs[$name])) {
+ return null;
+ }
+
+ $number = $this->assertNumber($kwargs[$name], $name);
+ unset($kwargs[$name]);
+
+ if (!$scale && $checkPercent) {
+ if (!$number->hasUnit('%')) {
+ $warning = $this->error("{$name} Passing a number `$number` without unit % is deprecated.");
+ $this->logger->warn($warning->getMessage(), true);
}
}
+ if ($scale || $assertPercent) {
+ $number->assertUnit('%', $name);
+ }
+
+ if ($scale) {
+ $max = 100;
+ }
+
+ return $number->valueInRange($change ? 0 : -$max, $max, $name);
+ };
+
+ $alpha = $getParam('alpha', 1);
+ $red = $getParam('red', 255);
+ $green = $getParam('green', 255);
+ $blue = $getParam('blue', 255);
+
+ if ($scale || !isset($kwargs['hue'])) {
+ $hue = null;
+ } else {
+ $hueNumber = $this->assertNumber($kwargs['hue'], 'hue');
+ unset($kwargs['hue']);
+ $hue = $hueNumber->getDimension();
+ }
+ $saturation = $getParam('saturation', 100, true);
+ $lightness = $getParam('lightness', 100, true);
+ $whiteness = $getParam('whiteness', 100, false, true);
+ $blackness = $getParam('blackness', 100, false, true);
+
+ if (!empty($kwargs)) {
+ $unknownNames = array_keys($kwargs);
+ $lastName = array_pop($unknownNames);
+ $message = sprintf(
+ 'No argument%s named $%s%s.',
+ $unknownNames ? 's' : '',
+ $unknownNames ? implode(', $', $unknownNames) . ' or $' : '',
+ $lastName
+ );
+ throw new SassScriptException($message);
+ }
+
+ $hasRgb = $red !== null || $green !== null || $blue !== null;
+ $hasSL = $saturation !== null || $lightness !== null;
+ $hasWB = $whiteness !== null || $blackness !== null;
+
+ if ($hasRgb && ($hasSL || $hasWB || $hue !== null)) {
+ throw new SassScriptException(sprintf('RGB parameters may not be passed along with %s parameters.', $hasWB ? 'HWB' : 'HSL'));
+ }
+
+ if ($hasWB && $hasSL) {
+ throw new SassScriptException('HSL parameters may not be passed along with HWB parameters.');
+ }
+
+ if ($hasRgb) {
+ $color[1] = round($fn($color[1], $red, 255));
+ $color[2] = round($fn($color[2], $green, 255));
+ $color[3] = round($fn($color[3], $blue, 255));
+ } elseif ($hasWB) {
+ $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]);
+ if ($hue !== null) {
+ $hwb[1] = $change ? $hue : $hwb[1] + $hue;
+ }
+ $hwb[2] = $fn($hwb[2], $whiteness, 100);
+ $hwb[3] = $fn($hwb[3], $blackness, 100);
+
+ $rgb = $this->HWBtoRGB($hwb[1], $hwb[2], $hwb[3]);
+
+ if (isset($color[4])) {
+ $rgb[4] = $color[4];
+ }
+
+ $color = $rgb;
+ } elseif ($hue !== null || $hasSL) {
+ $hsl = $this->toHSL($color[1], $color[2], $color[3]);
+
+ if ($hue !== null) {
+ $hsl[1] = $change ? $hue : $hsl[1] + $hue;
+ }
+ $hsl[2] = $fn($hsl[2], $saturation, 100);
+ $hsl[3] = $fn($hsl[3], $lightness, 100);
+
$rgb = $this->toRGB($hsl[1], $hsl[2], $hsl[3]);
if (isset($color[4])) {
@@ -5890,58 +8028,54 @@ class Compiler
$color = $rgb;
}
+ if ($alpha !== null) {
+ $existingAlpha = isset($color[4]) ? $color[4] : 1;
+ $color[4] = $fn($existingAlpha, $alpha, 1);
+ }
+
return $color;
}
- protected static $libAdjustColor = [
- 'color', 'red:null', 'green:null', 'blue:null',
- 'hue:null', 'saturation:null', 'lightness:null', 'alpha:null'
- ];
+ protected static $libAdjustColor = ['color', 'kwargs...'];
protected function libAdjustColor($args)
{
- return $this->alterColor($args, function ($base, $alter, $i) {
- return $base + $alter;
+ return $this->alterColor($args, 'adjust', function ($base, $alter, $max) {
+ if ($alter === null) {
+ return $base;
+ }
+
+ $new = $base + $alter;
+
+ if ($new < 0) {
+ return 0;
+ }
+
+ if ($new > $max) {
+ return $max;
+ }
+
+ return $new;
});
}
- protected static $libChangeColor = [
- 'color', 'red:null', 'green:null', 'blue:null',
- 'hue:null', 'saturation:null', 'lightness:null', 'alpha:null'
- ];
+ protected static $libChangeColor = ['color', 'kwargs...'];
protected function libChangeColor($args)
{
- return $this->alterColor($args, function ($base, $alter, $i) {
+ return $this->alterColor($args,'change', function ($base, $alter, $max) {
+ if ($alter === null) {
+ return $base;
+ }
+
return $alter;
});
}
- protected static $libScaleColor = [
- 'color', 'red:null', 'green:null', 'blue:null',
- 'hue:null', 'saturation:null', 'lightness:null', 'alpha:null'
- ];
+ protected static $libScaleColor = ['color', 'kwargs...'];
protected function libScaleColor($args)
{
- return $this->alterColor($args, function ($base, $scale, $i) {
- // 1, 2, 3 - rgb
- // 4, 5, 6 - hsl
- // 7 - a
- switch ($i) {
- case 1:
- case 2:
- case 3:
- $max = 255;
- break;
-
- case 4:
- $max = 360;
- break;
-
- case 7:
- $max = 1;
- break;
-
- default:
- $max = 100;
+ return $this->alterColor($args, 'scale', function ($base, $scale, $max) {
+ if ($scale === null) {
+ return $base;
}
$scale = $scale / 100;
@@ -5958,6 +8092,11 @@ class Compiler
protected function libIeHexStr($args)
{
$color = $this->coerceColor($args[0]);
+
+ if (\is_null($color)) {
+ throw $this->error('Error: argument `$color` of `ie-hex-str($color)` must be a color');
+ }
+
$color[4] = isset($color[4]) ? round(255 * $color[4]) : 255;
return [Type::T_STRING, '', [sprintf('#%02X%02X%02X%02X', $color[4], $color[1], $color[2], $color[3])]];
@@ -5968,7 +8107,11 @@ class Compiler
{
$color = $this->coerceColor($args[0]);
- return $color[1];
+ if (\is_null($color)) {
+ throw $this->error('Error: argument `$color` of `red($color)` must be a color');
+ }
+
+ return new Number((int) $color[1], '');
}
protected static $libGreen = ['color'];
@@ -5976,7 +8119,11 @@ class Compiler
{
$color = $this->coerceColor($args[0]);
- return $color[2];
+ if (\is_null($color)) {
+ throw $this->error('Error: argument `$color` of `green($color)` must be a color');
+ }
+
+ return new Number((int) $color[2], '');
}
protected static $libBlue = ['color'];
@@ -5984,14 +8131,18 @@ class Compiler
{
$color = $this->coerceColor($args[0]);
- return $color[3];
+ if (\is_null($color)) {
+ throw $this->error('Error: argument `$color` of `blue($color)` must be a color');
+ }
+
+ return new Number((int) $color[3], '');
}
protected static $libAlpha = ['color'];
protected function libAlpha($args)
{
if ($color = $this->coerceColor($args[0])) {
- return isset($color[4]) ? $color[4] : 1;
+ return new Number(isset($color[4]) ? $color[4] : 1, '');
}
// this might be the IE function, so return value unchanged
@@ -6003,7 +8154,7 @@ class Compiler
{
$value = $args[0];
- if ($value[0] === Type::T_NUMBER) {
+ if ($value instanceof Number) {
return null;
}
@@ -6011,78 +8162,129 @@ class Compiler
}
// mix two colors
- protected static $libMix = ['color-1', 'color-2', 'weight:0.5'];
+ protected static $libMix = [
+ ['color1', 'color2', 'weight:50%'],
+ ['color-1', 'color-2', 'weight:50%']
+ ];
protected function libMix($args)
{
list($first, $second, $weight) = $args;
- $first = $this->assertColor($first);
- $second = $this->assertColor($second);
-
- if (! isset($weight)) {
- $weight = 0.5;
- } else {
- $weight = $this->coercePercent($weight);
- }
+ $first = $this->assertColor($first, 'color1');
+ $second = $this->assertColor($second, 'color2');
+ $weightScale = $this->assertNumber($weight, 'weight')->valueInRange(0, 100, 'weight') / 100;
$firstAlpha = isset($first[4]) ? $first[4] : 1;
$secondAlpha = isset($second[4]) ? $second[4] : 1;
- $w = $weight * 2 - 1;
- $a = $firstAlpha - $secondAlpha;
+ $normalizedWeight = $weightScale * 2 - 1;
+ $alphaDistance = $firstAlpha - $secondAlpha;
- $w1 = (($w * $a === -1 ? $w : ($w + $a) / (1 + $w * $a)) + 1) / 2.0;
- $w2 = 1.0 - $w1;
+ $combinedWeight = $normalizedWeight * $alphaDistance == -1 ? $normalizedWeight : ($normalizedWeight + $alphaDistance) / (1 + $normalizedWeight * $alphaDistance);
+ $weight1 = ($combinedWeight + 1) / 2.0;
+ $weight2 = 1.0 - $weight1;
$new = [Type::T_COLOR,
- $w1 * $first[1] + $w2 * $second[1],
- $w1 * $first[2] + $w2 * $second[2],
- $w1 * $first[3] + $w2 * $second[3],
+ $weight1 * $first[1] + $weight2 * $second[1],
+ $weight1 * $first[2] + $weight2 * $second[2],
+ $weight1 * $first[3] + $weight2 * $second[3],
];
if ($firstAlpha != 1.0 || $secondAlpha != 1.0) {
- $new[] = $firstAlpha * $weight + $secondAlpha * (1 - $weight);
+ $new[] = $firstAlpha * $weightScale + $secondAlpha * (1 - $weightScale);
}
return $this->fixColor($new);
}
- protected static $libHsl =[
+ protected static $libHsl = [
['channels'],
+ ['hue', 'saturation'],
['hue', 'saturation', 'lightness'],
['hue', 'saturation', 'lightness', 'alpha'] ];
+
+ /**
+ * @param array $args
+ * @param array $kwargs
+ * @param string $funcName
+ *
+ * @return array|null
+ */
protected function libHsl($args, $kwargs, $funcName = 'hsl')
{
- if (count($args) == 1) {
- if ($args[0][0] !== Type::T_LIST || count($args[0][2]) < 3 || count($args[0][2]) > 4) {
+ $args_to_check = $args;
+
+ if (\count($args) == 1) {
+ if ($args[0][0] !== Type::T_LIST || \count($args[0][2]) < 3 || \count($args[0][2]) > 4) {
return [Type::T_STRING, '', [$funcName . '(', $args[0], ')']];
}
$args = $args[0][2];
+ $args_to_check = $kwargs['channels'][2];
}
- $hue = $this->compileColorPartValue($args[0], 0, 360, false, false, true);
- $saturation = $this->compileColorPartValue($args[1], 0, 100, false);
- $lightness = $this->compileColorPartValue($args[2], 0, 100, false);
+ if (\count($args) === 2) {
+ // if var() is used as an argument, return as a css function
+ foreach ($args as $arg) {
+ if ($arg[0] === Type::T_FUNCTION && in_array($arg[1], ['var'])) {
+ return null;
+ }
+ }
+ throw new SassScriptException('Missing argument $lightness.');
+ }
+
+ foreach ($kwargs as $arg) {
+ if (in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && in_array($arg[1], ['min', 'max'])) {
+ return null;
+ }
+ }
+
+ foreach ($args_to_check as $k => $arg) {
+ if (in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && in_array($arg[1], ['min', 'max'])) {
+ if (count($kwargs) > 1 || ($k >= 2 && count($args) === 4)) {
+ return null;
+ }
+
+ $args[$k] = $this->stringifyFncallArgs($arg);
+ }
+
+ if (
+ $k >= 2 && count($args) === 4 &&
+ in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) &&
+ in_array($arg[1], ['calc','env'])
+ ) {
+ return null;
+ }
+ }
+
+ $hue = $this->reduce($args[0]);
+ $saturation = $this->reduce($args[1]);
+ $lightness = $this->reduce($args[2]);
$alpha = null;
- if (count($args) === 4) {
+ if (\count($args) === 4) {
$alpha = $this->compileColorPartValue($args[3], 0, 100, false);
- if (! is_numeric($hue) || ! is_numeric($saturation) || ! is_numeric($lightness) || ! is_numeric($alpha)) {
+ if (!$hue instanceof Number || !$saturation instanceof Number || ! $lightness instanceof Number || ! is_numeric($alpha)) {
return [Type::T_STRING, '',
[$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ', ', $args[3], ')']];
}
} else {
- if (! is_numeric($hue) || ! is_numeric($saturation) || ! is_numeric($lightness)) {
+ if (!$hue instanceof Number || !$saturation instanceof Number || ! $lightness instanceof Number) {
return [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']];
}
}
- $color = $this->toRGB($hue, $saturation, $lightness);
+ $hueValue = fmod($hue->getDimension(), 360);
- if (! is_null($alpha)) {
+ while ($hueValue < 0) {
+ $hueValue += 360;
+ }
+
+ $color = $this->toRGB($hueValue, max(0, min($saturation->getDimension(), 100)), max(0, min($lightness->getDimension(), 100)));
+
+ if (! \is_null($alpha)) {
$color[4] = $alpha;
}
@@ -6091,7 +8293,9 @@ class Compiler
protected static $libHsla = [
['channels'],
- ['hue', 'saturation', 'lightness', 'alpha:1'] ];
+ ['hue', 'saturation'],
+ ['hue', 'saturation', 'lightness'],
+ ['hue', 'saturation', 'lightness', 'alpha']];
protected function libHsla($args, $kwargs)
{
return $this->libHsl($args, $kwargs, 'hsla');
@@ -6100,34 +8304,173 @@ class Compiler
protected static $libHue = ['color'];
protected function libHue($args)
{
- $color = $this->assertColor($args[0]);
+ $color = $this->assertColor($args[0], 'color');
$hsl = $this->toHSL($color[1], $color[2], $color[3]);
- return new Node\Number($hsl[1], 'deg');
+ return new Number($hsl[1], 'deg');
}
protected static $libSaturation = ['color'];
protected function libSaturation($args)
{
- $color = $this->assertColor($args[0]);
+ $color = $this->assertColor($args[0], 'color');
$hsl = $this->toHSL($color[1], $color[2], $color[3]);
- return new Node\Number($hsl[2], '%');
+ return new Number($hsl[2], '%');
}
protected static $libLightness = ['color'];
protected function libLightness($args)
{
- $color = $this->assertColor($args[0]);
+ $color = $this->assertColor($args[0], 'color');
$hsl = $this->toHSL($color[1], $color[2], $color[3]);
- return new Node\Number($hsl[3], '%');
+ return new Number($hsl[3], '%');
}
+ /*
+ * Todo : a integrer dans le futur module color
+ protected static $libHwb = [
+ ['channels'],
+ ['hue', 'whiteness', 'blackness'],
+ ['hue', 'whiteness', 'blackness', 'alpha'] ];
+ protected function libHwb($args, $kwargs, $funcName = 'hwb')
+ {
+ $args_to_check = $args;
+
+ if (\count($args) == 1) {
+ if ($args[0][0] !== Type::T_LIST) {
+ throw $this->error("Missing elements \$whiteness and \$blackness");
+ }
+
+ if (\trim($args[0][1])) {
+ throw $this->error("\$channels must be a space-separated list.");
+ }
+
+ if (! empty($args[0]['enclosing'])) {
+ throw $this->error("\$channels must be an unbracketed list.");
+ }
+
+ $args = $args[0][2];
+ if (\count($args) > 3) {
+ throw $this->error("hwb() : Only 3 elements are allowed but ". \count($args) . "were passed");
+ }
+
+ $args_to_check = $this->extractSlashAlphaInColorFunction($kwargs['channels'][2]);
+ if (\count($args_to_check) !== \count($kwargs['channels'][2])) {
+ $args = $args_to_check;
+ }
+ }
+
+ if (\count($args_to_check) < 2) {
+ throw $this->error("Missing elements \$whiteness and \$blackness");
+ }
+ if (\count($args_to_check) < 3) {
+ throw $this->error("Missing element \$blackness");
+ }
+ if (\count($args_to_check) > 4) {
+ throw $this->error("hwb() : Only 4 elements are allowed but ". \count($args) . "were passed");
+ }
+
+ foreach ($kwargs as $k => $arg) {
+ if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) {
+ return null;
+ }
+ }
+
+ foreach ($args_to_check as $k => $arg) {
+ if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) {
+ if (count($kwargs) > 1 || ($k >= 2 && count($args) === 4)) {
+ return null;
+ }
+
+ $args[$k] = $this->stringifyFncallArgs($arg);
+ }
+
+ if (
+ $k >= 2 && count($args) === 4 &&
+ in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) &&
+ in_array($arg[1], ['calc','env'])
+ ) {
+ return null;
+ }
+ }
+
+ $hue = $this->reduce($args[0]);
+ $whiteness = $this->reduce($args[1]);
+ $blackness = $this->reduce($args[2]);
+ $alpha = null;
+
+ if (\count($args) === 4) {
+ $alpha = $this->compileColorPartValue($args[3], 0, 1, false);
+
+ if (! \is_numeric($alpha)) {
+ $val = $this->compileValue($args[3]);
+ throw $this->error("\$alpha: $val is not a number");
+ }
+ }
+
+ $this->assertNumber($hue, 'hue');
+ $this->assertUnit($whiteness, ['%'], 'whiteness');
+ $this->assertUnit($blackness, ['%'], 'blackness');
+
+ $this->assertRange($whiteness, 0, 100, "0% and 100%", "whiteness");
+ $this->assertRange($blackness, 0, 100, "0% and 100%", "blackness");
+
+ $w = $whiteness->getDimension();
+ $b = $blackness->getDimension();
+
+ $hueValue = $hue->getDimension() % 360;
+
+ while ($hueValue < 0) {
+ $hueValue += 360;
+ }
+
+ $color = $this->HWBtoRGB($hueValue, $w, $b);
+
+ if (! \is_null($alpha)) {
+ $color[4] = $alpha;
+ }
+
+ return $color;
+ }
+
+ protected static $libWhiteness = ['color'];
+ protected function libWhiteness($args, $kwargs, $funcName = 'whiteness') {
+
+ $color = $this->assertColor($args[0]);
+ $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]);
+
+ return new Number($hwb[2], '%');
+ }
+
+ protected static $libBlackness = ['color'];
+ protected function libBlackness($args, $kwargs, $funcName = 'blackness') {
+
+ $color = $this->assertColor($args[0]);
+ $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]);
+
+ return new Number($hwb[3], '%');
+ }
+ */
+
+ /**
+ * @param array $color
+ * @param int $idx
+ * @param int|float $amount
+ *
+ * @return array
+ */
protected function adjustHsl($color, $idx, $amount)
{
$hsl = $this->toHSL($color[1], $color[2], $color[3]);
$hsl[$idx] += $amount;
+
+ if ($idx !== 1) {
+ // Clamp the saturation and lightness
+ $hsl[$idx] = min(max(0, $hsl[$idx]), 100);
+ }
+
$out = $this->toRGB($hsl[1], $hsl[2], $hsl[3]);
if (isset($color[4])) {
@@ -6140,8 +8483,8 @@ class Compiler
protected static $libAdjustHue = ['color', 'degrees'];
protected function libAdjustHue($args)
{
- $color = $this->assertColor($args[0]);
- $degrees = $this->assertNumber($args[1]);
+ $color = $this->assertColor($args[0], 'color');
+ $degrees = $this->assertNumber($args[1], 'degrees')->getDimension();
return $this->adjustHsl($color, 1, $degrees);
}
@@ -6149,7 +8492,7 @@ class Compiler
protected static $libLighten = ['color', 'amount'];
protected function libLighten($args)
{
- $color = $this->assertColor($args[0]);
+ $color = $this->assertColor($args[0], 'color');
$amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%');
return $this->adjustHsl($color, 3, $amount);
@@ -6158,34 +8501,36 @@ class Compiler
protected static $libDarken = ['color', 'amount'];
protected function libDarken($args)
{
- $color = $this->assertColor($args[0]);
+ $color = $this->assertColor($args[0], 'color');
$amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%');
return $this->adjustHsl($color, 3, -$amount);
}
- protected static $libSaturate = [['color', 'amount'], ['number']];
+ protected static $libSaturate = [['color', 'amount'], ['amount']];
protected function libSaturate($args)
{
$value = $args[0];
- if ($value[0] === Type::T_NUMBER) {
+ if (count($args) === 1) {
+ $this->assertNumber($args[0], 'amount');
+
return null;
}
- $color = $this->assertColor($value);
- $amount = 100 * $this->coercePercent($args[1]);
+ $color = $this->assertColor($args[0], 'color');
+ $amount = $this->assertNumber($args[1], 'amount');
- return $this->adjustHsl($color, 2, $amount);
+ return $this->adjustHsl($color, 2, $amount->valueInRange(0, 100, 'amount'));
}
protected static $libDesaturate = ['color', 'amount'];
protected function libDesaturate($args)
{
- $color = $this->assertColor($args[0]);
- $amount = 100 * $this->coercePercent($args[1]);
+ $color = $this->assertColor($args[0], 'color');
+ $amount = $this->assertNumber($args[1], 'amount');
- return $this->adjustHsl($color, 2, -$amount);
+ return $this->adjustHsl($color, 2, -$amount->valueInRange(0, 100, 'amount'));
}
protected static $libGrayscale = ['color'];
@@ -6193,55 +8538,51 @@ class Compiler
{
$value = $args[0];
- if ($value[0] === Type::T_NUMBER) {
+ if ($value instanceof Number) {
return null;
}
- return $this->adjustHsl($this->assertColor($value), 2, -100);
+ return $this->adjustHsl($this->assertColor($value, 'color'), 2, -100);
}
protected static $libComplement = ['color'];
protected function libComplement($args)
{
- return $this->adjustHsl($this->assertColor($args[0]), 1, 180);
+ return $this->adjustHsl($this->assertColor($args[0], 'color'), 1, 180);
}
- protected static $libInvert = ['color', 'weight:1'];
+ protected static $libInvert = ['color', 'weight:100%'];
protected function libInvert($args)
{
- list($value, $weight) = $args;
+ $value = $args[0];
- if (! isset($weight)) {
- $weight = 1;
- } else {
- $weight = $this->coercePercent($weight);
- }
+ $weight = $this->assertNumber($args[1], 'weight');
+
+ if ($value instanceof Number) {
+ if ($weight->getDimension() != 100 || !$weight->hasUnit('%')) {
+ throw new SassScriptException('Only one argument may be passed to the plain-CSS invert() function.');
+ }
- if ($value[0] === Type::T_NUMBER) {
return null;
}
- $color = $this->assertColor($value);
+ $color = $this->assertColor($value, 'color');
$inverted = $color;
$inverted[1] = 255 - $inverted[1];
$inverted[2] = 255 - $inverted[2];
$inverted[3] = 255 - $inverted[3];
- if ($weight < 1) {
- return $this->libMix([$inverted, $color, [Type::T_NUMBER, $weight]]);
- }
-
- return $inverted;
+ return $this->libMix([$inverted, $color, $weight]);
}
// increases opacity by amount
protected static $libOpacify = ['color', 'amount'];
protected function libOpacify($args)
{
- $color = $this->assertColor($args[0]);
- $amount = $this->coercePercent($args[1]);
+ $color = $this->assertColor($args[0], 'color');
+ $amount = $this->assertNumber($args[1], 'amount');
- $color[4] = (isset($color[4]) ? $color[4] : 1) + $amount;
+ $color[4] = (isset($color[4]) ? $color[4] : 1) + $amount->valueInRange(0, 1, 'amount');
$color[4] = min(1, max(0, $color[4]));
return $color;
@@ -6257,10 +8598,10 @@ class Compiler
protected static $libTransparentize = ['color', 'amount'];
protected function libTransparentize($args)
{
- $color = $this->assertColor($args[0]);
- $amount = $this->coercePercent($args[1]);
+ $color = $this->assertColor($args[0], 'color');
+ $amount = $this->assertNumber($args[1], 'amount');
- $color[4] = (isset($color[4]) ? $color[4] : 1) - $amount;
+ $color[4] = (isset($color[4]) ? $color[4] : 1) - $amount->valueInRange(0, 1, 'amount');
$color[4] = min(1, max(0, $color[4]));
return $color;
@@ -6275,166 +8616,165 @@ class Compiler
protected static $libUnquote = ['string'];
protected function libUnquote($args)
{
- $str = $args[0];
+ try {
+ $str = $this->assertString($args[0], 'string');
+ } catch (SassScriptException $e) {
+ $value = $this->compileValue($args[0]);
+ $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]);
+ $line = $this->sourceLine;
- if ($str[0] === Type::T_STRING) {
- $str[1] = '';
+ $message = "Passing $value, a non-string value, to unquote()
+will be an error in future versions of Sass.\n on line $line of $fname";
+
+ $this->logger->warn($message, true);
+
+ return $args[0];
}
+ $str[1] = '';
+
return $str;
}
protected static $libQuote = ['string'];
protected function libQuote($args)
{
- $value = $args[0];
+ $value = $this->assertString($args[0], 'string');
- if ($value[0] === Type::T_STRING && ! empty($value[1])) {
- return $value;
- }
+ $value[1] = '"';
- return [Type::T_STRING, '"', [$value]];
+ return $value;
}
- protected static $libPercentage = ['value'];
+ protected static $libPercentage = ['number'];
protected function libPercentage($args)
{
- return new Node\Number($this->coercePercent($args[0]) * 100, '%');
+ $num = $this->assertNumber($args[0], 'number');
+ $num->assertNoUnits('number');
+
+ return new Number($num->getDimension() * 100, '%');
}
- protected static $libRound = ['value'];
+ protected static $libRound = ['number'];
protected function libRound($args)
{
- $num = $args[0];
+ $num = $this->assertNumber($args[0], 'number');
- return new Node\Number(round($num[1]), $num[2]);
+ return new Number(round($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits());
}
- protected static $libFloor = ['value'];
+ protected static $libFloor = ['number'];
protected function libFloor($args)
{
- $num = $args[0];
+ $num = $this->assertNumber($args[0], 'number');
- return new Node\Number(floor($num[1]), $num[2]);
+ return new Number(floor($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits());
}
- protected static $libCeil = ['value'];
+ protected static $libCeil = ['number'];
protected function libCeil($args)
{
- $num = $args[0];
+ $num = $this->assertNumber($args[0], 'number');
- return new Node\Number(ceil($num[1]), $num[2]);
+ return new Number(ceil($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits());
}
- protected static $libAbs = ['value'];
+ protected static $libAbs = ['number'];
protected function libAbs($args)
{
- $num = $args[0];
+ $num = $this->assertNumber($args[0], 'number');
- return new Node\Number(abs($num[1]), $num[2]);
+ return new Number(abs($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits());
}
+ protected static $libMin = ['numbers...'];
protected function libMin($args)
{
- $numbers = $this->getNormalizedNumbers($args);
+ /**
+ * @var Number|null
+ */
$min = null;
- foreach ($numbers as $key => $number) {
- if (is_null($min) || $number[1] <= $min[1]) {
- $min = [$key, $number[1]];
+ foreach ($args[0][2] as $arg) {
+ $number = $this->assertNumber($arg);
+
+ if (\is_null($min) || $min->greaterThan($number)) {
+ $min = $number;
}
}
- return $args[$min[0]];
+ if (!\is_null($min)) {
+ return $min;
+ }
+
+ throw $this->error('At least one argument must be passed.');
}
+ protected static $libMax = ['numbers...'];
protected function libMax($args)
{
- $numbers = $this->getNormalizedNumbers($args);
+ /**
+ * @var Number|null
+ */
$max = null;
- foreach ($numbers as $key => $number) {
- if (is_null($max) || $number[1] >= $max[1]) {
- $max = [$key, $number[1]];
+ foreach ($args[0][2] as $arg) {
+ $number = $this->assertNumber($arg);
+
+ if (\is_null($max) || $max->lessThan($number)) {
+ $max = $number;
}
}
- return $args[$max[0]];
- }
-
- /**
- * Helper to normalize args containing numbers
- *
- * @param array $args
- *
- * @return array
- */
- protected function getNormalizedNumbers($args)
- {
- $unit = null;
- $originalUnit = null;
- $numbers = [];
-
- foreach ($args as $key => $item) {
- if ($item[0] !== Type::T_NUMBER) {
- $this->throwError('%s is not a number', $item[0]);
- break;
- }
-
- $number = $item->normalize();
-
- if (is_null($unit)) {
- $unit = $number[2];
- $originalUnit = $item->unitStr();
- } elseif ($number[1] && $unit !== $number[2]) {
- $this->throwError('Incompatible units: "%s" and "%s".', $originalUnit, $item->unitStr());
- break;
- }
-
- $numbers[$key] = $number;
+ if (!\is_null($max)) {
+ return $max;
}
- return $numbers;
+ throw $this->error('At least one argument must be passed.');
}
protected static $libLength = ['list'];
protected function libLength($args)
{
- $list = $this->coerceList($args[0]);
+ $list = $this->coerceList($args[0], ',', true);
- return count($list[2]);
+ return new Number(\count($list[2]), '');
}
- //protected static $libListSeparator = ['list...'];
+ protected static $libListSeparator = ['list'];
protected function libListSeparator($args)
{
- if (count($args) > 1) {
- return 'comma';
+ if (! \in_array($args[0][0], [Type::T_LIST, Type::T_MAP])) {
+ return [Type::T_KEYWORD, 'space'];
}
$list = $this->coerceList($args[0]);
- if (count($list[2]) <= 1) {
- return 'space';
+ if ($list[1] === '' && \count($list[2]) <= 1 && empty($list['enclosing'])) {
+ return [Type::T_KEYWORD, 'space'];
}
if ($list[1] === ',') {
- return 'comma';
+ return [Type::T_KEYWORD, 'comma'];
}
- return 'space';
+ if ($list[1] === '/') {
+ return [Type::T_KEYWORD, 'slash'];
+ }
+
+ return [Type::T_KEYWORD, 'space'];
}
protected static $libNth = ['list', 'n'];
protected function libNth($args)
{
- $list = $this->coerceList($args[0]);
- $n = $this->assertNumber($args[1]);
+ $list = $this->coerceList($args[0], ',', false);
+ $n = $this->assertNumber($args[1])->getDimension();
if ($n > 0) {
$n--;
} elseif ($n < 0) {
- $n += count($list[2]);
+ $n += \count($list[2]);
}
return isset($list[2][$n]) ? $list[2][$n] : static::$defaultValue;
@@ -6444,18 +8784,16 @@ class Compiler
protected function libSetNth($args)
{
$list = $this->coerceList($args[0]);
- $n = $this->assertNumber($args[1]);
+ $n = $this->assertNumber($args[1])->getDimension();
if ($n > 0) {
$n--;
} elseif ($n < 0) {
- $n += count($list[2]);
+ $n += \count($list[2]);
}
if (! isset($list[2][$n])) {
- $this->throwError('Invalid argument for "n"');
-
- return null;
+ throw $this->error('Invalid argument for "n"');
}
$list[2][$n] = $args[2];
@@ -6463,29 +8801,78 @@ class Compiler
return $list;
}
- protected static $libMapGet = ['map', 'key'];
+ protected static $libMapGet = ['map', 'key', 'keys...'];
protected function libMapGet($args)
{
- $map = $this->assertMap($args[0]);
- $key = $args[1];
+ $map = $this->assertMap($args[0], 'map');
+ if (!isset($args[2])) {
+ // BC layer for usages of the function from PHP code rather than from the Sass function
+ $args[2] = self::$emptyArgumentList;
+ }
+ $keys = array_merge([$args[1]], $args[2][2]);
+ $value = static::$null;
- if (! is_null($key)) {
- $key = $this->compileStringContent($this->coerceString($key));
+ foreach ($keys as $key) {
+ if (!\is_array($map) || $map[0] !== Type::T_MAP) {
+ return static::$null;
+ }
- for ($i = count($map[1]) - 1; $i >= 0; $i--) {
- if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) {
- return $map[2][$i];
- }
+ $map = $this->mapGet($map, $key);
+
+ if ($map === null) {
+ return static::$null;
+ }
+
+ $value = $map;
+ }
+
+ return $value;
+ }
+
+ /**
+ * Gets the value corresponding to that key in the map
+ *
+ * @param array $map
+ * @param Number|array $key
+ *
+ * @return Number|array|null
+ */
+ private function mapGet(array $map, $key)
+ {
+ $index = $this->mapGetEntryIndex($map, $key);
+
+ if ($index !== null) {
+ return $map[2][$index];
+ }
+
+ return null;
+ }
+
+ /**
+ * Gets the index corresponding to that key in the map entries
+ *
+ * @param array $map
+ * @param Number|array $key
+ *
+ * @return int|null
+ */
+ private function mapGetEntryIndex(array $map, $key)
+ {
+ $key = $this->compileStringContent($this->coerceString($key));
+
+ for ($i = \count($map[1]) - 1; $i >= 0; $i--) {
+ if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) {
+ return $i;
}
}
- return static::$null;
+ return null;
}
protected static $libMapKeys = ['map'];
protected function libMapKeys($args)
{
- $map = $this->assertMap($args[0]);
+ $map = $this->assertMap($args[0], 'map');
$keys = $map[1];
return [Type::T_LIST, ',', $keys];
@@ -6494,20 +8881,33 @@ class Compiler
protected static $libMapValues = ['map'];
protected function libMapValues($args)
{
- $map = $this->assertMap($args[0]);
+ $map = $this->assertMap($args[0], 'map');
$values = $map[2];
return [Type::T_LIST, ',', $values];
}
- protected static $libMapRemove = ['map', 'key'];
+ protected static $libMapRemove = [
+ ['map'],
+ ['map', 'key', 'keys...'],
+ ];
protected function libMapRemove($args)
{
- $map = $this->assertMap($args[0]);
- $key = $this->compileStringContent($this->coerceString($args[1]));
+ $map = $this->assertMap($args[0], 'map');
- for ($i = count($map[1]) - 1; $i >= 0; $i--) {
- if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) {
+ if (\count($args) === 1) {
+ return $map;
+ }
+
+ $keys = [];
+ $keys[] = $this->compileStringContent($this->coerceString($args[1]));
+
+ foreach ($args[2][2] as $key) {
+ $keys[] = $this->compileStringContent($this->coerceString($key));
+ }
+
+ for ($i = \count($map[1]) - 1; $i >= 0; $i--) {
+ if (in_array($this->compileStringContent($this->coerceString($map[1][$i])), $keys)) {
array_splice($map[1], $i, 1);
array_splice($map[2], $i, 1);
}
@@ -6516,13 +8916,40 @@ class Compiler
return $map;
}
- protected static $libMapHasKey = ['map', 'key'];
+ protected static $libMapHasKey = ['map', 'key', 'keys...'];
protected function libMapHasKey($args)
{
- $map = $this->assertMap($args[0]);
- $key = $this->compileStringContent($this->coerceString($args[1]));
+ $map = $this->assertMap($args[0], 'map');
+ if (!isset($args[2])) {
+ // BC layer for usages of the function from PHP code rather than from the Sass function
+ $args[2] = self::$emptyArgumentList;
+ }
+ $keys = array_merge([$args[1]], $args[2][2]);
+ $lastKey = array_pop($keys);
- for ($i = count($map[1]) - 1; $i >= 0; $i--) {
+ foreach ($keys as $key) {
+ $value = $this->mapGet($map, $key);
+
+ if ($value === null || $value instanceof Number || $value[0] !== Type::T_MAP) {
+ return self::$false;
+ }
+
+ $map = $value;
+ }
+
+ return $this->toBool($this->mapHasKey($map, $lastKey));
+ }
+
+ /**
+ * @param array|Number $keyValue
+ *
+ * @return bool
+ */
+ private function mapHasKey(array $map, $keyValue)
+ {
+ $key = $this->compileStringContent($this->coerceString($keyValue));
+
+ for ($i = \count($map[1]) - 1; $i >= 0; $i--) {
if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) {
return true;
}
@@ -6531,23 +8958,129 @@ class Compiler
return false;
}
- protected static $libMapMerge = ['map-1', 'map-2'];
+ protected static $libMapMerge = [
+ ['map1', 'map2'],
+ ['map-1', 'map-2'],
+ ['map1', 'args...']
+ ];
protected function libMapMerge($args)
{
- $map1 = $this->assertMap($args[0]);
- $map2 = $this->assertMap($args[1]);
+ $map1 = $this->assertMap($args[0], 'map1');
+ $map2 = $args[1];
+ $keys = [];
+ if ($map2[0] === Type::T_LIST && isset($map2[3]) && \is_array($map2[3])) {
+ // This is an argument list for the variadic signature
+ if (\count($map2[2]) === 0) {
+ throw new SassScriptException('Expected $args to contain a key.');
+ }
+ if (\count($map2[2]) === 1) {
+ throw new SassScriptException('Expected $args to contain a value.');
+ }
+ $keys = $map2[2];
+ $map2 = array_pop($keys);
+ }
+ $map2 = $this->assertMap($map2, 'map2');
- foreach ($map2[1] as $i2 => $key2) {
- $key = $this->compileStringContent($this->coerceString($key2));
+ return $this->modifyMap($map1, $keys, function ($oldValue) use ($map2) {
+ $nestedMap = $this->tryMap($oldValue);
- foreach ($map1[1] as $i1 => $key1) {
- if ($key === $this->compileStringContent($this->coerceString($key1))) {
- $map1[2][$i1] = $map2[2][$i2];
- continue 2;
- }
+ if ($nestedMap === null) {
+ return $map2;
}
- $map1[1][] = $map2[1][$i2];
+ return $this->mergeMaps($nestedMap, $map2);
+ });
+ }
+
+ /**
+ * @param array $map
+ * @param array $keys
+ * @param callable $modify
+ * @param bool $addNesting
+ *
+ * @return Number|array
+ *
+ * @phpstan-param array $keys
+ * @phpstan-param callable(Number|array): (Number|array) $modify
+ */
+ private function modifyMap(array $map, array $keys, callable $modify, $addNesting = true)
+ {
+ if ($keys === []) {
+ return $modify($map);
+ }
+
+ return $this->modifyNestedMap($map, $keys, $modify, $addNesting);
+ }
+
+ /**
+ * @param array $map
+ * @param array $keys
+ * @param callable $modify
+ * @param bool $addNesting
+ *
+ * @return array
+ *
+ * @phpstan-param non-empty-array $keys
+ * @phpstan-param callable(Number|array): (Number|array) $modify
+ */
+ private function modifyNestedMap(array $map, array $keys, callable $modify, $addNesting)
+ {
+ $key = array_shift($keys);
+
+ $nestedValueIndex = $this->mapGetEntryIndex($map, $key);
+
+ if ($keys === []) {
+ if ($nestedValueIndex !== null) {
+ $map[2][$nestedValueIndex] = $modify($map[2][$nestedValueIndex]);
+ } else {
+ $map[1][] = $key;
+ $map[2][] = $modify(self::$null);
+ }
+
+ return $map;
+ }
+
+ $nestedMap = $nestedValueIndex !== null ? $this->tryMap($map[2][$nestedValueIndex]) : null;
+
+ if ($nestedMap === null && !$addNesting) {
+ return $map;
+ }
+
+ if ($nestedMap === null) {
+ $nestedMap = self::$emptyMap;
+ }
+
+ $newNestedMap = $this->modifyNestedMap($nestedMap, $keys, $modify, $addNesting);
+
+ if ($nestedValueIndex !== null) {
+ $map[2][$nestedValueIndex] = $newNestedMap;
+ } else {
+ $map[1][] = $key;
+ $map[2][] = $newNestedMap;
+ }
+
+ return $map;
+ }
+
+ /**
+ * Merges 2 Sass maps together
+ *
+ * @param array $map1
+ * @param array $map2
+ *
+ * @return array
+ */
+ private function mergeMaps(array $map1, array $map2)
+ {
+ foreach ($map2[1] as $i2 => $key2) {
+ $map1EntryIndex = $this->mapGetEntryIndex($map1, $key2);
+
+ if ($map1EntryIndex !== null) {
+ $map1[2][$map1EntryIndex] = $map2[2][$i2];
+ continue;
+ }
+
+ $map1[1][] = $key2;
$map1[2][] = $map2[2][$i2];
}
@@ -6557,12 +9090,18 @@ class Compiler
protected static $libKeywords = ['args'];
protected function libKeywords($args)
{
- $this->assertList($args[0]);
+ $value = $args[0];
+
+ if ($value[0] !== Type::T_LIST || !isset($value[3]) || !\is_array($value[3])) {
+ $compiledValue = $this->compileValue($value);
+
+ throw SassScriptException::forArgument($compiledValue . ' is not an argument list.', 'args');
+ }
$keys = [];
$values = [];
- foreach ($args[0][2] as $name => $arg) {
+ foreach ($this->getArgumentListKeywords($value) as $name => $arg) {
$keys[] = [Type::T_KEYWORD, $name];
$values[] = $arg;
}
@@ -6575,15 +9114,27 @@ class Compiler
{
$list = $args[0];
$this->coerceList($list, ' ');
+
if (! empty($list['enclosing']) && $list['enclosing'] === 'bracket') {
- return true;
+ return self::$true;
}
- return false;
+
+ return self::$false;
}
-
+ /**
+ * @param array $list1
+ * @param array|Number|null $sep
+ *
+ * @return string
+ * @throws CompilerException
+ *
+ * @deprecated
+ */
protected function listSeparatorForJoin($list1, $sep)
{
+ @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED);
+
if (! isset($sep)) {
return $list1[1];
}
@@ -6600,14 +9151,40 @@ class Compiler
}
}
- protected static $libJoin = ['list1', 'list2', 'separator:null', 'bracketed:auto'];
+ protected static $libJoin = ['list1', 'list2', 'separator:auto', 'bracketed:auto'];
protected function libJoin($args)
{
list($list1, $list2, $sep, $bracketed) = $args;
- $list1 = $this->coerceList($list1, ' ');
- $list2 = $this->coerceList($list2, ' ');
- $sep = $this->listSeparatorForJoin($list1, $sep);
+ $list1 = $this->coerceList($list1, ' ', true);
+ $list2 = $this->coerceList($list2, ' ', true);
+
+ switch ($this->compileStringContent($this->assertString($sep, 'separator'))) {
+ case 'comma':
+ $separator = ',';
+ break;
+
+ case 'space':
+ $separator = ' ';
+ break;
+
+ case 'slash':
+ $separator = '/';
+ break;
+
+ case 'auto':
+ if ($list1[1] !== '' || count($list1[2]) > 1 || !empty($list1['enclosing']) && $list1['enclosing'] !== 'parent') {
+ $separator = $list1[1] ?: ' ';
+ } elseif ($list2[1] !== '' || count($list2[2]) > 1 || !empty($list2['enclosing']) && $list2['enclosing'] !== 'parent') {
+ $separator = $list2[1] ?: ' ';
+ } else {
+ $separator = ' ';
+ }
+ break;
+
+ default:
+ throw SassScriptException::forArgument('Must be "space", "comma", "slash", or "auto".', 'separator');
+ }
if ($bracketed === static::$true) {
$bracketed = true;
@@ -6620,6 +9197,7 @@ class Compiler
} else {
$bracketed = $this->compileValue($bracketed);
$bracketed = ! ! $bracketed;
+
if ($bracketed === true) {
$bracketed = true;
}
@@ -6627,60 +9205,91 @@ class Compiler
if ($bracketed === 'auto') {
$bracketed = false;
+
if (! empty($list1['enclosing']) && $list1['enclosing'] === 'bracket') {
$bracketed = true;
}
}
- $res = [Type::T_LIST, $sep, array_merge($list1[2], $list2[2])];
- if (isset($list1['enclosing'])) {
- $res['enlcosing'] = $list1['enclosing'];
- }
+ $res = [Type::T_LIST, $separator, array_merge($list1[2], $list2[2])];
+
if ($bracketed) {
$res['enclosing'] = 'bracket';
}
+
return $res;
}
- protected static $libAppend = ['list', 'val', 'separator:null'];
+ protected static $libAppend = ['list', 'val', 'separator:auto'];
protected function libAppend($args)
{
list($list1, $value, $sep) = $args;
- $list1 = $this->coerceList($list1, ' ');
- $sep = $this->listSeparatorForJoin($list1, $sep);
+ $list1 = $this->coerceList($list1, ' ', true);
+
+ switch ($this->compileStringContent($this->assertString($sep, 'separator'))) {
+ case 'comma':
+ $separator = ',';
+ break;
+
+ case 'space':
+ $separator = ' ';
+ break;
+
+ case 'slash':
+ $separator = '/';
+ break;
+
+ case 'auto':
+ $separator = $list1[1] === '' && \count($list1[2]) <= 1 && (empty($list1['enclosing']) || $list1['enclosing'] === 'parent') ? ' ' : $list1[1];
+ break;
+
+ default:
+ throw SassScriptException::forArgument('Must be "space", "comma", "slash", or "auto".', 'separator');
+ }
+
+ $res = [Type::T_LIST, $separator, array_merge($list1[2], [$value])];
- $res = [Type::T_LIST, $sep, array_merge($list1[2], [$value])];
if (isset($list1['enclosing'])) {
$res['enclosing'] = $list1['enclosing'];
}
+
return $res;
}
+ protected static $libZip = ['lists...'];
protected function libZip($args)
{
- foreach ($args as $key => $arg) {
- $args[$key] = $this->coerceList($arg);
+ $argLists = [];
+ foreach ($args[0][2] as $arg) {
+ $argLists[] = $this->coerceList($arg);
}
$lists = [];
- $firstList = array_shift($args);
+ $firstList = array_shift($argLists);
- foreach ($firstList[2] as $key => $item) {
- $list = [Type::T_LIST, '', [$item]];
+ $result = [Type::T_LIST, ',', $lists];
+ if (! \is_null($firstList)) {
+ foreach ($firstList[2] as $key => $item) {
+ $list = [Type::T_LIST, ' ', [$item]];
- foreach ($args as $arg) {
- if (isset($arg[2][$key])) {
- $list[2][] = $arg[2][$key];
- } else {
- break 2;
+ foreach ($argLists as $arg) {
+ if (isset($arg[2][$key])) {
+ $list[2][] = $arg[2][$key];
+ } else {
+ break 2;
+ }
}
+
+ $lists[] = $list;
}
- $lists[] = $list;
+ $result[2] = $lists;
+ } else {
+ $result['enclosing'] = 'parent';
}
- return [Type::T_LIST, ',', $lists];
+ return $result;
}
protected static $libTypeOf = ['value'];
@@ -6688,6 +9297,16 @@ class Compiler
{
$value = $args[0];
+ return [Type::T_KEYWORD, $this->getTypeOf($value)];
+ }
+
+ /**
+ * @param array|Number $value
+ *
+ * @return string
+ */
+ private function getTypeOf($value)
+ {
switch ($value[0]) {
case Type::T_KEYWORD:
if ($value === static::$true || $value === static::$false) {
@@ -6702,8 +9321,11 @@ class Compiler
case Type::T_FUNCTION:
return 'string';
+ case Type::T_FUNCTION_REFERENCE:
+ return 'function';
+
case Type::T_LIST:
- if (isset($value[3]) && $value[3]) {
+ if (isset($value[3]) && \is_array($value[3])) {
return 'arglist';
}
@@ -6716,68 +9338,77 @@ class Compiler
protected static $libUnit = ['number'];
protected function libUnit($args)
{
- $num = $args[0];
+ $num = $this->assertNumber($args[0], 'number');
- if ($num[0] === Type::T_NUMBER) {
- return [Type::T_STRING, '"', [$num->unitStr()]];
- }
-
- return '';
+ return [Type::T_STRING, '"', [$num->unitStr()]];
}
protected static $libUnitless = ['number'];
protected function libUnitless($args)
{
- $value = $args[0];
+ $value = $this->assertNumber($args[0], 'number');
- return $value[0] === Type::T_NUMBER && $value->unitless();
+ return $this->toBool($value->unitless());
}
- protected static $libComparable = ['number-1', 'number-2'];
+ protected static $libComparable = [
+ ['number1', 'number2'],
+ ['number-1', 'number-2']
+ ];
protected function libComparable($args)
{
list($number1, $number2) = $args;
- if (! isset($number1[0]) || $number1[0] !== Type::T_NUMBER ||
- ! isset($number2[0]) || $number2[0] !== Type::T_NUMBER
+ if (
+ ! $number1 instanceof Number ||
+ ! $number2 instanceof Number
) {
- $this->throwError('Invalid argument(s) for "comparable"');
-
- return null;
+ throw $this->error('Invalid argument(s) for "comparable"');
}
- $number1 = $number1->normalize();
- $number2 = $number2->normalize();
-
- return $number1[2] === $number2[2] || $number1->unitless() || $number2->unitless();
+ return $this->toBool($number1->isComparableTo($number2));
}
protected static $libStrIndex = ['string', 'substring'];
protected function libStrIndex($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'string');
$stringContent = $this->compileStringContent($string);
- $substring = $this->coerceString($args[1]);
+ $substring = $this->assertString($args[1], 'substring');
$substringContent = $this->compileStringContent($substring);
- $result = strpos($stringContent, $substringContent);
+ if (! \strlen($substringContent)) {
+ $result = 0;
+ } else {
+ $result = Util::mbStrpos($stringContent, $substringContent);
+ }
- return $result === false ? static::$null : new Node\Number($result + 1, '');
+ return $result === false ? static::$null : new Number($result + 1, '');
}
protected static $libStrInsert = ['string', 'insert', 'index'];
protected function libStrInsert($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'string');
$stringContent = $this->compileStringContent($string);
- $insert = $this->coerceString($args[1]);
+ $insert = $this->assertString($args[1], 'insert');
$insertContent = $this->compileStringContent($insert);
- list(, $index) = $args[2];
+ $index = $this->assertInteger($args[2], 'index');
+ if ($index > 0) {
+ $index = $index - 1;
+ }
+ if ($index < 0) {
+ $index = max(Util::mbStrlen($stringContent) + 1 + $index, 0);
+ }
- $string[2] = [substr_replace($stringContent, $insertContent, $index - 1, 0)];
+ $string[2] = [
+ Util::mbSubstr($stringContent, 0, $index),
+ $insertContent,
+ Util::mbSubstr($stringContent, $index)
+ ];
return $string;
}
@@ -6785,34 +9416,46 @@ class Compiler
protected static $libStrLength = ['string'];
protected function libStrLength($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'string');
$stringContent = $this->compileStringContent($string);
- return new Node\Number(strlen($stringContent), '');
+ return new Number(Util::mbStrlen($stringContent), '');
}
protected static $libStrSlice = ['string', 'start-at', 'end-at:-1'];
protected function libStrSlice($args)
{
- if (isset($args[2]) && ! $args[2][1]) {
- return static::$nullString;
- }
-
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'string');
$stringContent = $this->compileStringContent($string);
- $start = (int) $args[1][1];
+ $start = $this->assertNumber($args[1], 'start-at');
+ $start->assertNoUnits('start-at');
+ $startInt = $this->assertInteger($start, 'start-at');
+ $end = $this->assertNumber($args[2], 'end-at');
+ $end->assertNoUnits('end-at');
+ $endInt = $this->assertInteger($end, 'end-at');
- if ($start > 0) {
- $start--;
+ if ($endInt === 0) {
+ return [Type::T_STRING, $string[1], []];
}
- $end = isset($args[2]) ? (int) $args[2][1] : -1;
- $length = $end < 0 ? $end + 1 : ($end > 0 ? $end - $start : $end);
+ if ($startInt > 0) {
+ $startInt--;
+ }
- $string[2] = $length
- ? [substr($stringContent, $start, $length)]
- : [substr($stringContent, $start)];
+ if ($endInt < 0) {
+ $endInt = Util::mbStrlen($stringContent) + $endInt;
+ } else {
+ $endInt--;
+ }
+
+ if ($endInt < $startInt) {
+ return [Type::T_STRING, $string[1], []];
+ }
+
+ $length = $endInt - $startInt + 1; // The end of the slice is inclusive
+
+ $string[2] = [Util::mbSubstr($stringContent, $startInt, $length)];
return $string;
}
@@ -6820,10 +9463,10 @@ class Compiler
protected static $libToLowerCase = ['string'];
protected function libToLowerCase($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'string');
$stringContent = $this->compileStringContent($string);
- $string[2] = [function_exists('mb_strtolower') ? mb_strtolower($stringContent) : strtolower($stringContent)];
+ $string[2] = [$this->stringTransformAsciiOnly($stringContent, 'strtolower')];
return $string;
}
@@ -6831,75 +9474,103 @@ class Compiler
protected static $libToUpperCase = ['string'];
protected function libToUpperCase($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'string');
$stringContent = $this->compileStringContent($string);
- $string[2] = [function_exists('mb_strtoupper') ? mb_strtoupper($stringContent) : strtoupper($stringContent)];
+ $string[2] = [$this->stringTransformAsciiOnly($stringContent, 'strtoupper')];
return $string;
}
+ /**
+ * Apply a filter on a string content, only on ascii chars
+ * let extended chars untouched
+ *
+ * @param string $stringContent
+ * @param callable $filter
+ * @return string
+ */
+ protected function stringTransformAsciiOnly($stringContent, $filter)
+ {
+ $mblength = Util::mbStrlen($stringContent);
+ if ($mblength === strlen($stringContent)) {
+ return $filter($stringContent);
+ }
+ $filteredString = "";
+ for ($i = 0; $i < $mblength; $i++) {
+ $char = Util::mbSubstr($stringContent, $i, 1);
+ if (strlen($char) > 1) {
+ $filteredString .= $char;
+ } else {
+ $filteredString .= $filter($char);
+ }
+ }
+
+ return $filteredString;
+ }
+
protected static $libFeatureExists = ['feature'];
protected function libFeatureExists($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'feature');
$name = $this->compileStringContent($string);
return $this->toBool(
- array_key_exists($name, $this->registeredFeatures) ? $this->registeredFeatures[$name] : false
+ \array_key_exists($name, $this->registeredFeatures) ? $this->registeredFeatures[$name] : false
);
}
protected static $libFunctionExists = ['name'];
protected function libFunctionExists($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'name');
$name = $this->compileStringContent($string);
// user defined functions
if ($this->has(static::$namespaces['function'] . $name)) {
- return true;
+ return self::$true;
}
$name = $this->normalizeName($name);
if (isset($this->userFunctions[$name])) {
- return true;
+ return self::$true;
}
// built-in functions
$f = $this->getBuiltinFunction($name);
- return $this->toBool(is_callable($f));
+ return $this->toBool(\is_callable($f));
}
protected static $libGlobalVariableExists = ['name'];
protected function libGlobalVariableExists($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'name');
$name = $this->compileStringContent($string);
- return $this->has($name, $this->rootEnv);
+ return $this->toBool($this->has($name, $this->rootEnv));
}
protected static $libMixinExists = ['name'];
protected function libMixinExists($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'name');
$name = $this->compileStringContent($string);
- return $this->has(static::$namespaces['mixin'] . $name);
+ return $this->toBool($this->has(static::$namespaces['mixin'] . $name));
}
protected static $libVariableExists = ['name'];
protected function libVariableExists($args)
{
- $string = $this->coerceString($args[0]);
+ $string = $this->assertString($args[0], 'name');
$name = $this->compileStringContent($string);
- return $this->has($name);
+ return $this->toBool($this->has($name));
}
+ protected static $libCounter = ['args...'];
/**
* Workaround IE7's content counter bug.
*
@@ -6909,35 +9580,37 @@ class Compiler
*/
protected function libCounter($args)
{
- $list = array_map([$this, 'compileValue'], $args);
+ $list = array_map([$this, 'compileValue'], $args[0][2]);
return [Type::T_STRING, '', ['counter(' . implode(',', $list) . ')']];
}
- protected static $libRandom = ['limit'];
+ protected static $libRandom = ['limit:null'];
protected function libRandom($args)
{
- if (isset($args[0])) {
- $n = $this->assertNumber($args[0]);
+ if (isset($args[0]) && $args[0] !== static::$null) {
+ $n = $this->assertInteger($args[0], 'limit');
if ($n < 1) {
- $this->throwError("limit must be greater than or equal to 1");
-
- return null;
+ throw new SassScriptException("\$limit: Must be greater than 0, was $n.");
}
- return new Node\Number(mt_rand(1, $n), '');
+ return new Number(mt_rand(1, $n), '');
}
- return new Node\Number(mt_rand(1, mt_getrandmax()), '');
+ $max = mt_getrandmax();
+ return new Number(mt_rand(0, $max - 1) / $max, '');
}
+ protected static $libUniqueId = [];
protected function libUniqueId()
{
static $id;
if (! isset($id)) {
- $id = mt_rand(0, pow(36, 8));
+ $id = PHP_INT_SIZE === 4
+ ? mt_rand(0, pow(36, 5)) . str_pad(mt_rand(0, pow(36, 5)) % 10000000, 7, '0', STR_PAD_LEFT)
+ : mt_rand(0, pow(36, 8));
}
$id += mt_rand(0, 10) + 1;
@@ -6945,29 +9618,47 @@ class Compiler
return [Type::T_STRING, '', ['u' . str_pad(base_convert($id, 10, 36), 8, '0', STR_PAD_LEFT)]];
}
+ /**
+ * @param array|Number $value
+ * @param bool $force_enclosing_display
+ *
+ * @return array
+ */
protected function inspectFormatValue($value, $force_enclosing_display = false)
{
if ($value === static::$null) {
$value = [Type::T_KEYWORD, 'null'];
}
+
$stringValue = [$value];
+
+ if ($value instanceof Number) {
+ return [Type::T_STRING, '', $stringValue];
+ }
+
if ($value[0] === Type::T_LIST) {
if (end($value[2]) === static::$null) {
array_pop($value[2]);
$value[2][] = [Type::T_STRING, '', ['']];
$force_enclosing_display = true;
}
- if (! empty($value['enclosing'])) {
- if ($force_enclosing_display
- || ($value['enclosing'] === 'bracket' )
- || !count($value[2])) {
- $value['enclosing'] = 'forced_'.$value['enclosing'];
- $force_enclosing_display = true;
- }
+
+ if (
+ ! empty($value['enclosing']) &&
+ ($force_enclosing_display ||
+ ($value['enclosing'] === 'bracket') ||
+ ! \count($value[2]))
+ ) {
+ $value['enclosing'] = 'forced_' . $value['enclosing'];
+ $force_enclosing_display = true;
+ } elseif (! \count($value[2])) {
+ $value['enclosing'] = 'forced_parent';
}
+
foreach ($value[2] as $k => $listelement) {
$value[2][$k] = $this->inspectFormatValue($listelement, $force_enclosing_display);
}
+
$stringValue = [$value];
}
@@ -6978,37 +9669,80 @@ class Compiler
protected function libInspect($args)
{
$value = $args[0];
+
return $this->inspectFormatValue($value);
}
/**
* Preprocess selector args
*
- * @param array $arg
+ * @param array $arg
+ * @param string|null $varname
+ * @param bool $allowParent
*
- * @return array|boolean
+ * @return array
*/
- protected function getSelectorArg($arg)
+ protected function getSelectorArg($arg, $varname = null, $allowParent = false)
{
static $parser = null;
- if (is_null($parser)) {
+ if (\is_null($parser)) {
$parser = $this->parserFactory(__METHOD__);
}
- $arg = $this->libUnquote([$arg]);
+ if (! $this->checkSelectorArgType($arg)) {
+ $var_value = $this->compileValue($arg);
+ throw SassScriptException::forArgument("$var_value is not a valid selector: it must be a string, a list of strings, or a list of lists of strings", $varname);
+ }
+
+
+ if ($arg[0] === Type::T_STRING) {
+ $arg[1] = '';
+ }
$arg = $this->compileValue($arg);
$parsedSelector = [];
- if ($parser->parseSelector($arg, $parsedSelector)) {
+ if ($parser->parseSelector($arg, $parsedSelector, true)) {
$selector = $this->evalSelectors($parsedSelector);
$gluedSelector = $this->glueFunctionSelectors($selector);
+ if (! $allowParent) {
+ foreach ($gluedSelector as $selector) {
+ foreach ($selector as $s) {
+ if (in_array(static::$selfSelector, $s)) {
+ throw SassScriptException::forArgument("Parent selectors aren't allowed here.", $varname);
+ }
+ }
+ }
+ }
+
return $gluedSelector;
}
- return false;
+ throw SassScriptException::forArgument("expected more input, invalid selector.", $varname);
+ }
+
+ /**
+ * Check variable type for getSelectorArg() function
+ * @param array $arg
+ * @param int $maxDepth
+ * @return bool
+ */
+ protected function checkSelectorArgType($arg, $maxDepth = 2)
+ {
+ if ($arg[0] === Type::T_LIST && $maxDepth > 0) {
+ foreach ($arg[2] as $elt) {
+ if (! $this->checkSelectorArgType($elt, $maxDepth - 1)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ if (!in_array($arg[0], [Type::T_STRING, Type::T_KEYWORD])) {
+ return false;
+ }
+ return true;
}
/**
@@ -7016,11 +9750,11 @@ class Compiler
*
* @param array $selectors
*
- * @return string
+ * @return array
*/
protected function formatOutputSelector($selectors)
{
- $selectors = $this->collapseSelectors($selectors, true);
+ $selectors = $this->collapseSelectorsAsList($selectors);
return $selectors;
}
@@ -7030,10 +9764,10 @@ class Compiler
{
list($super, $sub) = $args;
- $super = $this->getSelectorArg($super);
- $sub = $this->getSelectorArg($sub);
+ $super = $this->getSelectorArg($super, 'super');
+ $sub = $this->getSelectorArg($sub, 'sub');
- return $this->isSuperSelector($super, $sub);
+ return $this->toBool($this->isSuperSelector($super, $sub));
}
/**
@@ -7042,17 +9776,35 @@ class Compiler
* @param array $super
* @param array $sub
*
- * @return boolean
+ * @return bool
*/
protected function isSuperSelector($super, $sub)
{
// one and only one selector for each arg
- if (! $super || count($super) !== 1) {
- $this->throwError("Invalid super selector for isSuperSelector()");
+ if (! $super) {
+ throw $this->error('Invalid super selector for isSuperSelector()');
}
- if (! $sub || count($sub) !== 1) {
- $this->throwError("Invalid sub selector for isSuperSelector()");
+ if (! $sub) {
+ throw $this->error('Invalid sub selector for isSuperSelector()');
+ }
+
+ if (count($sub) > 1) {
+ foreach ($sub as $s) {
+ if (! $this->isSuperSelector($super, [$s])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ if (count($super) > 1) {
+ foreach ($super as $s) {
+ if ($this->isSuperSelector([$s], $sub)) {
+ return true;
+ }
+ }
+ return false;
}
$super = reset($super);
@@ -7079,7 +9831,7 @@ class Compiler
$nextMustMatch = true;
$i++;
} else {
- while ($i < count($sub) && ! $this->isSuperPart($node, $sub[$i])) {
+ while ($i < \count($sub) && ! $this->isSuperPart($node, $sub[$i])) {
if ($nextMustMatch) {
return false;
}
@@ -7087,7 +9839,7 @@ class Compiler
$i++;
}
- if ($i >= count($sub)) {
+ if ($i >= \count($sub)) {
return false;
}
@@ -7105,18 +9857,18 @@ class Compiler
* @param array $superParts
* @param array $subParts
*
- * @return boolean
+ * @return bool
*/
protected function isSuperPart($superParts, $subParts)
{
$i = 0;
foreach ($superParts as $superPart) {
- while ($i < count($subParts) && $subParts[$i] !== $superPart) {
+ while ($i < \count($subParts) && $subParts[$i] !== $superPart) {
$i++;
}
- if ($i >= count($subParts)) {
+ if ($i >= \count($subParts)) {
return false;
}
@@ -7133,11 +9885,14 @@ class Compiler
$args = reset($args);
$args = $args[2];
- if (count($args) < 1) {
- $this->throwError("selector-append() needs at least 1 argument");
+ if (\count($args) < 1) {
+ throw $this->error('selector-append() needs at least 1 argument');
}
- $selectors = array_map([$this, 'getSelectorArg'], $args);
+ $selectors = [];
+ foreach ($args as $arg) {
+ $selectors[] = $this->getSelectorArg($arg, 'selector');
+ }
return $this->formatOutputSelector($this->selectorAppend($selectors));
}
@@ -7156,34 +9911,31 @@ class Compiler
$lastSelectors = array_pop($selectors);
if (! $lastSelectors) {
- $this->throwError("Invalid selector list in selector-append()");
+ throw $this->error('Invalid selector list in selector-append()');
}
- while (count($selectors)) {
+ while (\count($selectors)) {
$previousSelectors = array_pop($selectors);
if (! $previousSelectors) {
- $this->throwError("Invalid selector list in selector-append()");
+ throw $this->error('Invalid selector list in selector-append()');
}
// do the trick, happening $lastSelector to $previousSelector
$appended = [];
- foreach ($lastSelectors as $lastSelector) {
- $previous = $previousSelectors;
-
- foreach ($lastSelector as $lastSelectorParts) {
- foreach ($lastSelectorParts as $lastSelectorPart) {
- foreach ($previous as $i => $previousSelector) {
- foreach ($previousSelector as $j => $previousSelectorParts) {
- $previous[$i][$j][] = $lastSelectorPart;
+ foreach ($previousSelectors as $previousSelector) {
+ foreach ($lastSelectors as $lastSelector) {
+ $previous = $previousSelector;
+ foreach ($previousSelector as $j => $previousSelectorParts) {
+ foreach ($lastSelector as $lastSelectorParts) {
+ foreach ($lastSelectorParts as $lastSelectorPart) {
+ $previous[$j][] = $lastSelectorPart;
}
}
}
- }
- foreach ($previous as $ps) {
- $appended[] = $ps;
+ $appended[] = $previous;
}
}
@@ -7193,17 +9945,20 @@ class Compiler
return $lastSelectors;
}
- protected static $libSelectorExtend = ['selectors', 'extendee', 'extender'];
+ protected static $libSelectorExtend = [
+ ['selector', 'extendee', 'extender'],
+ ['selectors', 'extendee', 'extender']
+ ];
protected function libSelectorExtend($args)
{
list($selectors, $extendee, $extender) = $args;
- $selectors = $this->getSelectorArg($selectors);
- $extendee = $this->getSelectorArg($extendee);
- $extender = $this->getSelectorArg($extender);
+ $selectors = $this->getSelectorArg($selectors, 'selector');
+ $extendee = $this->getSelectorArg($extendee, 'extendee');
+ $extender = $this->getSelectorArg($extender, 'extender');
if (! $selectors || ! $extendee || ! $extender) {
- $this->throwError("selector-extend() invalid arguments");
+ throw $this->error('selector-extend() invalid arguments');
}
$extended = $this->extendOrReplaceSelectors($selectors, $extendee, $extender);
@@ -7211,17 +9966,20 @@ class Compiler
return $this->formatOutputSelector($extended);
}
- protected static $libSelectorReplace = ['selectors', 'original', 'replacement'];
+ protected static $libSelectorReplace = [
+ ['selector', 'original', 'replacement'],
+ ['selectors', 'original', 'replacement']
+ ];
protected function libSelectorReplace($args)
{
list($selectors, $original, $replacement) = $args;
- $selectors = $this->getSelectorArg($selectors);
- $original = $this->getSelectorArg($original);
- $replacement = $this->getSelectorArg($replacement);
+ $selectors = $this->getSelectorArg($selectors, 'selector');
+ $original = $this->getSelectorArg($original, 'original');
+ $replacement = $this->getSelectorArg($replacement, 'replacement');
if (! $selectors || ! $original || ! $replacement) {
- $this->throwError("selector-replace() invalid arguments");
+ throw $this->error('selector-replace() invalid arguments');
}
$replaced = $this->extendOrReplaceSelectors($selectors, $original, $replacement, true);
@@ -7233,10 +9991,10 @@ class Compiler
* Extend/replace in selectors
* used by selector-extend and selector-replace that use the same logic
*
- * @param array $selectors
- * @param array $extendee
- * @param array $extender
- * @param boolean $replace
+ * @param array $selectors
+ * @param array $extendee
+ * @param array $extender
+ * @param bool $replace
*
* @return array
*/
@@ -7249,6 +10007,10 @@ class Compiler
$this->extendsMap = [];
foreach ($extendee as $es) {
+ if (\count($es) !== 1) {
+ throw $this->error('Can\'t extend complex selector.');
+ }
+
// only use the first one
$this->pushExtends(reset($es), $extender, null);
}
@@ -7260,12 +10022,12 @@ class Compiler
$extended[] = $selector;
}
- $n = count($extended);
+ $n = \count($extended);
$this->matchExtends($selector, $extended);
// if didnt match, keep the original selector if we are in a replace operation
- if ($replace and count($extended) === $n) {
+ if ($replace && \count($extended) === $n) {
$extended[] = $selector;
}
}
@@ -7283,11 +10045,17 @@ class Compiler
$args = reset($args);
$args = $args[2];
- if (count($args) < 1) {
- $this->throwError("selector-nest() needs at least 1 argument");
+ if (\count($args) < 1) {
+ throw $this->error('selector-nest() needs at least 1 argument');
}
- $selectorsMap = array_map([$this, 'getSelectorArg'], $args);
+ $selectorsMap = [];
+ foreach ($args as $arg) {
+ $selectorsMap[] = $this->getSelectorArg($arg, 'selector', true);
+ }
+
+ assert(!empty($selectorsMap));
+
$envs = [];
foreach ($selectorsMap as $selectors) {
@@ -7304,11 +10072,14 @@ class Compiler
return $this->formatOutputSelector($outputSelectors);
}
- protected static $libSelectorParse = ['selectors'];
+ protected static $libSelectorParse = [
+ ['selector'],
+ ['selectors']
+ ];
protected function libSelectorParse($args)
{
$selectors = reset($args);
- $selectors = $this->getSelectorArg($selectors);
+ $selectors = $this->getSelectorArg($selectors, 'selector');
return $this->formatOutputSelector($selectors);
}
@@ -7318,11 +10089,11 @@ class Compiler
{
list($selectors1, $selectors2) = $args;
- $selectors1 = $this->getSelectorArg($selectors1);
- $selectors2 = $this->getSelectorArg($selectors2);
+ $selectors1 = $this->getSelectorArg($selectors1, 'selectors1');
+ $selectors2 = $this->getSelectorArg($selectors2, 'selectors2');
if (! $selectors1 || ! $selectors2) {
- $this->throwError("selector-unify() invalid arguments");
+ throw $this->error('selector-unify() invalid arguments');
}
// only consider the first compound of each
@@ -7342,15 +10113,15 @@ class Compiler
* @param array $compound1
* @param array $compound2
*
- * @return array|mixed
+ * @return array
*/
protected function unifyCompoundSelectors($compound1, $compound2)
{
- if (! count($compound1)) {
+ if (! \count($compound1)) {
return $compound2;
}
- if (! count($compound2)) {
+ if (! \count($compound2)) {
return $compound1;
}
@@ -7367,7 +10138,7 @@ class Compiler
$unifiedSelectors = [$unifiedCompound];
// do the rest
- while (count($compound1) || count($compound2)) {
+ while (\count($compound1) || \count($compound2)) {
$part1 = end($compound1);
$part2 = end($compound2);
@@ -7458,7 +10229,7 @@ class Compiler
* @param array $part
* @param array $compound
*
- * @return array|boolean
+ * @return array|false
*/
protected function matchPartInCompound($part, $compound)
{
@@ -7467,7 +10238,7 @@ class Compiler
$after = [];
// try to find a match by tag name first
- while (count($before)) {
+ while (\count($before)) {
$p = array_pop($before);
if ($partTag && $partTag !== '*' && $partTag == $this->findTagName($p)) {
@@ -7481,11 +10252,11 @@ class Compiler
$before = $compound;
$after = [];
- while (count($before)) {
+ while (\count($before)) {
$p = array_pop($before);
if ($this->checkCompatibleTags($partTag, $this->findTagName($p))) {
- if (count(array_intersect($part, $p))) {
+ if (\count(array_intersect($part, $p))) {
return [$before, $p, $after];
}
}
@@ -7553,7 +10324,7 @@ class Compiler
* @param string $tag1
* @param string $tag2
*
- * @return array|boolean
+ * @return array|false
*/
protected function checkCompatibleTags($tag1, $tag2)
{
@@ -7561,12 +10332,12 @@ class Compiler
$tags = array_unique($tags);
$tags = array_filter($tags);
- if (count($tags) > 1) {
+ if (\count($tags) > 1) {
$tags = array_diff($tags, ['*']);
}
// not compatible nodes
- if (count($tags) > 1) {
+ if (\count($tags) > 1) {
return false;
}
@@ -7576,9 +10347,9 @@ class Compiler
/**
* Find the html tag name in a selector parts list
*
- * @param array $parts
+ * @param string[] $parts
*
- * @return mixed|string
+ * @return string
*/
protected function findTagName($parts)
{
@@ -7595,7 +10366,7 @@ class Compiler
protected function libSimpleSelectors($args)
{
$selector = reset($args);
- $selector = $this->getSelectorArg($selector);
+ $selector = $this->getSelectorArg($selector, 'selector');
// remove selectors list layer, keeping the first one
$selector = reset($selector);
@@ -7611,4 +10382,27 @@ class Compiler
return [Type::T_LIST, ',', $listParts];
}
+
+ protected static $libScssphpGlob = ['pattern'];
+ protected function libScssphpGlob($args)
+ {
+ @trigger_error(sprintf('The "scssphp-glob" function is deprecated an will be removed in ScssPhp 2.0. Register your own alternative through "%s::registerFunction', __CLASS__), E_USER_DEPRECATED);
+
+ $this->logger->warn('The "scssphp-glob" function is deprecated an will be removed in ScssPhp 2.0.', true);
+
+ $string = $this->assertString($args[0], 'pattern');
+ $pattern = $this->compileStringContent($string);
+ $matches = glob($pattern);
+ $listParts = [];
+
+ foreach ($matches as $match) {
+ if (! is_file($match)) {
+ continue;
+ }
+
+ $listParts[] = [Type::T_STRING, '"', [$match]];
+ }
+
+ return [Type::T_LIST, ',', $listParts];
+ }
}
diff --git a/lib/scssphp/scssphp/src/Compiler/CachedResult.php b/lib/scssphp/scssphp/src/Compiler/CachedResult.php
new file mode 100644
index 000000000..a66291996
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Compiler/CachedResult.php
@@ -0,0 +1,77 @@
+
+ */
+ private $parsedFiles;
+
+ /**
+ * @var array
+ * @phpstan-var list
+ */
+ private $resolvedImports;
+
+ /**
+ * @param CompilationResult $result
+ * @param array $parsedFiles
+ * @param array $resolvedImports
+ *
+ * @phpstan-param list $resolvedImports
+ */
+ public function __construct(CompilationResult $result, array $parsedFiles, array $resolvedImports)
+ {
+ $this->result = $result;
+ $this->parsedFiles = $parsedFiles;
+ $this->resolvedImports = $resolvedImports;
+ }
+
+ /**
+ * @return CompilationResult
+ */
+ public function getResult()
+ {
+ return $this->result;
+ }
+
+ /**
+ * @return array
+ */
+ public function getParsedFiles()
+ {
+ return $this->parsedFiles;
+ }
+
+ /**
+ * @return array
+ *
+ * @phpstan-return list
+ */
+ public function getResolvedImports()
+ {
+ return $this->resolvedImports;
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Compiler/Environment.php b/lib/scssphp/scssphp/src/Compiler/Environment.php
index 03eb86a5d..b205a077f 100644
--- a/lib/scssphp/scssphp/src/Compiler/Environment.php
+++ b/lib/scssphp/scssphp/src/Compiler/Environment.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
class Environment
{
/**
- * @var \ScssPhp\ScssPhp\Block
+ * @var \ScssPhp\ScssPhp\Block|null
*/
public $block;
/**
- * @var \ScssPhp\ScssPhp\Compiler\Environment
+ * @var \ScssPhp\ScssPhp\Compiler\Environment|null
*/
public $parent;
+ /**
+ * @var Environment|null
+ */
+ public $declarationScopeParent;
+
+ /**
+ * @var Environment|null
+ */
+ public $parentStore;
+
+ /**
+ * @var array|null
+ */
+ public $selectors;
+
+ /**
+ * @var string|null
+ */
+ public $marker;
+
/**
* @var array
*/
@@ -39,7 +62,7 @@ class Environment
public $storeUnreduced;
/**
- * @var integer
+ * @var int
*/
public $depth;
}
diff --git a/lib/scssphp/scssphp/src/Exception/CompilerException.php b/lib/scssphp/scssphp/src/Exception/CompilerException.php
index a9d134fca..0b00cf525 100644
--- a/lib/scssphp/scssphp/src/Exception/CompilerException.php
+++ b/lib/scssphp/scssphp/src/Exception/CompilerException.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
-class CompilerException extends \Exception
+class CompilerException extends \Exception implements SassException
{
}
diff --git a/lib/scssphp/scssphp/src/Exception/ParserException.php b/lib/scssphp/scssphp/src/Exception/ParserException.php
index 2fa12dd7a..f0726698f 100644
--- a/lib/scssphp/scssphp/src/Exception/ParserException.php
+++ b/lib/scssphp/scssphp/src/Exception/ParserException.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
-class ParserException extends \Exception
+class ParserException extends \Exception implements SassException
{
+ /**
+ * @var array|null
+ * @phpstan-var array{string, int, int}|null
+ */
+ private $sourcePosition;
+
+ /**
+ * Get source position
+ *
+ * @api
+ *
+ * @return array|null
+ * @phpstan-return array{string, int, int}|null
+ */
+ public function getSourcePosition()
+ {
+ return $this->sourcePosition;
+ }
+
+ /**
+ * Set source position
+ *
+ * @api
+ *
+ * @param array $sourcePosition
+ *
+ * @return void
+ *
+ * @phpstan-param array{string, int, int} $sourcePosition
+ */
+ public function setSourcePosition($sourcePosition)
+ {
+ $this->sourcePosition = $sourcePosition;
+ }
}
diff --git a/lib/scssphp/scssphp/src/Exception/RangeException.php b/lib/scssphp/scssphp/src/Exception/RangeException.php
index ee36c97e1..4be4dee70 100644
--- a/lib/scssphp/scssphp/src/Exception/RangeException.php
+++ b/lib/scssphp/scssphp/src/Exception/RangeException.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
-class RangeException extends \Exception
+class RangeException extends \Exception implements SassException
{
}
diff --git a/lib/scssphp/scssphp/src/Exception/SassException.php b/lib/scssphp/scssphp/src/Exception/SassException.php
new file mode 100644
index 000000000..9f62b3cd2
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Exception/SassException.php
@@ -0,0 +1,7 @@
+
+ *
+ * @deprecated The Scssphp server should define its own exception instead.
*/
-class ServerException extends \Exception
+class ServerException extends \Exception implements SassException
{
}
diff --git a/lib/scssphp/scssphp/src/Formatter.php b/lib/scssphp/scssphp/src/Formatter.php
index e17770458..6137dc650 100644
--- a/lib/scssphp/scssphp/src/Formatter.php
+++ b/lib/scssphp/scssphp/src/Formatter.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
abstract class Formatter
{
/**
- * @var integer
+ * @var int
*/
public $indentLevel;
@@ -57,7 +60,7 @@ abstract class Formatter
public $assignSeparator;
/**
- * @var boolean
+ * @var bool
*/
public $keepSemicolons;
@@ -67,17 +70,17 @@ abstract class Formatter
protected $currentBlock;
/**
- * @var integer
+ * @var int
*/
protected $currentLine;
/**
- * @var integer
+ * @var int
*/
protected $currentColumn;
/**
- * @var \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator
+ * @var \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null
*/
protected $sourceMapGenerator;
@@ -118,16 +121,33 @@ abstract class Formatter
return rtrim($name) . $this->assignSeparator . $value . ';';
}
+ /**
+ * Return custom property assignment
+ * differs in that you have to keep spaces in the value as is
+ *
+ * @api
+ *
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return string
+ */
+ public function customProperty($name, $value)
+ {
+ return rtrim($name) . trim($this->assignSeparator) . $value . ';';
+ }
+
/**
* Output lines inside a block
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+ *
+ * @return void
*/
protected function blockLines(OutputBlock $block)
{
$inner = $this->indentStr();
-
- $glue = $this->break . $inner;
+ $glue = $this->break . $inner;
$this->write($inner . implode($glue, $block->lines));
@@ -140,9 +160,13 @@ abstract class Formatter
* Output block selectors
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+ *
+ * @return void
*/
protected function blockSelectors(OutputBlock $block)
{
+ assert(! empty($block->selectors));
+
$inner = $this->indentStr();
$this->write($inner
@@ -154,6 +178,8 @@ abstract class Formatter
* Output block children
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+ *
+ * @return void
*/
protected function blockChildren(OutputBlock $block)
{
@@ -166,6 +192,8 @@ abstract class Formatter
* Output non-empty block
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+ *
+ * @return void
*/
protected function block(OutputBlock $block)
{
@@ -211,7 +239,7 @@ abstract class Formatter
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
*
- * @return boolean
+ * @return bool
*/
protected function testEmptyChildren($block)
{
@@ -258,9 +286,18 @@ abstract class Formatter
ob_start();
- $this->block($block);
+ try {
+ $this->block($block);
+ } catch (\Exception $e) {
+ ob_end_clean();
+ throw $e;
+ } catch (\Throwable $e) {
+ ob_end_clean();
+ throw $e;
+ }
$out = ob_get_clean();
+ assert($out !== false);
return $out;
}
@@ -269,6 +306,8 @@ abstract class Formatter
* Output content
*
* @param string $str
+ *
+ * @return void
*/
protected function write($str)
{
@@ -282,7 +321,8 @@ abstract class Formatter
* Maybe Strip semi-colon appended by property(); it's a separator, not a terminator
* will be striped for real before a closing, otherwise displayed unchanged starting the next write
*/
- if (! $this->keepSemicolons &&
+ if (
+ ! $this->keepSemicolons &&
$str &&
(strpos($str, ';') !== false) &&
(substr($str, -1) === ';')
@@ -293,22 +333,43 @@ abstract class Formatter
}
if ($this->sourceMapGenerator) {
- $this->sourceMapGenerator->addMapping(
- $this->currentLine,
- $this->currentColumn,
- $this->currentBlock->sourceLine,
- //columns from parser are off by one
- $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0,
- $this->currentBlock->sourceName
- );
-
$lines = explode("\n", $str);
- $lineCount = count($lines);
- $this->currentLine += $lineCount-1;
-
$lastLine = array_pop($lines);
- $this->currentColumn = ($lineCount === 1 ? $this->currentColumn : 0) + strlen($lastLine);
+ foreach ($lines as $line) {
+ // If the written line starts is empty, adding a mapping would add it for
+ // a non-existent column as we are at the end of the line
+ if ($line !== '') {
+ assert($this->currentBlock->sourceLine !== null);
+ assert($this->currentBlock->sourceName !== null);
+ $this->sourceMapGenerator->addMapping(
+ $this->currentLine,
+ $this->currentColumn,
+ $this->currentBlock->sourceLine,
+ //columns from parser are off by one
+ $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0,
+ $this->currentBlock->sourceName
+ );
+ }
+
+ $this->currentLine++;
+ $this->currentColumn = 0;
+ }
+
+ if ($lastLine !== '') {
+ assert($this->currentBlock->sourceLine !== null);
+ assert($this->currentBlock->sourceName !== null);
+ $this->sourceMapGenerator->addMapping(
+ $this->currentLine,
+ $this->currentColumn,
+ $this->currentBlock->sourceLine,
+ //columns from parser are off by one
+ $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0,
+ $this->currentBlock->sourceName
+ );
+ }
+
+ $this->currentColumn += \strlen($lastLine);
}
echo $str;
diff --git a/lib/scssphp/scssphp/src/Formatter/Compact.php b/lib/scssphp/scssphp/src/Formatter/Compact.php
index 591f0c92e..22f226889 100644
--- a/lib/scssphp/scssphp/src/Formatter/Compact.php
+++ b/lib/scssphp/scssphp/src/Formatter/Compact.php
@@ -1,8 +1,9 @@
+ *
+ * @deprecated since 1.4.0. Use the Compressed formatter instead.
+ *
+ * @internal
*/
class Compact extends Formatter
{
@@ -25,6 +30,8 @@ class Compact extends Formatter
*/
public function __construct()
{
+ @trigger_error('The Compact formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', E_USER_DEPRECATED);
+
$this->indentLevel = 0;
$this->indentChar = '';
$this->break = '';
diff --git a/lib/scssphp/scssphp/src/Formatter/Compressed.php b/lib/scssphp/scssphp/src/Formatter/Compressed.php
index ec4722eaf..58ebe3f11 100644
--- a/lib/scssphp/scssphp/src/Formatter/Compressed.php
+++ b/lib/scssphp/scssphp/src/Formatter/Compressed.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
class Compressed extends Formatter
{
@@ -48,8 +50,6 @@ class Compressed extends Formatter
foreach ($block->lines as $index => $line) {
if (substr($line, 0, 2) === '/*' && substr($line, 2, 1) !== '!') {
unset($block->lines[$index]);
- } elseif (substr($line, 0, 3) === '/*!') {
- $block->lines[$index] = '/*' . substr($line, 3);
}
}
@@ -67,6 +67,8 @@ class Compressed extends Formatter
*/
protected function blockSelectors(OutputBlock $block)
{
+ assert(! empty($block->selectors));
+
$inner = $this->indentStr();
$this->write(
diff --git a/lib/scssphp/scssphp/src/Formatter/Crunched.php b/lib/scssphp/scssphp/src/Formatter/Crunched.php
index 51ccb516d..2bc1e9299 100644
--- a/lib/scssphp/scssphp/src/Formatter/Crunched.php
+++ b/lib/scssphp/scssphp/src/Formatter/Crunched.php
@@ -1,8 +1,9 @@
+ *
+ * @deprecated since 1.4.0. Use the Compressed formatter instead.
+ *
+ * @internal
*/
class Crunched extends Formatter
{
@@ -26,6 +30,8 @@ class Crunched extends Formatter
*/
public function __construct()
{
+ @trigger_error('The Crunched formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', E_USER_DEPRECATED);
+
$this->indentLevel = 0;
$this->indentChar = ' ';
$this->break = '';
@@ -65,6 +71,8 @@ class Crunched extends Formatter
*/
protected function blockSelectors(OutputBlock $block)
{
+ assert(! empty($block->selectors));
+
$inner = $this->indentStr();
$this->write(
diff --git a/lib/scssphp/scssphp/src/Formatter/Debug.php b/lib/scssphp/scssphp/src/Formatter/Debug.php
index 94e70c815..b3f442253 100644
--- a/lib/scssphp/scssphp/src/Formatter/Debug.php
+++ b/lib/scssphp/scssphp/src/Formatter/Debug.php
@@ -1,8 +1,9 @@
+ *
+ * @deprecated since 1.4.0.
+ *
+ * @internal
*/
class Debug extends Formatter
{
@@ -26,6 +30,8 @@ class Debug extends Formatter
*/
public function __construct()
{
+ @trigger_error('The Debug formatter is deprecated since 1.4.0.', E_USER_DEPRECATED);
+
$this->indentLevel = 0;
$this->indentChar = '';
$this->break = "\n";
diff --git a/lib/scssphp/scssphp/src/Formatter/Expanded.php b/lib/scssphp/scssphp/src/Formatter/Expanded.php
index 9549c6cfa..6eb4a0cb7 100644
--- a/lib/scssphp/scssphp/src/Formatter/Expanded.php
+++ b/lib/scssphp/scssphp/src/Formatter/Expanded.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
class Expanded extends Formatter
{
@@ -55,7 +57,9 @@ class Expanded extends Formatter
foreach ($block->lines as $index => $line) {
if (substr($line, 0, 2) === '/*') {
- $block->lines[$index] = preg_replace('/[\r\n]+/', $glue, $line);
+ $replacedLine = preg_replace('/\r\n?|\n|\f/', $this->break, $line);
+ assert($replacedLine !== null);
+ $block->lines[$index] = $replacedLine;
}
}
diff --git a/lib/scssphp/scssphp/src/Formatter/Nested.php b/lib/scssphp/scssphp/src/Formatter/Nested.php
index f9e7f037f..d5ed85cc2 100644
--- a/lib/scssphp/scssphp/src/Formatter/Nested.php
+++ b/lib/scssphp/scssphp/src/Formatter/Nested.php
@@ -1,8 +1,9 @@
+ *
+ * @deprecated since 1.4.0. Use the Expanded formatter instead.
+ *
+ * @internal
*/
class Nested extends Formatter
{
/**
- * @var integer
+ * @var int
*/
private $depth;
@@ -32,6 +36,8 @@ class Nested extends Formatter
*/
public function __construct()
{
+ @trigger_error('The Nested formatter is deprecated since 1.4.0. Use the Expanded formatter instead.', E_USER_DEPRECATED);
+
$this->indentLevel = 0;
$this->indentChar = ' ';
$this->break = "\n";
@@ -58,12 +64,13 @@ class Nested extends Formatter
protected function blockLines(OutputBlock $block)
{
$inner = $this->indentStr();
-
- $glue = $this->break . $inner;
+ $glue = $this->break . $inner;
foreach ($block->lines as $index => $line) {
if (substr($line, 0, 2) === '/*') {
- $block->lines[$index] = preg_replace('/[\r\n]+/', $glue, $line);
+ $replacedLine = preg_replace('/\r\n?|\n|\f/', $this->break, $line);
+ assert($replacedLine !== null);
+ $block->lines[$index] = $replacedLine;
}
}
@@ -90,7 +97,7 @@ class Nested extends Formatter
$previousHasSelector = false;
}
- $isMediaOrDirective = in_array($block->type, [Type::T_DIRECTIVE, Type::T_MEDIA]);
+ $isMediaOrDirective = \in_array($block->type, [Type::T_DIRECTIVE, Type::T_MEDIA]);
$isSupport = ($block->type === Type::T_DIRECTIVE
&& $block->selectors && strpos(implode('', $block->selectors), '@supports') !== false);
@@ -98,7 +105,8 @@ class Nested extends Formatter
array_pop($depths);
$this->depth--;
- if (! $this->depth && ($block->depth <= 1 || (! $this->indentLevel && $block->type === Type::T_COMMENT)) &&
+ if (
+ ! $this->depth && ($block->depth <= 1 || (! $this->indentLevel && $block->type === Type::T_COMMENT)) &&
(($block->selectors && ! $isMediaOrDirective) || $previousHasSelector)
) {
$downLevel = $this->break;
@@ -119,10 +127,12 @@ class Nested extends Formatter
if ($block->depth > end($depths)) {
if (! $previousEmpty || $this->depth < 1) {
$this->depth++;
+
$depths[] = $block->depth;
} else {
// keep the current depth unchanged but take the block depth as a new reference for following blocks
array_pop($depths);
+
$depths[] = $block->depth;
}
}
@@ -213,7 +223,7 @@ class Nested extends Formatter
*
* @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
*
- * @return boolean
+ * @return bool
*/
private function hasFlatChild($block)
{
diff --git a/lib/scssphp/scssphp/src/Formatter/OutputBlock.php b/lib/scssphp/scssphp/src/Formatter/OutputBlock.php
index 3e6fd9289..2799656a4 100644
--- a/lib/scssphp/scssphp/src/Formatter/OutputBlock.php
+++ b/lib/scssphp/scssphp/src/Formatter/OutputBlock.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
class OutputBlock
{
/**
- * @var string
+ * @var string|null
*/
public $type;
/**
- * @var integer
+ * @var int
*/
public $depth;
/**
- * @var array
+ * @var array|null
*/
public $selectors;
/**
- * @var array
+ * @var string[]
*/
public $lines;
/**
- * @var array
+ * @var OutputBlock[]
*/
public $children;
/**
- * @var \ScssPhp\ScssPhp\Formatter\OutputBlock
+ * @var OutputBlock|null
*/
public $parent;
/**
- * @var string
+ * @var string|null
*/
public $sourceName;
/**
- * @var integer
+ * @var int|null
*/
public $sourceLine;
/**
- * @var integer
+ * @var int|null
*/
public $sourceColumn;
}
diff --git a/lib/scssphp/scssphp/src/Logger/LoggerInterface.php b/lib/scssphp/scssphp/src/Logger/LoggerInterface.php
new file mode 100644
index 000000000..7c0a2f76e
--- /dev/null
+++ b/lib/scssphp/scssphp/src/Logger/LoggerInterface.php
@@ -0,0 +1,48 @@
+stream = $stream;
+ $this->closeOnDestruct = $closeOnDestruct;
+ }
+
+ /**
+ * @internal
+ */
+ public function __destruct()
+ {
+ if ($this->closeOnDestruct) {
+ fclose($this->stream);
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function warn($message, $deprecation = false)
+ {
+ $prefix = ($deprecation ? 'DEPRECATION ' : '') . 'WARNING: ';
+
+ fwrite($this->stream, $prefix . $message . "\n\n");
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function debug($message)
+ {
+ fwrite($this->stream, $message . "\n");
+ }
+}
diff --git a/lib/scssphp/scssphp/src/Node.php b/lib/scssphp/scssphp/src/Node.php
index dab565a63..fcaf8a95f 100644
--- a/lib/scssphp/scssphp/src/Node.php
+++ b/lib/scssphp/scssphp/src/Node.php
@@ -1,8 +1,9 @@
+ *
+ * @internal
*/
abstract class Node
{
@@ -24,17 +27,17 @@ abstract class Node
public $type;
/**
- * @var integer
+ * @var int
*/
public $sourceIndex;
/**
- * @var integer
+ * @var int|null
*/
public $sourceLine;
/**
- * @var integer
+ * @var int|null
*/
public $sourceColumn;
}
diff --git a/lib/scssphp/scssphp/src/Node/Number.php b/lib/scssphp/scssphp/src/Node/Number.php
index acbabff7f..ca9b5b652 100644
--- a/lib/scssphp/scssphp/src/Node/Number.php
+++ b/lib/scssphp/scssphp/src/Node/Number.php
@@ -1,8 +1,9 @@
+ *
+ * @template-implements \ArrayAccess
*/
class Number extends Node implements \ArrayAccess
{
+ const PRECISION = 10;
+
/**
- * @var integer
+ * @var int
+ * @deprecated use {Number::PRECISION} instead to read the precision. Configuring it is not supported anymore.
*/
- static public $precision = 10;
+ public static $precision = self::PRECISION;
/**
* @see http://www.w3.org/TR/2012/WD-css3-values-20120308/
*
* @var array
+ * @phpstan-var array>
*/
- static protected $unitTable = [
+ protected static $unitTable = [
'in' => [
'in' => 1,
'pc' => 6,
@@ -64,91 +75,93 @@ class Number extends Node implements \ArrayAccess
],
'dpi' => [
'dpi' => 1,
- 'dpcm' => 2.54,
- 'dppx' => 96,
+ 'dpcm' => 1 / 2.54,
+ 'dppx' => 1 / 96,
],
];
/**
- * @var integer|float
+ * @var int|float
*/
- public $dimension;
+ private $dimension;
/**
- * @var array
+ * @var string[]
+ * @phpstan-var list
*/
- public $units;
+ private $numeratorUnits;
+
+ /**
+ * @var string[]
+ * @phpstan-var list
+ */
+ private $denominatorUnits;
/**
* Initialize number
*
- * @param mixed $dimension
- * @param mixed $initialUnit
+ * @param int|float $dimension
+ * @param string[]|string $numeratorUnits
+ * @param string[] $denominatorUnits
+ *
+ * @phpstan-param list|string $numeratorUnits
+ * @phpstan-param list $denominatorUnits
*/
- public function __construct($dimension, $initialUnit)
+ public function __construct($dimension, $numeratorUnits, array $denominatorUnits = [])
{
- $this->type = Type::T_NUMBER;
+ if (is_string($numeratorUnits)) {
+ $numeratorUnits = $numeratorUnits ? [$numeratorUnits] : [];
+ } elseif (isset($numeratorUnits['numerator_units'], $numeratorUnits['denominator_units'])) {
+ // TODO get rid of this once `$number[2]` is not used anymore
+ $denominatorUnits = $numeratorUnits['denominator_units'];
+ $numeratorUnits = $numeratorUnits['numerator_units'];
+ }
+
$this->dimension = $dimension;
- $this->units = is_array($initialUnit)
- ? $initialUnit
- : ($initialUnit ? [$initialUnit => 1]
- : []);
+ $this->numeratorUnits = $numeratorUnits;
+ $this->denominatorUnits = $denominatorUnits;
}
/**
- * Coerce number to target units
- *
- * @param array $units
- *
- * @return \ScssPhp\ScssPhp\Node\Number
+ * @return float|int
*/
- public function coerce($units)
+ public function getDimension()
{
- if ($this->unitless()) {
- return new Number($this->dimension, $units);
- }
-
- $dimension = $this->dimension;
-
- foreach (static::$unitTable['in'] as $unit => $conv) {
- $from = isset($this->units[$unit]) ? $this->units[$unit] : 0;
- $to = isset($units[$unit]) ? $units[$unit] : 0;
- $factor = pow($conv, $from - $to);
- $dimension /= $factor;
- }
-
- return new Number($dimension, $units);
+ return $this->dimension;
}
/**
- * Normalize number
- *
- * @return \ScssPhp\ScssPhp\Node\Number
+ * @return string[]
*/
- public function normalize()
+ public function getNumeratorUnits()
{
- $dimension = $this->dimension;
- $units = [];
-
- $this->normalizeUnits($dimension, $units, 'in');
-
- return new Number($dimension, $units);
+ return $this->numeratorUnits;
}
/**
- * {@inheritdoc}
+ * @return string[]
*/
+ public function getDenominatorUnits()
+ {
+ return $this->denominatorUnits;
+ }
+
+ /**
+ * @return bool
+ */
+ #[\ReturnTypeWillChange]
public function offsetExists($offset)
{
if ($offset === -3) {
- return ! is_null($this->sourceColumn);
+ return ! \is_null($this->sourceColumn);
}
if ($offset === -2) {
- return ! is_null($this->sourceLine);
+ return ! \is_null($this->sourceLine);
}
- if ($offset === -1 ||
+ if (
+ $offset === -1 ||
$offset === 0 ||
$offset === 1 ||
$offset === 2
@@ -160,8 +173,9 @@ class Number extends Node implements \ArrayAccess
}
/**
- * {@inheritdoc}
+ * @return mixed
*/
+ #[\ReturnTypeWillChange]
public function offsetGet($offset)
{
switch ($offset) {
@@ -175,60 +189,54 @@ class Number extends Node implements \ArrayAccess
return $this->sourceIndex;
case 0:
- return $this->type;
+ return Type::T_NUMBER;
case 1:
return $this->dimension;
case 2:
- return $this->units;
+ return array('numerator_units' => $this->numeratorUnits, 'denominator_units' => $this->denominatorUnits);
}
}
/**
- * {@inheritdoc}
+ * @return void
*/
+ #[\ReturnTypeWillChange]
public function offsetSet($offset, $value)
{
- if ($offset === 1) {
- $this->dimension = $value;
- } elseif ($offset === 2) {
- $this->units = $value;
- } elseif ($offset == -1) {
- $this->sourceIndex = $value;
- } elseif ($offset == -2) {
- $this->sourceLine = $value;
- } elseif ($offset == -3) {
- $this->sourceColumn = $value;
- }
+ throw new \BadMethodCallException('Number is immutable');
}
/**
- * {@inheritdoc}
+ * @return void
*/
+ #[\ReturnTypeWillChange]
public function offsetUnset($offset)
{
- if ($offset === 1) {
- $this->dimension = null;
- } elseif ($offset === 2) {
- $this->units = null;
- } elseif ($offset === -1) {
- $this->sourceIndex = null;
- } elseif ($offset === -2) {
- $this->sourceLine = null;
- } elseif ($offset === -3) {
- $this->sourceColumn = null;
- }
+ throw new \BadMethodCallException('Number is immutable');
}
/**
* Returns true if the number is unitless
*
- * @return boolean
+ * @return bool
*/
public function unitless()
{
- return ! array_sum($this->units);
+ return \count($this->numeratorUnits) === 0 && \count($this->denominatorUnits) === 0;
+ }
+
+ /**
+ * Checks whether the number has exactly this unit
+ *
+ * @param string $unit
+ *
+ * @return bool
+ */
+ public function hasUnit($unit)
+ {
+ return \count($this->numeratorUnits) === 1 && \count($this->denominatorUnits) === 0 && $this->numeratorUnits[0] === $unit;
}
/**
@@ -238,22 +246,289 @@ class Number extends Node implements \ArrayAccess
*/
public function unitStr()
{
- $numerators = [];
- $denominators = [];
-
- foreach ($this->units as $unit => $unitSize) {
- if ($unitSize > 0) {
- $numerators = array_pad($numerators, count($numerators) + $unitSize, $unit);
- continue;
- }
-
- if ($unitSize < 0) {
- $denominators = array_pad($denominators, count($denominators) + $unitSize, $unit);
- continue;
- }
+ if ($this->unitless()) {
+ return '';
}
- return implode('*', $numerators) . (count($denominators) ? '/' . implode('*', $denominators) : '');
+ return self::getUnitString($this->numeratorUnits, $this->denominatorUnits);
+ }
+
+ /**
+ * @param float|int $min
+ * @param float|int $max
+ * @param string|null $name
+ *
+ * @return float|int
+ * @throws SassScriptException
+ */
+ public function valueInRange($min, $max, $name = null)
+ {
+ try {
+ return Util::checkRange('', new Range($min, $max), $this);
+ } catch (RangeException $e) {
+ throw SassScriptException::forArgument(sprintf('Expected %s to be within %s%s and %s%3$s', $this, $min, $this->unitStr(), $max), $name);
+ }
+ }
+
+ /**
+ * @param string|null $varName
+ *
+ * @return void
+ */
+ public function assertNoUnits($varName = null)
+ {
+ if ($this->unitless()) {
+ return;
+ }
+
+ throw SassScriptException::forArgument(sprintf('Expected %s to have no units.', $this), $varName);
+ }
+
+ /**
+ * @param string $unit
+ * @param string|null $varName
+ *
+ * @return void
+ */
+ public function assertUnit($unit, $varName = null)
+ {
+ if ($this->hasUnit($unit)) {
+ return;
+ }
+
+ throw SassScriptException::forArgument(sprintf('Expected %s to have unit "%s".', $this, $unit), $varName);
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return void
+ */
+ public function assertSameUnitOrUnitless(Number $other)
+ {
+ if ($other->unitless()) {
+ return;
+ }
+
+ if ($this->numeratorUnits === $other->numeratorUnits && $this->denominatorUnits === $other->denominatorUnits) {
+ return;
+ }
+
+ throw new SassScriptException(sprintf(
+ 'Incompatible units %s and %s.',
+ self::getUnitString($this->numeratorUnits, $this->denominatorUnits),
+ self::getUnitString($other->numeratorUnits, $other->denominatorUnits)
+ ));
+ }
+
+ /**
+ * Returns a copy of this number, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits.
+ *
+ * This does not throw an error if this number is unitless and
+ * $newNumeratorUnits/$newDenominatorUnits are not empty, or vice versa. Instead,
+ * it treats all unitless numbers as convertible to and from all units without
+ * changing the value.
+ *
+ * @param string[] $newNumeratorUnits
+ * @param string[] $newDenominatorUnits
+ *
+ * @return Number
+ *
+ * @phpstan-param list $newNumeratorUnits
+ * @phpstan-param list $newDenominatorUnits
+ *
+ * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits
+ */
+ public function coerce(array $newNumeratorUnits, array $newDenominatorUnits)
+ {
+ return new Number($this->valueInUnits($newNumeratorUnits, $newDenominatorUnits), $newNumeratorUnits, $newDenominatorUnits);
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return bool
+ */
+ public function isComparableTo(Number $other)
+ {
+ if ($this->unitless() || $other->unitless()) {
+ return true;
+ }
+
+ try {
+ $this->greaterThan($other);
+ return true;
+ } catch (SassScriptException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return bool
+ */
+ public function lessThan(Number $other)
+ {
+ return $this->coerceUnits($other, function ($num1, $num2) {
+ return $num1 < $num2;
+ });
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return bool
+ */
+ public function lessThanOrEqual(Number $other)
+ {
+ return $this->coerceUnits($other, function ($num1, $num2) {
+ return $num1 <= $num2;
+ });
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return bool
+ */
+ public function greaterThan(Number $other)
+ {
+ return $this->coerceUnits($other, function ($num1, $num2) {
+ return $num1 > $num2;
+ });
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return bool
+ */
+ public function greaterThanOrEqual(Number $other)
+ {
+ return $this->coerceUnits($other, function ($num1, $num2) {
+ return $num1 >= $num2;
+ });
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return Number
+ */
+ public function plus(Number $other)
+ {
+ return $this->coerceNumber($other, function ($num1, $num2) {
+ return $num1 + $num2;
+ });
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return Number
+ */
+ public function minus(Number $other)
+ {
+ return $this->coerceNumber($other, function ($num1, $num2) {
+ return $num1 - $num2;
+ });
+ }
+
+ /**
+ * @return Number
+ */
+ public function unaryMinus()
+ {
+ return new Number(-$this->dimension, $this->numeratorUnits, $this->denominatorUnits);
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return Number
+ */
+ public function modulo(Number $other)
+ {
+ return $this->coerceNumber($other, function ($num1, $num2) {
+ if ($num2 == 0) {
+ return NAN;
+ }
+
+ $result = fmod($num1, $num2);
+
+ if ($result == 0) {
+ return 0;
+ }
+
+ if ($num2 < 0 xor $num1 < 0) {
+ $result += $num2;
+ }
+
+ return $result;
+ });
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return Number
+ */
+ public function times(Number $other)
+ {
+ return $this->multiplyUnits($this->dimension * $other->dimension, $this->numeratorUnits, $this->denominatorUnits, $other->numeratorUnits, $other->denominatorUnits);
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return Number
+ */
+ public function dividedBy(Number $other)
+ {
+ if ($other->dimension == 0) {
+ if ($this->dimension == 0) {
+ $value = NAN;
+ } elseif ($this->dimension > 0) {
+ $value = INF;
+ } else {
+ $value = -INF;
+ }
+ } else {
+ $value = $this->dimension / $other->dimension;
+ }
+
+ return $this->multiplyUnits($value, $this->numeratorUnits, $this->denominatorUnits, $other->denominatorUnits, $other->numeratorUnits);
+ }
+
+ /**
+ * @param Number $other
+ *
+ * @return bool
+ */
+ public function equals(Number $other)
+ {
+ // Unitless numbers are convertable to unit numbers, but not equal, so we special-case unitless here.
+ if ($this->unitless() !== $other->unitless()) {
+ return false;
+ }
+
+ // In Sass, neither NaN nor Infinity are equal to themselves, while PHP defines INF==INF
+ if (is_nan($this->dimension) || is_nan($other->dimension) || !is_finite($this->dimension) || !is_finite($other->dimension)) {
+ return false;
+ }
+
+ if ($this->unitless()) {
+ return round($this->dimension, self::PRECISION) == round($other->dimension, self::PRECISION);
+ }
+
+ try {
+ return $this->coerceUnits($other, function ($num1, $num2) {
+ return round($num1,self::PRECISION) == round($num2, self::PRECISION);
+ });
+ } catch (SassScriptException $e) {
+ return false;
+ }
}
/**
@@ -265,35 +540,31 @@ class Number extends Node implements \ArrayAccess
*/
public function output(Compiler $compiler = null)
{
- $dimension = round($this->dimension, static::$precision);
+ $dimension = round($this->dimension, self::PRECISION);
- $units = array_filter($this->units, function ($unitSize) {
- return $unitSize;
- });
-
- if (count($units) > 1 && array_sum($units) === 0) {
- $dimension = $this->dimension;
- $units = [];
-
- $this->normalizeUnits($dimension, $units, 'in');
-
- $dimension = round($dimension, static::$precision);
- $units = array_filter($units, function ($unitSize) {
- return $unitSize;
- });
+ if (is_nan($dimension)) {
+ return 'NaN';
}
- $unitSize = array_sum($units);
-
- if ($compiler && ($unitSize > 1 || $unitSize < 0 || count($units) > 1)) {
- $compiler->throwError((string) $dimension . $this->unitStr() . " isn't a valid CSS value.");
+ if ($dimension === INF) {
+ return 'Infinity';
}
- reset($units);
- $unit = key($units);
- $dimension = number_format($dimension, static::$precision, '.', '');
+ if ($dimension === -INF) {
+ return '-Infinity';
+ }
- return (static::$precision ? rtrim(rtrim($dimension, '0'), '.') : $dimension) . $unit;
+ if ($compiler) {
+ $unit = $this->unitStr();
+ } elseif (isset($this->numeratorUnits[0])) {
+ $unit = $this->numeratorUnits[0];
+ } else {
+ $unit = '';
+ }
+
+ $dimension = number_format($dimension, self::PRECISION, '.', '');
+
+ return rtrim(rtrim($dimension, '0'), '.') . $unit;
}
/**
@@ -305,26 +576,229 @@ class Number extends Node implements \ArrayAccess
}
/**
- * Normalize units
+ * @param Number $other
+ * @param callable $operation
*
- * @param integer|float $dimension
- * @param array $units
- * @param string $baseUnit
+ * @return Number
+ *
+ * @phpstan-param callable(int|float, int|float): (int|float) $operation
*/
- private function normalizeUnits(&$dimension, &$units, $baseUnit = 'in')
+ private function coerceNumber(Number $other, $operation)
{
- $dimension = $this->dimension;
- $units = [];
+ $result = $this->coerceUnits($other, $operation);
- foreach ($this->units as $unit => $exp) {
- if (isset(static::$unitTable[$baseUnit][$unit])) {
- $factor = pow(static::$unitTable[$baseUnit][$unit], $exp);
+ if (!$this->unitless()) {
+ return new Number($result, $this->numeratorUnits, $this->denominatorUnits);
+ }
- $unit = $baseUnit;
- $dimension /= $factor;
+ return new Number($result, $other->numeratorUnits, $other->denominatorUnits);
+ }
+
+ /**
+ * @param Number $other
+ * @param callable $operation
+ *
+ * @return mixed
+ *
+ * @phpstan-template T
+ * @phpstan-param callable(int|float, int|float): T $operation
+ * @phpstan-return T
+ */
+ private function coerceUnits(Number $other, $operation)
+ {
+ if (!$this->unitless()) {
+ $num1 = $this->dimension;
+ $num2 = $other->valueInUnits($this->numeratorUnits, $this->denominatorUnits);
+ } else {
+ $num1 = $this->valueInUnits($other->numeratorUnits, $other->denominatorUnits);
+ $num2 = $other->dimension;
+ }
+
+ return \call_user_func($operation, $num1, $num2);
+ }
+
+ /**
+ * @param string[] $numeratorUnits
+ * @param string[] $denominatorUnits
+ *
+ * @return int|float
+ *
+ * @phpstan-param list $numeratorUnits
+ * @phpstan-param list $denominatorUnits
+ *
+ * @throws SassScriptException if this number's units are not compatible with $numeratorUnits and $denominatorUnits
+ */
+ private function valueInUnits(array $numeratorUnits, array $denominatorUnits)
+ {
+ if (
+ $this->unitless()
+ || (\count($numeratorUnits) === 0 && \count($denominatorUnits) === 0)
+ || ($this->numeratorUnits === $numeratorUnits && $this->denominatorUnits === $denominatorUnits)
+ ) {
+ return $this->dimension;
+ }
+
+ $value = $this->dimension;
+ $oldNumerators = $this->numeratorUnits;
+
+ foreach ($numeratorUnits as $newNumerator) {
+ foreach ($oldNumerators as $key => $oldNumerator) {
+ $conversionFactor = self::getConversionFactor($newNumerator, $oldNumerator);
+
+ if (\is_null($conversionFactor)) {
+ continue;
+ }
+
+ $value *= $conversionFactor;
+ unset($oldNumerators[$key]);
+ continue 2;
}
- $units[$unit] = $exp + (isset($units[$unit]) ? $units[$unit] : 0);
+ throw new SassScriptException(sprintf(
+ 'Incompatible units %s and %s.',
+ self::getUnitString($this->numeratorUnits, $this->denominatorUnits),
+ self::getUnitString($numeratorUnits, $denominatorUnits)
+ ));
}
+
+ $oldDenominators = $this->denominatorUnits;
+
+ foreach ($denominatorUnits as $newDenominator) {
+ foreach ($oldDenominators as $key => $oldDenominator) {
+ $conversionFactor = self::getConversionFactor($newDenominator, $oldDenominator);
+
+ if (\is_null($conversionFactor)) {
+ continue;
+ }
+
+ $value /= $conversionFactor;
+ unset($oldDenominators[$key]);
+ continue 2;
+ }
+
+ throw new SassScriptException(sprintf(
+ 'Incompatible units %s and %s.',
+ self::getUnitString($this->numeratorUnits, $this->denominatorUnits),
+ self::getUnitString($numeratorUnits, $denominatorUnits)
+ ));
+ }
+
+ if (\count($oldNumerators) || \count($oldDenominators)) {
+ throw new SassScriptException(sprintf(
+ 'Incompatible units %s and %s.',
+ self::getUnitString($this->numeratorUnits, $this->denominatorUnits),
+ self::getUnitString($numeratorUnits, $denominatorUnits)
+ ));
+ }
+
+ return $value;
+ }
+
+ /**
+ * @param int|float $value
+ * @param string[] $numerators1
+ * @param string[] $denominators1
+ * @param string[] $numerators2
+ * @param string[] $denominators2
+ *
+ * @return Number
+ *
+ * @phpstan-param list $numerators1
+ * @phpstan-param list $denominators1
+ * @phpstan-param list $numerators2
+ * @phpstan-param list $denominators2
+ */
+ private function multiplyUnits($value, array $numerators1, array $denominators1, array $numerators2, array $denominators2)
+ {
+ $newNumerators = array();
+
+ foreach ($numerators1 as $numerator) {
+ foreach ($denominators2 as $key => $denominator) {
+ $conversionFactor = self::getConversionFactor($numerator, $denominator);
+
+ if (\is_null($conversionFactor)) {
+ continue;
+ }
+
+ $value /= $conversionFactor;
+ unset($denominators2[$key]);
+ continue 2;
+ }
+
+ $newNumerators[] = $numerator;
+ }
+
+ foreach ($numerators2 as $numerator) {
+ foreach ($denominators1 as $key => $denominator) {
+ $conversionFactor = self::getConversionFactor($numerator, $denominator);
+
+ if (\is_null($conversionFactor)) {
+ continue;
+ }
+
+ $value /= $conversionFactor;
+ unset($denominators1[$key]);
+ continue 2;
+ }
+
+ $newNumerators[] = $numerator;
+ }
+
+ $newDenominators = array_values(array_merge($denominators1, $denominators2));
+
+ return new Number($value, $newNumerators, $newDenominators);
+ }
+
+ /**
+ * Returns the number of [unit1]s per [unit2].
+ *
+ * Equivalently, `1unit1 * conversionFactor(unit1, unit2) = 1unit2`.
+ *
+ * @param string $unit1
+ * @param string $unit2
+ *
+ * @return float|int|null
+ */
+ private static function getConversionFactor($unit1, $unit2)
+ {
+ if ($unit1 === $unit2) {
+ return 1;
+ }
+
+ foreach (static::$unitTable as $unitVariants) {
+ if (isset($unitVariants[$unit1]) && isset($unitVariants[$unit2])) {
+ return $unitVariants[$unit1] / $unitVariants[$unit2];
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns unit(s) as the product of numerator units divided by the product of denominator units
+ *
+ * @param string[] $numerators
+ * @param string[] $denominators
+ *
+ * @phpstan-param list $numerators
+ * @phpstan-param list $denominators
+ *
+ * @return string
+ */
+ private static function getUnitString(array $numerators, array $denominators)
+ {
+ if (!\count($numerators)) {
+ if (\count($denominators) === 0) {
+ return 'no units';
+ }
+
+ if (\count($denominators) === 1) {
+ return $denominators[0] . '^-1';
+ }
+
+ return '(' . implode('*', $denominators) . ')^-1';
+ }
+
+ return implode('*', $numerators) . (\count($denominators) ? '/' . implode('*', $denominators) : '');
}
}
diff --git a/lib/scssphp/scssphp/src/OutputStyle.php b/lib/scssphp/scssphp/src/OutputStyle.php
new file mode 100644
index 000000000..c284639c1
--- /dev/null
+++ b/lib/scssphp/scssphp/src/OutputStyle.php
@@ -0,0 +1,9 @@
+
+ *
+ * @internal
*/
class Parser
{
@@ -30,7 +43,7 @@ class Parser
const SOURCE_COLUMN = -3;
/**
- * @var array
+ * @var array
*/
protected static $precedence = [
'=' => 0,
@@ -38,7 +51,6 @@ class Parser
'and' => 2,
'==' => 3,
'!=' => 3,
- '<=>' => 3,
'<=' => 4,
'>=' => 4,
'<' => 4,
@@ -50,49 +62,97 @@ class Parser
'%' => 6,
];
+ /**
+ * @var string
+ */
protected static $commentPattern;
+ /**
+ * @var string
+ */
protected static $operatorPattern;
+ /**
+ * @var string
+ */
protected static $whitePattern;
+ /**
+ * @var Cache|null
+ */
protected $cache;
private $sourceName;
private $sourceIndex;
+ /**
+ * @var array
+ */
private $sourcePositions;
- private $charset;
+ /**
+ * The current offset in the buffer
+ *
+ * @var int
+ */
private $count;
+ /**
+ * @var Block|null
+ */
private $env;
+ /**
+ * @var bool
+ */
private $inParens;
+ /**
+ * @var bool
+ */
private $eatWhiteDefault;
+ /**
+ * @var bool
+ */
private $discardComments;
+ private $allowVars;
+ /**
+ * @var string
+ */
private $buffer;
private $utf8;
+ /**
+ * @var string|null
+ */
private $encoding;
private $patternModifiers;
private $commentsSeen;
+ private $cssOnly;
+
+ /**
+ * @var LoggerInterface
+ */
+ private $logger;
+
/**
* Constructor
*
* @api
*
- * @param string $sourceName
- * @param integer $sourceIndex
- * @param string $encoding
- * @param \ScssPhp\ScssPhp\Cache $cache
+ * @param string|null $sourceName
+ * @param int $sourceIndex
+ * @param string|null $encoding
+ * @param Cache|null $cache
+ * @param bool $cssOnly
+ * @param LoggerInterface|null $logger
*/
- public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', $cache = null)
+ public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', Cache $cache = null, $cssOnly = false, LoggerInterface $logger = null)
{
$this->sourceName = $sourceName ?: '(stdin)';
$this->sourceIndex = $sourceIndex;
- $this->charset = null;
$this->utf8 = ! $encoding || strtolower($encoding) === 'utf-8';
$this->patternModifiers = $this->utf8 ? 'Aisu' : 'Ais';
$this->commentsSeen = [];
- $this->discardComments = false;
+ $this->allowVars = true;
+ $this->cssOnly = $cssOnly;
+ $this->logger = $logger ?: new QuietLogger();
if (empty(static::$operatorPattern)) {
- static::$operatorPattern = '([*\/%+-]|[!=]\=|\>\=?|\<\=\>|\<\=?|and|or)';
+ static::$operatorPattern = '([*\/%+-]|[!=]\=|\>\=?|\<\=?|and|or)';
$commentSingle = '\/\/';
$commentMultiLeft = '\/\*';
@@ -104,9 +164,7 @@ class Parser
: '/' . $commentSingle . '[^\n]*\s*|(' . static::$commentPattern . ')\s*|\s+/AisS';
}
- if ($cache) {
- $this->cache = $cache;
- }
+ $this->cache = $cache;
}
/**
@@ -128,9 +186,32 @@ class Parser
*
* @param string $msg
*
- * @throws \ScssPhp\ScssPhp\Exception\ParserException
+ * @phpstan-return never-return
+ *
+ * @throws ParserException
+ *
+ * @deprecated use "parseError" and throw the exception in the caller instead.
*/
public function throwParseError($msg = 'parse error')
+ {
+ @trigger_error(
+ 'The method "throwParseError" is deprecated. Use "parseError" and throw the exception in the caller instead',
+ E_USER_DEPRECATED
+ );
+
+ throw $this->parseError($msg);
+ }
+
+ /**
+ * Creates a parser error
+ *
+ * @api
+ *
+ * @param string $msg
+ *
+ * @return ParserException
+ */
+ public function parseError($msg = 'parse error')
{
list($line, $column) = $this->getSourcePosition($this->count);
@@ -138,11 +219,21 @@ class Parser
? "line: $line, column: $column"
: "$this->sourceName on line $line, at column $column";
- if ($this->peek("(.*?)(\n|$)", $m, $this->count)) {
- throw new ParserException("$msg: failed at `$m[1]` $loc");
+ if ($this->peek('(.*?)(\n|$)', $m, $this->count)) {
+ $this->restoreEncoding();
+
+ $e = new ParserException("$msg: failed at `$m[1]` $loc");
+ $e->setSourcePosition([$this->sourceName, $line, $column]);
+
+ return $e;
}
- throw new ParserException("$msg: $loc");
+ $this->restoreEncoding();
+
+ $e = new ParserException("$msg: $loc");
+ $e->setSourcePosition([$this->sourceName, $line, $column]);
+
+ return $e;
}
/**
@@ -152,19 +243,18 @@ class Parser
*
* @param string $buffer
*
- * @return \ScssPhp\ScssPhp\Block
+ * @return Block
*/
public function parse($buffer)
{
if ($this->cache) {
- $cacheKey = $this->sourceName . ":" . md5($buffer);
+ $cacheKey = $this->sourceName . ':' . md5($buffer);
$parseOptions = [
- 'charset' => $this->charset,
'utf8' => $this->utf8,
];
- $v = $this->cache->getCache("parse", $cacheKey, $parseOptions);
+ $v = $this->cache->getCache('parse', $cacheKey, $parseOptions);
- if (! is_null($v)) {
+ if (! \is_null($v)) {
return $v;
}
}
@@ -192,22 +282,19 @@ class Parser
;
}
- if ($this->count !== strlen($this->buffer)) {
- $this->throwParseError();
+ if ($this->count !== \strlen($this->buffer)) {
+ throw $this->parseError();
}
if (! empty($this->env->parent)) {
- $this->throwParseError('unclosed block');
- }
-
- if ($this->charset) {
- array_unshift($this->env->children, $this->charset);
+ throw $this->parseError('unclosed block');
}
$this->restoreEncoding();
+ assert($this->env !== null);
if ($this->cache) {
- $this->cache->setCache("parse", $cacheKey, $this->env, $parseOptions);
+ $this->cache->setCache('parse', $cacheKey, $this->env, $parseOptions);
}
return $this->env;
@@ -221,7 +308,7 @@ class Parser
* @param string $buffer
* @param string|array $out
*
- * @return boolean
+ * @return bool
*/
public function parseValue($buffer, &$out)
{
@@ -232,6 +319,7 @@ class Parser
$this->buffer = (string) $buffer;
$this->saveEncoding();
+ $this->extractLineNumbers($this->buffer);
$list = $this->valueList($out);
@@ -247,10 +335,11 @@ class Parser
*
* @param string $buffer
* @param string|array $out
+ * @param bool $shouldValidate
*
- * @return boolean
+ * @return bool
*/
- public function parseSelector($buffer, &$out)
+ public function parseSelector($buffer, &$out, $shouldValidate = true)
{
$this->count = 0;
$this->env = null;
@@ -259,11 +348,21 @@ class Parser
$this->buffer = (string) $buffer;
$this->saveEncoding();
+ $this->extractLineNumbers($this->buffer);
+
+ // discard space/comments at the start
+ $this->discardComments = true;
+ $this->whitespace();
+ $this->discardComments = false;
$selector = $this->selectors($out);
$this->restoreEncoding();
+ if ($shouldValidate && $this->count !== strlen($buffer)) {
+ throw $this->parseError("`" . substr($buffer, $this->count) . "` is not a valid Selector in `$buffer`");
+ }
+
return $selector;
}
@@ -272,10 +371,10 @@ class Parser
*
* @api
*
- * @param string $buffer
- * @param string|array $out
+ * @param string $buffer
+ * @param array $out
*
- * @return boolean
+ * @return bool
*/
public function parseMediaQueryList($buffer, &$out)
{
@@ -286,6 +385,7 @@ class Parser
$this->buffer = (string) $buffer;
$this->saveEncoding();
+ $this->extractLineNumbers($this->buffer);
$isMediaQuery = $this->mediaQueryList($out);
@@ -331,7 +431,7 @@ class Parser
* position into $s. Then if a chain fails, use $this->seek($s) to
* go back where we started.
*
- * @return boolean
+ * @return bool
*/
protected function parseChunk()
{
@@ -339,15 +439,19 @@ class Parser
// the directives
if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] === '@') {
- if ($this->literal('@at-root', 8) &&
+ if (
+ $this->literal('@at-root', 8) &&
($this->selectors($selector) || true) &&
($this->map($with) || true) &&
- (($this->matchChar('(')
- && $this->interpolation($with)
- && $this->matchChar(')')) || true) &&
+ (($this->matchChar('(') &&
+ $this->interpolation($with) &&
+ $this->matchChar(')')) || true) &&
$this->matchChar('{', false)
) {
- $atRoot = $this->pushSpecialBlock(Type::T_AT_ROOT, $s);
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ $atRoot = new AtRootBlock();
+ $this->registerPushedBlock($atRoot, $s);
$atRoot->selector = $selector;
$atRoot->with = $with;
@@ -356,8 +460,13 @@ class Parser
$this->seek($s);
- if ($this->literal('@media', 6) && $this->mediaQueryList($mediaQueryList) && $this->matchChar('{', false)) {
- $media = $this->pushSpecialBlock(Type::T_MEDIA, $s);
+ if (
+ $this->literal('@media', 6) &&
+ $this->mediaQueryList($mediaQueryList) &&
+ $this->matchChar('{', false)
+ ) {
+ $media = new MediaBlock();
+ $this->registerPushedBlock($media, $s);
$media->queryList = $mediaQueryList[2];
return true;
@@ -365,12 +474,16 @@ class Parser
$this->seek($s);
- if ($this->literal('@mixin', 6) &&
+ if (
+ $this->literal('@mixin', 6) &&
$this->keyword($mixinName) &&
($this->argumentDef($args) || true) &&
$this->matchChar('{', false)
) {
- $mixin = $this->pushSpecialBlock(Type::T_MIXIN, $s);
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ $mixin = new CallableBlock(Type::T_MIXIN);
+ $this->registerPushedBlock($mixin, $s);
$mixin->name = $mixinName;
$mixin->args = $args;
@@ -379,17 +492,20 @@ class Parser
$this->seek($s);
- if ($this->literal('@include', 8) &&
- $this->keyword($mixinName) &&
- ($this->matchChar('(') &&
+ if (
+ ($this->literal('@include', 8) &&
+ $this->keyword($mixinName) &&
+ ($this->matchChar('(') &&
($this->argValues($argValues) || true) &&
$this->matchChar(')') || true) &&
- ($this->end() ||
- ($this->literal('using', 5) &&
- $this->argumentDef($argUsing) &&
- ($this->end() || $this->matchChar('{') && $hasBlock = true)) ||
- $this->matchChar('{') && $hasBlock = true)
+ ($this->end()) ||
+ ($this->literal('using', 5) &&
+ $this->argumentDef($argUsing) &&
+ ($this->end() || $this->matchChar('{') && $hasBlock = true)) ||
+ $this->matchChar('{') && $hasBlock = true)
) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
$child = [
Type::T_INCLUDE,
$mixinName,
@@ -399,7 +515,8 @@ class Parser
];
if (! empty($hasBlock)) {
- $include = $this->pushSpecialBlock(Type::T_INCLUDE, $s);
+ $include = new ContentBlock();
+ $this->registerPushedBlock($include, $s);
$include->child = $child;
} else {
$this->append($child, $s);
@@ -410,10 +527,17 @@ class Parser
$this->seek($s);
- if ($this->literal('@scssphp-import-once', 20) &&
+ if (
+ $this->literal('@scssphp-import-once', 20) &&
$this->valueList($importPath) &&
$this->end()
) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ list($line, $column) = $this->getSourcePosition($s);
+ $file = $this->sourceName;
+ $this->logger->warn("The \"@scssphp-import-once\" directive is deprecated and will be removed in ScssPhp 2.0, in \"$file\", line $line, column $column.", true);
+
$this->append([Type::T_SCSSPHP_IMPORT_ONCE, $importPath], $s);
return true;
@@ -421,10 +545,18 @@ class Parser
$this->seek($s);
- if ($this->literal('@import', 7) &&
+ if (
+ $this->literal('@import', 7) &&
$this->valueList($importPath) &&
+ $importPath[0] !== Type::T_FUNCTION_CALL &&
$this->end()
) {
+ if ($this->cssOnly) {
+ $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s);
+ $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]);
+ return true;
+ }
+
$this->append([Type::T_IMPORT, $importPath], $s);
return true;
@@ -432,10 +564,17 @@ class Parser
$this->seek($s);
- if ($this->literal('@import', 7) &&
+ if (
+ $this->literal('@import', 7) &&
$this->url($importPath) &&
$this->end()
) {
+ if ($this->cssOnly) {
+ $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s);
+ $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]);
+ return true;
+ }
+
$this->append([Type::T_IMPORT, $importPath], $s);
return true;
@@ -443,10 +582,13 @@ class Parser
$this->seek($s);
- if ($this->literal('@extend', 7) &&
+ if (
+ $this->literal('@extend', 7) &&
$this->selectors($selectors) &&
$this->end()
) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
// check for '!flag'
$optional = $this->stripOptionalFlag($selectors);
$this->append([Type::T_EXTEND, $selectors, $optional], $s);
@@ -456,12 +598,16 @@ class Parser
$this->seek($s);
- if ($this->literal('@function', 9) &&
+ if (
+ $this->literal('@function', 9) &&
$this->keyword($fnName) &&
$this->argumentDef($args) &&
$this->matchChar('{', false)
) {
- $func = $this->pushSpecialBlock(Type::T_FUNCTION, $s);
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ $func = new CallableBlock(Type::T_FUNCTION);
+ $this->registerPushedBlock($func, $s);
$func->name = $fnName;
$func->args = $args;
@@ -470,23 +616,13 @@ class Parser
$this->seek($s);
- if ($this->literal('@break', 6) && $this->end()) {
- $this->append([Type::T_BREAK], $s);
+ if (
+ $this->literal('@return', 7) &&
+ ($this->valueList($retVal) || true) &&
+ $this->end()
+ ) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
- return true;
- }
-
- $this->seek($s);
-
- if ($this->literal('@continue', 9) && $this->end()) {
- $this->append([Type::T_CONTINUE], $s);
-
- return true;
- }
-
- $this->seek($s);
-
- if ($this->literal('@return', 7) && ($this->valueList($retVal) || true) && $this->end()) {
$this->append([Type::T_RETURN, isset($retVal) ? $retVal : [Type::T_NULL]], $s);
return true;
@@ -494,13 +630,17 @@ class Parser
$this->seek($s);
- if ($this->literal('@each', 5) &&
+ if (
+ $this->literal('@each', 5) &&
$this->genericList($varNames, 'variable', ',', false) &&
$this->literal('in', 2) &&
$this->valueList($list) &&
$this->matchChar('{', false)
) {
- $each = $this->pushSpecialBlock(Type::T_EACH, $s);
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ $each = new EachBlock();
+ $this->registerPushedBlock($each, $s);
foreach ($varNames[2] as $varName) {
$each->vars[] = $varName[1];
@@ -513,11 +653,24 @@ class Parser
$this->seek($s);
- if ($this->literal('@while', 6) &&
+ if (
+ $this->literal('@while', 6) &&
$this->expression($cond) &&
$this->matchChar('{', false)
) {
- $while = $this->pushSpecialBlock(Type::T_WHILE, $s);
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ while (
+ $cond[0] === Type::T_LIST &&
+ ! empty($cond['enclosing']) &&
+ $cond['enclosing'] === 'parent' &&
+ \count($cond[2]) == 1
+ ) {
+ $cond = reset($cond[2]);
+ }
+
+ $while = new WhileBlock();
+ $this->registerPushedBlock($while, $s);
$while->cond = $cond;
return true;
@@ -525,7 +678,8 @@ class Parser
$this->seek($s);
- if ($this->literal('@for', 4) &&
+ if (
+ $this->literal('@for', 4) &&
$this->variable($varName) &&
$this->literal('from', 4) &&
$this->expression($start) &&
@@ -534,7 +688,10 @@ class Parser
$this->expression($end) &&
$this->matchChar('{', false)
) {
- $for = $this->pushSpecialBlock(Type::T_FOR, $s);
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ $for = new ForBlock();
+ $this->registerPushedBlock($for, $s);
$for->var = $varName[1];
$for->start = $start;
$for->end = $end;
@@ -545,14 +702,24 @@ class Parser
$this->seek($s);
- if ($this->literal('@if', 3) && $this->valueList($cond) && $this->matchChar('{', false)) {
- $if = $this->pushSpecialBlock(Type::T_IF, $s);
- while ($cond[0] === Type::T_LIST
- && !empty($cond['enclosing'])
- && $cond['enclosing'] === 'parent'
- && count($cond[2]) == 1) {
+ if (
+ $this->literal('@if', 3) &&
+ $this->functionCallArgumentsList($cond, false, '{', false)
+ ) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+ $if = new IfBlock();
+ $this->registerPushedBlock($if, $s);
+
+ while (
+ $cond[0] === Type::T_LIST &&
+ ! empty($cond['enclosing']) &&
+ $cond['enclosing'] === 'parent' &&
+ \count($cond[2]) == 1
+ ) {
$cond = reset($cond[2]);
}
+
$if->cond = $cond;
$if->cases = [];
@@ -561,10 +728,12 @@ class Parser
$this->seek($s);
- if ($this->literal('@debug', 6) &&
- $this->valueList($value) &&
- $this->end()
+ if (
+ $this->literal('@debug', 6) &&
+ $this->functionCallArgumentsList($value, false)
) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
$this->append([Type::T_DEBUG, $value], $s);
return true;
@@ -572,10 +741,12 @@ class Parser
$this->seek($s);
- if ($this->literal('@warn', 5) &&
- $this->valueList($value) &&
- $this->end()
+ if (
+ $this->literal('@warn', 5) &&
+ $this->functionCallArgumentsList($value, false)
) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
$this->append([Type::T_WARN, $value], $s);
return true;
@@ -583,10 +754,12 @@ class Parser
$this->seek($s);
- if ($this->literal('@error', 6) &&
- $this->valueList($value) &&
- $this->end()
+ if (
+ $this->literal('@error', 6) &&
+ $this->functionCallArgumentsList($value, false)
) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
$this->append([Type::T_ERROR, $value], $s);
return true;
@@ -594,14 +767,16 @@ class Parser
$this->seek($s);
- #if ($this->literal('@content', 8))
-
- if ($this->literal('@content', 8) &&
+ if (
+ $this->literal('@content', 8) &&
($this->end() ||
$this->matchChar('(') &&
- $this->argValues($argContent) &&
- $this->matchChar(')') &&
- $this->end())) {
+ $this->argValues($argContent) &&
+ $this->matchChar(')') &&
+ $this->end())
+ ) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
$this->append([Type::T_MIXIN_CONTENT, isset($argContent) ? $argContent : null], $s);
return true;
@@ -613,17 +788,21 @@ class Parser
if (isset($last) && $last[0] === Type::T_IF) {
list(, $if) = $last;
+ assert($if instanceof IfBlock);
if ($this->literal('@else', 5)) {
if ($this->matchChar('{', false)) {
- $else = $this->pushSpecialBlock(Type::T_ELSE, $s);
- } elseif ($this->literal('if', 2) && $this->valueList($cond) && $this->matchChar('{', false)) {
- $else = $this->pushSpecialBlock(Type::T_ELSEIF, $s);
+ $else = new ElseBlock();
+ } elseif (
+ $this->literal('if', 2) &&
+ $this->functionCallArgumentsList($cond, false, '{', false)
+ ) {
+ $else = new ElseifBlock();
$else->cond = $cond;
}
if (isset($else)) {
- $else->dontAppend = true;
+ $this->registerPushedBlock($else, $s);
$if->cases[] = $else;
return true;
@@ -634,32 +813,23 @@ class Parser
}
// only retain the first @charset directive encountered
- if ($this->literal('@charset', 8) &&
+ if (
+ $this->literal('@charset', 8) &&
$this->valueList($charset) &&
$this->end()
) {
- if (! isset($this->charset)) {
- $statement = [Type::T_CHARSET, $charset];
-
- list($line, $column) = $this->getSourcePosition($s);
-
- $statement[static::SOURCE_LINE] = $line;
- $statement[static::SOURCE_COLUMN] = $column;
- $statement[static::SOURCE_INDEX] = $this->sourceIndex;
-
- $this->charset = $statement;
- }
-
return true;
}
$this->seek($s);
- if ($this->literal('@supports', 9) &&
- ($t1=$this->supportsQuery($supportQuery)) &&
- ($t2=$this->matchChar('{', false))
+ if (
+ $this->literal('@supports', 9) &&
+ ($t1 = $this->supportsQuery($supportQuery)) &&
+ ($t2 = $this->matchChar('{', false))
) {
- $directive = $this->pushSpecialBlock(Type::T_DIRECTIVE, $s);
+ $directive = new DirectiveBlock();
+ $this->registerPushedBlock($directive, $s);
$directive->name = 'supports';
$directive->value = $supportQuery;
@@ -669,19 +839,26 @@ class Parser
$this->seek($s);
// doesn't match built in directive, do generic one
- if ($this->matchChar('@', false) &&
- $this->keyword($dirName) &&
- ($this->variable($dirValue) || $this->openString('{', $dirValue) || true) &&
- $this->matchChar('{', false)
+ if (
+ $this->matchChar('@', false) &&
+ $this->mixedKeyword($dirName) &&
+ $this->directiveValue($dirValue, '{')
) {
- if ($dirName === 'media') {
- $directive = $this->pushSpecialBlock(Type::T_MEDIA, $s);
+ if (count($dirName) === 1 && is_string(reset($dirName))) {
+ $dirName = reset($dirName);
} else {
- $directive = $this->pushSpecialBlock(Type::T_DIRECTIVE, $s);
+ $dirName = [Type::T_STRING, '', $dirName];
+ }
+ if ($dirName === 'media') {
+ $directive = new MediaBlock();
+ } else {
+ $directive = new DirectiveBlock();
$directive->name = $dirName;
}
+ $this->registerPushedBlock($directive, $s);
if (isset($dirValue)) {
+ ! $this->cssOnly || ($dirValue = $this->assertPlainCssValid($dirValue));
$directive->value = $dirValue;
}
@@ -691,12 +868,38 @@ class Parser
$this->seek($s);
// maybe it's a generic blockless directive
- if ($this->matchChar('@', false) &&
- $this->keyword($dirName) &&
- $this->valueList($dirValue) &&
- $this->end()
+ if (
+ $this->matchChar('@', false) &&
+ $this->mixedKeyword($dirName) &&
+ ! $this->isKnownGenericDirective($dirName) &&
+ ($this->end(false) || ($this->directiveValue($dirValue, '') && $this->end(false)))
) {
- $this->append([Type::T_DIRECTIVE, [$dirName, $dirValue]], $s);
+ if (\count($dirName) === 1 && \is_string(\reset($dirName))) {
+ $dirName = \reset($dirName);
+ } else {
+ $dirName = [Type::T_STRING, '', $dirName];
+ }
+ if (
+ ! empty($this->env->parent) &&
+ $this->env->type &&
+ ! \in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA])
+ ) {
+ $plain = \trim(\substr($this->buffer, $s, $this->count - $s));
+ throw $this->parseError(
+ "Unknown directive `{$plain}` not allowed in `" . $this->env->type . "` block"
+ );
+ }
+ // blockless directives with a blank line after keeps their blank lines after
+ // sass-spec compliance purpose
+ $s = $this->count;
+ $hasBlankLine = false;
+ if ($this->match('\s*?\n\s*\n', $out, false)) {
+ $hasBlankLine = true;
+ $this->seek($s);
+ }
+ $isNotRoot = ! empty($this->env->parent);
+ $this->append([Type::T_DIRECTIVE, [$dirName, $dirValue, $hasBlankLine, $isNotRoot]], $s);
+ $this->whitespace();
return true;
}
@@ -706,9 +909,60 @@ class Parser
return false;
}
+ $inCssSelector = null;
+ if ($this->cssOnly) {
+ $inCssSelector = (! empty($this->env->parent) &&
+ ! in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA]));
+ }
+ // custom properties : right part is static
+ if (($this->customProperty($name) ) && $this->matchChar(':', false)) {
+ $start = $this->count;
+
+ // but can be complex and finish with ; or }
+ foreach ([';','}'] as $ending) {
+ if (
+ $this->openString($ending, $stringValue, '(', ')', false) &&
+ $this->end()
+ ) {
+ $end = $this->count;
+ $value = $stringValue;
+
+ // check if we have only a partial value due to nested [] or { } to take in account
+ $nestingPairs = [['[', ']'], ['{', '}']];
+
+ foreach ($nestingPairs as $nestingPair) {
+ $p = strpos($this->buffer, $nestingPair[0], $start);
+
+ if ($p && $p < $end) {
+ $this->seek($start);
+
+ if (
+ $this->openString($ending, $stringValue, $nestingPair[0], $nestingPair[1], false) &&
+ $this->end() &&
+ $this->count > $end
+ ) {
+ $end = $this->count;
+ $value = $stringValue;
+ }
+ }
+ }
+
+ $this->seek($end);
+ $this->append([Type::T_CUSTOM_PROPERTY, $name, $value], $s);
+
+ return true;
+ }
+ }
+
+ // TODO: output an error here if nothing found according to sass spec
+ }
+
+ $this->seek($s);
+
// property shortcut
// captures most properties before having to parse a selector
- if ($this->keyword($name, false) &&
+ if (
+ $this->keyword($name, false) &&
$this->literal(': ', 2) &&
$this->valueList($value) &&
$this->end()
@@ -722,11 +976,14 @@ class Parser
$this->seek($s);
// variable assigns
- if ($this->variable($name) &&
+ if (
+ $this->variable($name) &&
$this->matchChar(':') &&
$this->valueList($value) &&
$this->end()
) {
+ ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
// check for '!flag'
$assignmentFlags = $this->stripAssignmentFlags($value);
$this->append([Type::T_ASSIGN, $name, $value, $assignmentFlags], $s);
@@ -736,13 +993,13 @@ class Parser
$this->seek($s);
- // misc
- if ($this->literal('-->', 3)) {
- return true;
- }
-
// opening css block
- if ($this->selectors($selectors) && $this->matchChar('{', false)) {
+ if (
+ $this->selectors($selectors) &&
+ $this->matchChar('{', false)
+ ) {
+ ! $this->cssOnly || ! $inCssSelector || $this->assertPlainCssValid(false);
+
$this->pushBlock($selectors, $s);
if ($this->eatWhiteDefault) {
@@ -756,12 +1013,15 @@ class Parser
$this->seek($s);
// property assign, or nested assign
- if ($this->propertyName($name) && $this->matchChar(':')) {
+ if (
+ $this->propertyName($name) &&
+ $this->matchChar(':')
+ ) {
$foundSomething = false;
if ($this->valueList($value)) {
if (empty($this->env->parent)) {
- $this->throwParseError('expected "{"');
+ throw $this->parseError('expected "{"');
}
$this->append([Type::T_ASSIGN, $name, $value], $s);
@@ -769,7 +1029,10 @@ class Parser
}
if ($this->matchChar('{', false)) {
- $propBlock = $this->pushSpecialBlock(Type::T_NESTED_PROPERTY, $s);
+ ! $this->cssOnly || $this->assertPlainCssValid(false);
+
+ $propBlock = new NestedPropertyBlock();
+ $this->registerPushedBlock($propBlock, $s);
$propBlock->prefix = $name;
$propBlock->hasValue = $foundSomething;
@@ -790,17 +1053,20 @@ class Parser
$block = $this->popBlock();
if (! isset($block->type) || $block->type !== Type::T_IF) {
+ assert($this->env !== null);
+
if ($this->env->parent) {
$this->append(null); // collect comments before next statement if needed
}
}
- if (isset($block->type) && $block->type === Type::T_INCLUDE) {
+ if ($block instanceof ContentBlock) {
$include = $block->child;
+ assert(\is_array($include));
unset($block->child);
$include[3] = $block;
$this->append($include, $s);
- } elseif (empty($block->dontAppend)) {
+ } elseif (!$block instanceof ElseBlock && !$block instanceof ElseifBlock) {
$type = isset($block->type) ? $block->type : Type::T_BLOCK;
$this->append([$type, $block], $s);
}
@@ -808,6 +1074,7 @@ class Parser
// collect comments just after the block closing if needed
if ($this->eatWhiteDefault) {
$this->whitespace();
+ assert($this->env !== null);
if ($this->env->comments) {
$this->append(null);
@@ -818,9 +1085,7 @@ class Parser
}
// extra stuff
- if ($this->matchChar(';') ||
- $this->literal('
+
+
+
+
@@ -207,7 +254,6 @@
-
@@ -221,6 +267,7 @@
+
@@ -233,8 +280,10 @@
-
+
+
+
@@ -242,6 +291,7 @@
+
@@ -249,18 +299,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -273,6 +337,14 @@
+
+
+
+
+
+
+
+
diff --git a/lib/symfony/dependency-injection/Parameter.php b/lib/symfony/dependency-injection/Parameter.php
index cac6f6c4c..e182e1240 100644
--- a/lib/symfony/dependency-injection/Parameter.php
+++ b/lib/symfony/dependency-injection/Parameter.php
@@ -20,19 +20,16 @@ class Parameter
{
private $id;
- /**
- * @param string $id The parameter key
- */
- public function __construct($id)
+ public function __construct(string $id)
{
$this->id = $id;
}
/**
- * @return string The parameter key
+ * @return string
*/
public function __toString()
{
- return (string) $this->id;
+ return $this->id;
}
}
diff --git a/lib/symfony/dependency-injection/ParameterBag/ContainerBag.php b/lib/symfony/dependency-injection/ParameterBag/ContainerBag.php
new file mode 100644
index 000000000..54aaa556b
--- /dev/null
+++ b/lib/symfony/dependency-injection/ParameterBag/ContainerBag.php
@@ -0,0 +1,55 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\ParameterBag;
+
+use Symfony\Component\DependencyInjection\Container;
+
+/**
+ * @author Nicolas Grekas
+ */
+class ContainerBag extends FrozenParameterBag implements ContainerBagInterface
+{
+ private $container;
+
+ public function __construct(Container $container)
+ {
+ $this->container = $container;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function all()
+ {
+ return $this->container->getParameterBag()->all();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return array|bool|string|int|float|\UnitEnum|null
+ */
+ public function get(string $name)
+ {
+ return $this->container->getParameter($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return bool
+ */
+ public function has(string $name)
+ {
+ return $this->container->hasParameter($name);
+ }
+}
diff --git a/lib/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php b/lib/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php
new file mode 100644
index 000000000..f8380ac97
--- /dev/null
+++ b/lib/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php
@@ -0,0 +1,57 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\ParameterBag;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+
+/**
+ * ContainerBagInterface is the interface implemented by objects that manage service container parameters.
+ *
+ * @author Nicolas Grekas
+ */
+interface ContainerBagInterface extends ContainerInterface
+{
+ /**
+ * Gets the service container parameters.
+ *
+ * @return array
+ */
+ public function all();
+
+ /**
+ * Replaces parameter placeholders (%name%) by their values.
+ *
+ * @param mixed $value A value
+ *
+ * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
+ */
+ public function resolveValue($value);
+
+ /**
+ * Escape parameter placeholders %.
+ *
+ * @param mixed $value
+ *
+ * @return mixed
+ */
+ public function escapeValue($value);
+
+ /**
+ * Unescape parameter placeholders %.
+ *
+ * @param mixed $value
+ *
+ * @return mixed
+ */
+ public function unescapeValue($value);
+}
diff --git a/lib/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php b/lib/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php
index c4e369b01..67b8aeeb1 100644
--- a/lib/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php
+++ b/lib/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php
@@ -19,15 +19,19 @@ use Symfony\Component\DependencyInjection\Exception\RuntimeException;
*/
class EnvPlaceholderParameterBag extends ParameterBag
{
+ private $envPlaceholderUniquePrefix;
private $envPlaceholders = [];
+ private $unusedEnvPlaceholders = [];
private $providedTypes = [];
+ private static $counter = 0;
+
/**
* {@inheritdoc}
*/
- public function get($name)
+ public function get(string $name)
{
- if (0 === strpos($name, 'env(') && ')' === substr($name, -1) && 'env()' !== $name) {
+ if (str_starts_with($name, 'env(') && str_ends_with($name, ')') && 'env()' !== $name) {
$env = substr($name, 4, -1);
if (isset($this->envPlaceholders[$env])) {
@@ -35,20 +39,20 @@ class EnvPlaceholderParameterBag extends ParameterBag
return $placeholder; // return first result
}
}
- if (!preg_match('/^(?:\w++:)*+\w++$/', $env)) {
- throw new InvalidArgumentException(sprintf('Invalid "%s" name: only "word" characters are allowed.', $name));
- }
-
- if ($this->has($name)) {
- $defaultValue = parent::get($name);
-
- if (null !== $defaultValue && !is_scalar($defaultValue)) {
- throw new RuntimeException(sprintf('The default value of an env() parameter must be scalar or null, but "%s" given to "%s".', \gettype($defaultValue), $name));
+ if (isset($this->unusedEnvPlaceholders[$env])) {
+ foreach ($this->unusedEnvPlaceholders[$env] as $placeholder) {
+ return $placeholder; // return first result
}
}
+ if (!preg_match('/^(?:[-.\w]*+:)*+\w++$/', $env)) {
+ throw new InvalidArgumentException(sprintf('Invalid %s name: only "word" characters are allowed.', $name));
+ }
+ if ($this->has($name) && null !== ($defaultValue = parent::get($name)) && !\is_string($defaultValue)) {
+ throw new RuntimeException(sprintf('The default value of an env() parameter must be a string or null, but "%s" given to "%s".', get_debug_type($defaultValue), $name));
+ }
- $uniqueName = md5($name.uniqid(mt_rand(), true));
- $placeholder = sprintf('env_%s_%s', str_replace(':', '_', $env), $uniqueName);
+ $uniqueName = md5($name.'_'.self::$counter++);
+ $placeholder = sprintf('%s_%s_%s', $this->getEnvPlaceholderUniquePrefix(), strtr($env, ':-.', '___'), $uniqueName);
$this->envPlaceholders[$env][$placeholder] = $placeholder;
return $placeholder;
@@ -57,6 +61,20 @@ class EnvPlaceholderParameterBag extends ParameterBag
return parent::get($name);
}
+ /**
+ * Gets the common env placeholder prefix for env vars created by this bag.
+ */
+ public function getEnvPlaceholderUniquePrefix(): string
+ {
+ if (null === $this->envPlaceholderUniquePrefix) {
+ $reproducibleEntropy = unserialize(serialize($this->parameters));
+ array_walk_recursive($reproducibleEntropy, function (&$v) { $v = null; });
+ $this->envPlaceholderUniquePrefix = 'env_'.substr(md5(serialize($reproducibleEntropy)), -16);
+ }
+
+ return $this->envPlaceholderUniquePrefix;
+ }
+
/**
* Returns the map of env vars used in the resolved parameter values to their placeholders.
*
@@ -67,6 +85,16 @@ class EnvPlaceholderParameterBag extends ParameterBag
return $this->envPlaceholders;
}
+ public function getUnusedEnvPlaceholders(): array
+ {
+ return $this->unusedEnvPlaceholders;
+ }
+
+ public function clearUnusedEnvPlaceholders()
+ {
+ $this->unusedEnvPlaceholders = [];
+ }
+
/**
* Merges the env placeholders of another EnvPlaceholderParameterBag.
*/
@@ -79,6 +107,14 @@ class EnvPlaceholderParameterBag extends ParameterBag
$this->envPlaceholders[$env] += $placeholders;
}
}
+
+ if ($newUnusedPlaceholders = $bag->getUnusedEnvPlaceholders()) {
+ $this->unusedEnvPlaceholders += $newUnusedPlaceholders;
+
+ foreach ($newUnusedPlaceholders as $env => $placeholders) {
+ $this->unusedEnvPlaceholders[$env] += $placeholders;
+ }
+ }
}
/**
@@ -110,13 +146,8 @@ class EnvPlaceholderParameterBag extends ParameterBag
parent::resolve();
foreach ($this->envPlaceholders as $env => $placeholders) {
- if (!$this->has($name = "env($env)")) {
- continue;
- }
- if (is_numeric($default = $this->parameters[$name])) {
- $this->parameters[$name] = (string) $default;
- } elseif (null !== $default && !is_scalar($default)) {
- throw new RuntimeException(sprintf('The default value of env parameter "%s" must be scalar or null, "%s" given.', $env, \gettype($default)));
+ if ($this->has($name = "env($env)") && null !== ($default = $this->parameters[$name]) && !\is_string($default)) {
+ throw new RuntimeException(sprintf('The default value of env parameter "%s" must be a string or null, "%s" given.', $env, get_debug_type($default)));
}
}
}
diff --git a/lib/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php b/lib/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php
index a5199937e..5a4aaf8b2 100644
--- a/lib/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php
+++ b/lib/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php
@@ -53,7 +53,7 @@ class FrozenParameterBag extends ParameterBag
/**
* {@inheritdoc}
*/
- public function set($name, $value)
+ public function set(string $name, $value)
{
throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
}
@@ -61,7 +61,7 @@ class FrozenParameterBag extends ParameterBag
/**
* {@inheritdoc}
*/
- public function remove($name)
+ public function remove(string $name)
{
throw new LogicException('Impossible to call remove() on a frozen ParameterBag.');
}
diff --git a/lib/symfony/dependency-injection/ParameterBag/ParameterBag.php b/lib/symfony/dependency-injection/ParameterBag/ParameterBag.php
index 24dc8035f..b1bf77568 100644
--- a/lib/symfony/dependency-injection/ParameterBag/ParameterBag.php
+++ b/lib/symfony/dependency-injection/ParameterBag/ParameterBag.php
@@ -25,18 +25,13 @@ class ParameterBag implements ParameterBagInterface
protected $parameters = [];
protected $resolved = false;
- private $normalizedNames = [];
-
- /**
- * @param array $parameters An array of parameters
- */
public function __construct(array $parameters = [])
{
$this->add($parameters);
}
/**
- * Clears all parameters.
+ * {@inheritdoc}
*/
public function clear()
{
@@ -44,9 +39,7 @@ class ParameterBag implements ParameterBagInterface
}
/**
- * Adds parameters to the service container parameters.
- *
- * @param array $parameters An array of parameters
+ * {@inheritdoc}
*/
public function add(array $parameters)
{
@@ -66,10 +59,8 @@ class ParameterBag implements ParameterBagInterface
/**
* {@inheritdoc}
*/
- public function get($name)
+ public function get(string $name)
{
- $name = $this->normalizeName($name);
-
if (!\array_key_exists($name, $this->parameters)) {
if (!$name) {
throw new ParameterNotFoundException($name);
@@ -78,13 +69,13 @@ class ParameterBag implements ParameterBagInterface
$alternatives = [];
foreach ($this->parameters as $key => $parameterValue) {
$lev = levenshtein($name, $key);
- if ($lev <= \strlen($name) / 3 || false !== strpos($key, $name)) {
+ if ($lev <= \strlen($name) / 3 || str_contains($key, $name)) {
$alternatives[] = $key;
}
}
$nonNestedAlternative = null;
- if (!\count($alternatives) && false !== strpos($name, '.')) {
+ if (!\count($alternatives) && str_contains($name, '.')) {
$namePartsLength = array_map('strlen', explode('.', $name));
$key = substr($name, 0, -1 * (1 + array_pop($namePartsLength)));
while (\count($namePartsLength)) {
@@ -106,32 +97,27 @@ class ParameterBag implements ParameterBagInterface
}
/**
- * Sets a service container parameter.
- *
- * @param string $name The parameter name
- * @param mixed $value The parameter value
+ * {@inheritdoc}
*/
- public function set($name, $value)
+ public function set(string $name, $value)
{
- $this->parameters[$this->normalizeName($name)] = $value;
+ $this->parameters[$name] = $value;
}
/**
* {@inheritdoc}
*/
- public function has($name)
+ public function has(string $name)
{
- return \array_key_exists($this->normalizeName($name), $this->parameters);
+ return \array_key_exists($name, $this->parameters);
}
/**
- * Removes a parameter.
- *
- * @param string $name The parameter name
+ * {@inheritdoc}
*/
- public function remove($name)
+ public function remove(string $name)
{
- unset($this->parameters[$this->normalizeName($name)]);
+ unset($this->parameters[$name]);
}
/**
@@ -165,7 +151,7 @@ class ParameterBag implements ParameterBagInterface
* @param mixed $value A value
* @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
*
- * @return mixed The resolved value
+ * @return mixed
*
* @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
* @throws ParameterCircularReferenceException if a circular reference if detected
@@ -192,29 +178,27 @@ class ParameterBag implements ParameterBagInterface
/**
* Resolves parameters inside a string.
*
- * @param string $value The string to resolve
- * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
+ * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
*
- * @return mixed The resolved string
+ * @return mixed
*
* @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
* @throws ParameterCircularReferenceException if a circular reference if detected
* @throws RuntimeException when a given parameter has a type problem
*/
- public function resolveString($value, array $resolving = [])
+ public function resolveString(string $value, array $resolving = [])
{
// we do this to deal with non string values (Boolean, integer, ...)
// as the preg_replace_callback throw an exception when trying
// a non-string in a parameter value
if (preg_match('/^%([^%\s]+)%$/', $value, $match)) {
$key = $match[1];
- $lcKey = strtolower($key); // strtolower() to be removed in 4.0
- if (isset($resolving[$lcKey])) {
+ if (isset($resolving[$key])) {
throw new ParameterCircularReferenceException(array_keys($resolving));
}
- $resolving[$lcKey] = true;
+ $resolving[$key] = true;
return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
}
@@ -226,19 +210,18 @@ class ParameterBag implements ParameterBagInterface
}
$key = $match[1];
- $lcKey = strtolower($key); // strtolower() to be removed in 4.0
- if (isset($resolving[$lcKey])) {
+ if (isset($resolving[$key])) {
throw new ParameterCircularReferenceException(array_keys($resolving));
}
$resolved = $this->get($key);
if (!\is_string($resolved) && !is_numeric($resolved)) {
- throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type "%s" inside string value "%s".', $key, \gettype($resolved), $value));
+ throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type "%s" inside string value "%s".', $key, get_debug_type($resolved), $value));
}
$resolved = (string) $resolved;
- $resolving[$lcKey] = true;
+ $resolving[$key] = true;
return $this->isResolved() ? $resolved : $this->resolveString($resolved, $resolving);
}, $value);
@@ -290,18 +273,4 @@ class ParameterBag implements ParameterBagInterface
return $value;
}
-
- private function normalizeName($name)
- {
- if (isset($this->normalizedNames[$normalizedName = strtolower($name)])) {
- $normalizedName = $this->normalizedNames[$normalizedName];
- if ((string) $name !== $normalizedName) {
- @trigger_error(sprintf('Parameter names will be made case sensitive in Symfony 4.0. Using "%s" instead of "%s" is deprecated since Symfony 3.4.', $name, $normalizedName), \E_USER_DEPRECATED);
- }
- } else {
- $normalizedName = $this->normalizedNames[$normalizedName] = (string) $name;
- }
-
- return $normalizedName;
- }
}
diff --git a/lib/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php b/lib/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php
index 7386df064..808a0fa42 100644
--- a/lib/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php
+++ b/lib/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php
@@ -15,7 +15,7 @@ use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
/**
- * ParameterBagInterface.
+ * ParameterBagInterface is the interface implemented by objects that manage service container parameters.
*
* @author Fabien Potencier
*/
@@ -24,62 +24,53 @@ interface ParameterBagInterface
/**
* Clears all parameters.
*
- * @throws LogicException if the ParameterBagInterface can not be cleared
+ * @throws LogicException if the ParameterBagInterface cannot be cleared
*/
public function clear();
/**
* Adds parameters to the service container parameters.
*
- * @param array $parameters An array of parameters
- *
- * @throws LogicException if the parameter can not be added
+ * @throws LogicException if the parameter cannot be added
*/
public function add(array $parameters);
/**
* Gets the service container parameters.
*
- * @return array An array of parameters
+ * @return array
*/
public function all();
/**
* Gets a service container parameter.
*
- * @param string $name The parameter name
- *
- * @return mixed The parameter value
+ * @return array|bool|string|int|float|\UnitEnum|null
*
* @throws ParameterNotFoundException if the parameter is not defined
*/
- public function get($name);
+ public function get(string $name);
/**
* Removes a parameter.
- *
- * @param string $name The parameter name
*/
- public function remove($name);
+ public function remove(string $name);
/**
* Sets a service container parameter.
*
- * @param string $name The parameter name
- * @param mixed $value The parameter value
+ * @param array|bool|string|int|float|\UnitEnum|null $value The parameter value
*
- * @throws LogicException if the parameter can not be set
+ * @throws LogicException if the parameter cannot be set
*/
- public function set($name, $value);
+ public function set(string $name, $value);
/**
* Returns true if a parameter name is defined.
*
- * @param string $name The parameter name
- *
- * @return bool true if the parameter name is defined, false otherwise
+ * @return bool
*/
- public function has($name);
+ public function has(string $name);
/**
* Replaces parameter placeholders (%name%) by their values for all parameters.
diff --git a/lib/symfony/dependency-injection/README.md b/lib/symfony/dependency-injection/README.md
index cb2d4a11c..fa6719a79 100644
--- a/lib/symfony/dependency-injection/README.md
+++ b/lib/symfony/dependency-injection/README.md
@@ -7,8 +7,8 @@ way objects are constructed in your application.
Resources
---------
- * [Documentation](https://symfony.com/doc/current/components/dependency_injection.html)
- * [Contributing](https://symfony.com/doc/current/contributing/index.html)
- * [Report issues](https://github.com/symfony/symfony/issues) and
- [send Pull Requests](https://github.com/symfony/symfony/pulls)
- in the [main Symfony repository](https://github.com/symfony/symfony)
+ * [Documentation](https://symfony.com/doc/current/components/dependency_injection.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/lib/symfony/dependency-injection/Reference.php b/lib/symfony/dependency-injection/Reference.php
index 82906d2b7..7f7b32cc6 100644
--- a/lib/symfony/dependency-injection/Reference.php
+++ b/lib/symfony/dependency-injection/Reference.php
@@ -21,20 +21,14 @@ class Reference
private $id;
private $invalidBehavior;
- /**
- * @param string $id The service identifier
- * @param int $invalidBehavior The behavior when the service does not exist
- *
- * @see Container
- */
- public function __construct($id, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE)
+ public function __construct(string $id, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE)
{
- $this->id = (string) $id;
+ $this->id = $id;
$this->invalidBehavior = $invalidBehavior;
}
/**
- * @return string The service identifier
+ * @return string
*/
public function __toString()
{
diff --git a/lib/symfony/dependency-injection/ResettableContainerInterface.php b/lib/symfony/dependency-injection/ResettableContainerInterface.php
deleted file mode 100644
index b74e67624..000000000
--- a/lib/symfony/dependency-injection/ResettableContainerInterface.php
+++ /dev/null
@@ -1,31 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\DependencyInjection;
-
-/**
- * ResettableContainerInterface defines additional resetting functionality
- * for containers, allowing to release shared services when the container is
- * not needed anymore.
- *
- * @author Christophe Coevoet
- */
-interface ResettableContainerInterface extends ContainerInterface
-{
- /**
- * Resets shared services from the container.
- *
- * The container is not intended to be used again after being reset in a normal workflow. This method is
- * meant as a way to release references for ref-counting.
- * A subsequent call to ContainerInterface::get will recreate a new instance of the shared service.
- */
- public function reset();
-}
diff --git a/lib/symfony/dependency-injection/ReverseContainer.php b/lib/symfony/dependency-injection/ReverseContainer.php
new file mode 100644
index 000000000..280e9e2dd
--- /dev/null
+++ b/lib/symfony/dependency-injection/ReverseContainer.php
@@ -0,0 +1,81 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+
+/**
+ * Turns public and "container.reversible" services back to their ids.
+ *
+ * @author Nicolas Grekas
+ */
+final class ReverseContainer
+{
+ private $serviceContainer;
+ private $reversibleLocator;
+ private $tagName;
+ private $getServiceId;
+
+ public function __construct(Container $serviceContainer, ContainerInterface $reversibleLocator, string $tagName = 'container.reversible')
+ {
+ $this->serviceContainer = $serviceContainer;
+ $this->reversibleLocator = $reversibleLocator;
+ $this->tagName = $tagName;
+ $this->getServiceId = \Closure::bind(function (object $service): ?string {
+ return array_search($service, $this->services, true) ?: array_search($service, $this->privates, true) ?: null;
+ }, $serviceContainer, Container::class);
+ }
+
+ /**
+ * Returns the id of the passed object when it exists as a service.
+ *
+ * To be reversible, services need to be either public or be tagged with "container.reversible".
+ */
+ public function getId(object $service): ?string
+ {
+ if ($this->serviceContainer === $service) {
+ return 'service_container';
+ }
+
+ if (null === $id = ($this->getServiceId)($service)) {
+ return null;
+ }
+
+ if ($this->serviceContainer->has($id) || $this->reversibleLocator->has($id)) {
+ return $id;
+ }
+
+ return null;
+ }
+
+ /**
+ * @throws ServiceNotFoundException When the service is not reversible
+ */
+ public function getService(string $id): object
+ {
+ if ($this->serviceContainer->has($id)) {
+ return $this->serviceContainer->get($id);
+ }
+
+ if ($this->reversibleLocator->has($id)) {
+ return $this->reversibleLocator->get($id);
+ }
+
+ if (isset($this->serviceContainer->getRemovedIds()[$id])) {
+ throw new ServiceNotFoundException($id, null, null, [], sprintf('The "%s" service is private and cannot be accessed by reference. You should either make it public, or tag it as "%s".', $id, $this->tagName));
+ }
+
+ // will throw a ServiceNotFoundException
+ $this->serviceContainer->get($id);
+ }
+}
diff --git a/lib/symfony/dependency-injection/ServiceLocator.php b/lib/symfony/dependency-injection/ServiceLocator.php
index 80be44eba..4be0d6f72 100644
--- a/lib/symfony/dependency-injection/ServiceLocator.php
+++ b/lib/symfony/dependency-injection/ServiceLocator.php
@@ -11,71 +11,68 @@
namespace Symfony\Component\DependencyInjection;
-use Psr\Container\ContainerInterface as PsrContainerInterface;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Contracts\Service\ServiceLocatorTrait;
+use Symfony\Contracts\Service\ServiceProviderInterface;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
/**
* @author Robin Chalas
* @author Nicolas Grekas
*/
-class ServiceLocator implements PsrContainerInterface
+class ServiceLocator implements ServiceProviderInterface
{
- private $factories;
- private $loading = [];
+ use ServiceLocatorTrait {
+ get as private doGet;
+ }
+
private $externalId;
private $container;
- /**
- * @param callable[] $factories
- */
- public function __construct(array $factories)
- {
- $this->factories = $factories;
- }
-
/**
* {@inheritdoc}
+ *
+ * @return mixed
*/
- public function has($id)
+ public function get(string $id)
{
- return isset($this->factories[$id]);
- }
-
- /**
- * {@inheritdoc}
- */
- public function get($id)
- {
- if (!isset($this->factories[$id])) {
- throw new ServiceNotFoundException($id, end($this->loading) ?: null, null, [], $this->createServiceNotFoundMessage($id));
+ if (!$this->externalId) {
+ return $this->doGet($id);
}
- if (isset($this->loading[$id])) {
- $ids = array_values($this->loading);
- $ids = \array_slice($this->loading, array_search($id, $ids));
- $ids[] = $id;
-
- throw new ServiceCircularReferenceException($id, $ids);
- }
-
- $this->loading[$id] = $id;
try {
- return $this->factories[$id]();
- } finally {
- unset($this->loading[$id]);
+ return $this->doGet($id);
+ } catch (RuntimeException $e) {
+ $what = sprintf('service "%s" required by "%s"', $id, $this->externalId);
+ $message = preg_replace('/service "\.service_locator\.[^"]++"/', $what, $e->getMessage());
+
+ if ($e->getMessage() === $message) {
+ $message = sprintf('Cannot resolve %s: %s', $what, $message);
+ }
+
+ $r = new \ReflectionProperty($e, 'message');
+ $r->setAccessible(true);
+ $r->setValue($e, $message);
+
+ throw $e;
}
}
- public function __invoke($id)
+ public function __invoke(string $id)
{
return isset($this->factories[$id]) ? $this->get($id) : null;
}
/**
* @internal
+ *
+ * @return static
*/
- public function withContext($externalId, Container $container)
+ public function withContext(string $externalId, Container $container): self
{
$locator = clone $this;
$locator->externalId = $externalId;
@@ -84,14 +81,16 @@ class ServiceLocator implements PsrContainerInterface
return $locator;
}
- private function createServiceNotFoundMessage($id)
+ private function createNotFoundException(string $id): NotFoundExceptionInterface
{
if ($this->loading) {
- return sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $this->formatAlternatives());
+ $msg = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $this->formatAlternatives());
+
+ return new ServiceNotFoundException($id, end($this->loading) ?: null, null, [], $msg);
}
- $class = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3);
- $class = isset($class[2]['object']) ? \get_class($class[2]['object']) : null;
+ $class = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 4);
+ $class = isset($class[3]['object']) ? \get_class($class[3]['object']) : null;
$externalId = $this->externalId ?: $class;
$msg = [];
@@ -127,10 +126,15 @@ class ServiceLocator implements PsrContainerInterface
$msg[] = 'Try using dependency injection instead.';
}
- return implode(' ', $msg);
+ return new ServiceNotFoundException($id, end($this->loading) ?: null, null, [], implode(' ', $msg));
}
- private function formatAlternatives(array $alternatives = null, $separator = 'and')
+ private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface
+ {
+ return new ServiceCircularReferenceException($id, $path);
+ }
+
+ private function formatAlternatives(array $alternatives = null, string $separator = 'and'): string
{
$format = '"%s"%s';
if (null === $alternatives) {
diff --git a/lib/symfony/dependency-injection/TaggedContainerInterface.php b/lib/symfony/dependency-injection/TaggedContainerInterface.php
index 90b297fff..25d5a098f 100644
--- a/lib/symfony/dependency-injection/TaggedContainerInterface.php
+++ b/lib/symfony/dependency-injection/TaggedContainerInterface.php
@@ -23,7 +23,7 @@ interface TaggedContainerInterface extends ContainerInterface
*
* @param string $name The tag name
*
- * @return array An array of tags
+ * @return array
*/
- public function findTaggedServiceIds($name);
+ public function findTaggedServiceIds(string $name);
}
diff --git a/lib/symfony/dependency-injection/TypedReference.php b/lib/symfony/dependency-injection/TypedReference.php
index aad78e806..4099a0059 100644
--- a/lib/symfony/dependency-injection/TypedReference.php
+++ b/lib/symfony/dependency-injection/TypedReference.php
@@ -19,19 +19,19 @@ namespace Symfony\Component\DependencyInjection;
class TypedReference extends Reference
{
private $type;
- private $requiringClass;
+ private $name;
/**
- * @param string $id The service identifier
- * @param string $type The PHP type of the identified service
- * @param string $requiringClass The class of the service that requires the referenced type
- * @param int $invalidBehavior The behavior when the service does not exist
+ * @param string $id The service identifier
+ * @param string $type The PHP type of the identified service
+ * @param int $invalidBehavior The behavior when the service does not exist
+ * @param string|null $name The name of the argument targeting the service
*/
- public function __construct($id, $type, $requiringClass = '', $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE)
+ public function __construct(string $id, string $type, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, string $name = null)
{
+ $this->name = $type === $id ? $name : null;
parent::__construct($id, $invalidBehavior);
$this->type = $type;
- $this->requiringClass = $requiringClass;
}
public function getType()
@@ -39,13 +39,8 @@ class TypedReference extends Reference
return $this->type;
}
- public function getRequiringClass()
+ public function getName(): ?string
{
- return $this->requiringClass;
- }
-
- public function canBeAutoregistered()
- {
- return $this->requiringClass && (false !== $i = strpos($this->type, '\\')) && 0 === strncasecmp($this->type, $this->requiringClass, 1 + $i);
+ return $this->name;
}
}
diff --git a/lib/symfony/dependency-injection/Variable.php b/lib/symfony/dependency-injection/Variable.php
index 9654ee4dd..21d33ebb2 100644
--- a/lib/symfony/dependency-injection/Variable.php
+++ b/lib/symfony/dependency-injection/Variable.php
@@ -28,14 +28,14 @@ class Variable
{
private $name;
- /**
- * @param string $name
- */
- public function __construct($name)
+ public function __construct(string $name)
{
$this->name = $name;
}
+ /**
+ * @return string
+ */
public function __toString()
{
return $this->name;
diff --git a/lib/symfony/dependency-injection/composer.json b/lib/symfony/dependency-injection/composer.json
index eee41ce02..cb891c790 100644
--- a/lib/symfony/dependency-injection/composer.json
+++ b/lib/symfony/dependency-injection/composer.json
@@ -1,7 +1,7 @@
{
"name": "symfony/dependency-injection",
"type": "library",
- "description": "Symfony DependencyInjection Component",
+ "description": "Allows you to standardize and centralize the way objects are constructed in your application",
"keywords": [],
"homepage": "https://symfony.com",
"license": "MIT",
@@ -16,13 +16,17 @@
}
],
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/container": "^1.0"
+ "php": ">=7.2.5",
+ "psr/container": "^1.1.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22",
+ "symfony/service-contracts": "^1.1.6|^2"
},
"require-dev": {
- "symfony/yaml": "~3.4|~4.0",
- "symfony/config": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0"
+ "symfony/yaml": "^4.4.26|^5.0|^6.0",
+ "symfony/config": "^5.3|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/yaml": "",
@@ -32,13 +36,15 @@
"symfony/proxy-manager-bridge": "Generate service proxies to lazy load them"
},
"conflict": {
- "symfony/config": "<3.3.7",
- "symfony/finder": "<3.3",
- "symfony/proxy-manager-bridge": "<3.4",
- "symfony/yaml": "<3.4"
+ "ext-psr": "<1.1|>=2",
+ "symfony/config": "<5.3",
+ "symfony/finder": "<4.4",
+ "symfony/proxy-manager-bridge": "<4.4",
+ "symfony/yaml": "<4.4.26"
},
"provide": {
- "psr/container-implementation": "1.0"
+ "psr/container-implementation": "1.0",
+ "symfony/service-implementation": "1.0|2.0"
},
"autoload": {
"psr-4": { "Symfony\\Component\\DependencyInjection\\": "" },
diff --git a/lib/symfony/dependency-injection/phpunit.xml.dist b/lib/symfony/dependency-injection/phpunit.xml.dist
deleted file mode 100644
index 21dee2a80..000000000
--- a/lib/symfony/dependency-injection/phpunit.xml.dist
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
- ./Tests/
-
-
-
-
-
- ./
-
- ./Resources
- ./Tests
- ./vendor
-
-
-
-
diff --git a/lib/symfony/config/.gitignore b/lib/symfony/deprecation-contracts/.gitignore
similarity index 100%
rename from lib/symfony/config/.gitignore
rename to lib/symfony/deprecation-contracts/.gitignore
diff --git a/lib/symfony/deprecation-contracts/CHANGELOG.md b/lib/symfony/deprecation-contracts/CHANGELOG.md
new file mode 100644
index 000000000..7932e2613
--- /dev/null
+++ b/lib/symfony/deprecation-contracts/CHANGELOG.md
@@ -0,0 +1,5 @@
+CHANGELOG
+=========
+
+The changelog is maintained for all Symfony contracts at the following URL:
+https://github.com/symfony/contracts/blob/main/CHANGELOG.md
diff --git a/lib/symfony/debug/LICENSE b/lib/symfony/deprecation-contracts/LICENSE
similarity index 96%
rename from lib/symfony/debug/LICENSE
rename to lib/symfony/deprecation-contracts/LICENSE
index 9e936ec04..406242ff2 100644
--- a/lib/symfony/debug/LICENSE
+++ b/lib/symfony/deprecation-contracts/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2020 Fabien Potencier
+Copyright (c) 2020-2022 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/symfony/deprecation-contracts/README.md b/lib/symfony/deprecation-contracts/README.md
new file mode 100644
index 000000000..4957933a6
--- /dev/null
+++ b/lib/symfony/deprecation-contracts/README.md
@@ -0,0 +1,26 @@
+Symfony Deprecation Contracts
+=============================
+
+A generic function and convention to trigger deprecation notices.
+
+This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices.
+
+By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component,
+the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments.
+
+The function requires at least 3 arguments:
+ - the name of the Composer package that is triggering the deprecation
+ - the version of the package that introduced the deprecation
+ - the message of the deprecation
+ - more arguments can be provided: they will be inserted in the message using `printf()` formatting
+
+Example:
+```php
+trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin');
+```
+
+This will generate the following message:
+`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.`
+
+While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty
+`function trigger_deprecation() {}` in your application.
diff --git a/lib/symfony/polyfill-util/composer.json b/lib/symfony/deprecation-contracts/composer.json
similarity index 56%
rename from lib/symfony/polyfill-util/composer.json
rename to lib/symfony/deprecation-contracts/composer.json
index 318bf5d86..cc7cc1237 100644
--- a/lib/symfony/polyfill-util/composer.json
+++ b/lib/symfony/deprecation-contracts/composer.json
@@ -1,8 +1,7 @@
{
- "name": "symfony/polyfill-util",
+ "name": "symfony/deprecation-contracts",
"type": "library",
- "description": "Symfony utilities for portability of PHP codes",
- "keywords": ["polyfill", "shim", "compat", "compatibility"],
+ "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"license": "MIT",
"authors": [
@@ -16,19 +15,21 @@
}
],
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"autoload": {
- "psr-4": { "Symfony\\Polyfill\\Util\\": "" }
+ "files": [
+ "function.php"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-main": "1.19-dev"
+ "dev-main": "2.5-dev"
},
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
}
}
}
diff --git a/lib/symfony/deprecation-contracts/function.php b/lib/symfony/deprecation-contracts/function.php
new file mode 100644
index 000000000..d4371504a
--- /dev/null
+++ b/lib/symfony/deprecation-contracts/function.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+if (!function_exists('trigger_deprecation')) {
+ /**
+ * Triggers a silenced deprecation notice.
+ *
+ * @param string $package The name of the Composer package that is triggering the deprecation
+ * @param string $version The version of the package that introduced the deprecation
+ * @param string $message The message of the deprecation
+ * @param mixed ...$args Values to insert in the message using printf() formatting
+ *
+ * @author Nicolas Grekas
+ */
+ function trigger_deprecation(string $package, string $version, string $message, ...$args): void
+ {
+ @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED);
+ }
+}
diff --git a/lib/symfony/dotenv/.gitignore b/lib/symfony/dotenv/.gitignore
deleted file mode 100644
index c49a5d8df..000000000
--- a/lib/symfony/dotenv/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-vendor/
-composer.lock
-phpunit.xml
diff --git a/lib/symfony/dotenv/CHANGELOG.md b/lib/symfony/dotenv/CHANGELOG.md
index f04cc1bdf..3cf07eecc 100644
--- a/lib/symfony/dotenv/CHANGELOG.md
+++ b/lib/symfony/dotenv/CHANGELOG.md
@@ -1,6 +1,38 @@
CHANGELOG
=========
+5.4
+---
+
+ * Add `dotenv:dump` command to compile the contents of the .env files into a PHP-optimized file called `.env.local.php`
+ * Add `debug:dotenv` command to list all dotenv files with variables and values
+ * Add `$overrideExistingVars` on `Dotenv::bootEnv()` and `Dotenv::loadEnv()`
+
+5.1.0
+-----
+
+ * added `Dotenv::bootEnv()` to check for `.env.local.php` before calling `Dotenv::loadEnv()`
+ * added `Dotenv::setProdEnvs()` and `Dotenv::usePutenv()`
+ * made Dotenv's constructor accept `$envKey` and `$debugKey` arguments, to define
+ the name of the env vars that configure the env name and debug settings
+ * deprecated passing `$usePutenv` argument to Dotenv's constructor
+
+5.0.0
+-----
+
+ * using `putenv()` is disabled by default
+
+4.3.0
+-----
+
+ * deprecated use of `putenv()` by default. This feature will be opted-in with a constructor argument to `Dotenv`
+
+4.2.0
+-----
+
+ * added `Dotenv::overload()` and `$overrideExistingVars` as optional parameter of `Dotenv::populate()`
+ * added `Dotenv::loadEnv()` to load a .env file and its corresponding .env.local, .env.$env and .env.$env.local files if they exist
+
3.3.0
-----
diff --git a/lib/symfony/dotenv/Command/DebugCommand.php b/lib/symfony/dotenv/Command/DebugCommand.php
new file mode 100644
index 000000000..8ceb1fd48
--- /dev/null
+++ b/lib/symfony/dotenv/Command/DebugCommand.php
@@ -0,0 +1,143 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Dotenv\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Dotenv\Dotenv;
+
+/**
+ * A console command to debug current dotenv files with variables and values.
+ *
+ * @author Christopher Hertel
+ */
+final class DebugCommand extends Command
+{
+ protected static $defaultName = 'debug:dotenv';
+ protected static $defaultDescription = 'Lists all dotenv files with variables and values';
+
+ private $kernelEnvironment;
+ private $projectDirectory;
+
+ public function __construct(string $kernelEnvironment, string $projectDirectory)
+ {
+ $this->kernelEnvironment = $kernelEnvironment;
+ $this->projectDirectory = $projectDirectory;
+
+ parent::__construct();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $io = new SymfonyStyle($input, $output);
+ $io->title('Dotenv Variables & Files');
+
+ if (!\array_key_exists('SYMFONY_DOTENV_VARS', $_SERVER)) {
+ $io->error('Dotenv component is not initialized.');
+
+ return 1;
+ }
+
+ $envFiles = $this->getEnvFiles();
+ $availableFiles = array_filter($envFiles, function (string $file) {
+ return is_file($this->getFilePath($file));
+ });
+
+ if (\in_array('.env.local.php', $availableFiles, true)) {
+ $io->warning('Due to existing dump file (.env.local.php) all other dotenv files are skipped.');
+ }
+
+ if (is_file($this->getFilePath('.env')) && is_file($this->getFilePath('.env.dist'))) {
+ $io->warning('The file .env.dist gets skipped due to the existence of .env.');
+ }
+
+ $io->section('Scanned Files (in descending priority)');
+ $io->listing(array_map(static function (string $envFile) use ($availableFiles) {
+ return \in_array($envFile, $availableFiles, true)
+ ? sprintf('ā> %s', $envFile)
+ : sprintf('⨯> %s', $envFile);
+ }, $envFiles));
+
+ $io->section('Variables');
+ $io->table(
+ array_merge(['Variable', 'Value'], $availableFiles),
+ $this->getVariables($availableFiles)
+ );
+
+ $io->comment('Note real values might be different between web and CLI.');
+
+ return 0;
+ }
+
+ private function getVariables(array $envFiles): array
+ {
+ $vars = explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? '');
+ sort($vars);
+
+ $output = [];
+ $fileValues = [];
+ foreach ($vars as $var) {
+ $realValue = $_SERVER[$var];
+ $varDetails = [$var, $realValue];
+ foreach ($envFiles as $envFile) {
+ $values = $fileValues[$envFile] ?? $fileValues[$envFile] = $this->loadValues($envFile);
+
+ $varString = $values[$var] ?? 'n/a>';
+ $shortenedVar = $this->getHelper('formatter')->truncate($varString, 30);
+ $varDetails[] = $varString === $realValue ? ''.$shortenedVar.'>' : $shortenedVar;
+ }
+
+ $output[] = $varDetails;
+ }
+
+ return $output;
+ }
+
+ private function getEnvFiles(): array
+ {
+ $files = [
+ '.env.local.php',
+ sprintf('.env.%s.local', $this->kernelEnvironment),
+ sprintf('.env.%s', $this->kernelEnvironment),
+ ];
+
+ if ('test' !== $this->kernelEnvironment) {
+ $files[] = '.env.local';
+ }
+
+ if (!is_file($this->getFilePath('.env')) && is_file($this->getFilePath('.env.dist'))) {
+ $files[] = '.env.dist';
+ } else {
+ $files[] = '.env';
+ }
+
+ return $files;
+ }
+
+ private function getFilePath(string $file): string
+ {
+ return $this->projectDirectory.\DIRECTORY_SEPARATOR.$file;
+ }
+
+ private function loadValues(string $file): array
+ {
+ $filePath = $this->getFilePath($file);
+
+ if (str_ends_with($filePath, '.php')) {
+ return include $filePath;
+ }
+
+ return (new Dotenv())->parse(file_get_contents($filePath));
+ }
+}
diff --git a/lib/symfony/dotenv/Command/DotenvDumpCommand.php b/lib/symfony/dotenv/Command/DotenvDumpCommand.php
new file mode 100644
index 000000000..44110543f
--- /dev/null
+++ b/lib/symfony/dotenv/Command/DotenvDumpCommand.php
@@ -0,0 +1,123 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Dotenv\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
+use Symfony\Component\Dotenv\Dotenv;
+
+/**
+ * A console command to compile .env files into a PHP-optimized file called .env.local.php.
+ *
+ * @internal
+ */
+#[Autoconfigure(bind: ['$projectDir' => '%kernel.project_dir%', '$defaultEnv' => '%kernel.environment%'])]
+final class DotenvDumpCommand extends Command
+{
+ protected static $defaultName = 'dotenv:dump';
+ protected static $defaultDescription = 'Compiles .env files to .env.local.php';
+
+ private $projectDir;
+ private $defaultEnv;
+
+ public function __construct(string $projectDir, string $defaultEnv = null)
+ {
+ $this->projectDir = $projectDir;
+ $this->defaultEnv = $defaultEnv;
+
+ parent::__construct();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function configure()
+ {
+ $this
+ ->setDefinition([
+ new InputArgument('env', null === $this->defaultEnv ? InputArgument::REQUIRED : InputArgument::OPTIONAL, 'The application environment to dump .env files for - e.g. "prod".'),
+ ])
+ ->addOption('empty', null, InputOption::VALUE_NONE, 'Ignore the content of .env files')
+ ->setHelp(<<<'EOT'
+The %command.name% command compiles .env files into a PHP-optimized file called .env.local.php.
+
+ %command.full_name%
+EOT
+ )
+ ;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $config = [];
+ if (is_file($projectDir = $this->projectDir)) {
+ $config = ['dotenv_path' => basename($projectDir)];
+ $projectDir = \dirname($projectDir);
+ }
+
+ $composerFile = $projectDir.'/composer.json';
+ $config += (is_file($composerFile) ? json_decode(file_get_contents($composerFile), true) : [])['extra']['runtime'] ?? [];
+ $dotenvPath = $projectDir.'/'.($config['dotenv_path'] ?? '.env');
+ $env = $input->getArgument('env') ?? $this->defaultEnv;
+ $envKey = $config['env_var_name'] ?? 'APP_ENV';
+
+ if ($input->getOption('empty')) {
+ $vars = [$envKey => $env];
+ } else {
+ $vars = $this->loadEnv($dotenvPath, $env, $config);
+ $env = $vars[$envKey];
+ }
+
+ $vars = var_export($vars, true);
+ $vars = <<writeln(sprintf('Successfully dumped .env files in .env.local.php> for the %s> environment.', $env));
+
+ return 0;
+ }
+
+ private function loadEnv(string $dotenvPath, string $env, array $config): array
+ {
+ $dotenv = new Dotenv();
+ $envKey = $config['env_var_name'] ?? 'APP_ENV';
+ $testEnvs = $config['test_envs'] ?? ['test'];
+
+ $globalsBackup = [$_SERVER, $_ENV];
+ unset($_SERVER[$envKey]);
+ $_ENV = [$envKey => $env];
+ $_SERVER['SYMFONY_DOTENV_VARS'] = implode(',', array_keys($_SERVER));
+
+ try {
+ $dotenv->loadEnv($dotenvPath, null, 'dev', $testEnvs);
+ unset($_ENV['SYMFONY_DOTENV_VARS']);
+
+ return $_ENV;
+ } finally {
+ [$_SERVER, $_ENV] = $globalsBackup;
+ }
+ }
+}
diff --git a/lib/symfony/dotenv/Dotenv.php b/lib/symfony/dotenv/Dotenv.php
index 63424e165..2c76d52c8 100644
--- a/lib/symfony/dotenv/Dotenv.php
+++ b/lib/symfony/dotenv/Dotenv.php
@@ -21,12 +21,13 @@ use Symfony\Component\Process\Process;
* Manages .env files.
*
* @author Fabien Potencier
+ * @author KƩvin Dunglas
*/
final class Dotenv
{
- const VARNAME_REGEX = '(?i:[A-Z][A-Z0-9_]*+)';
- const STATE_VARNAME = 0;
- const STATE_VALUE = 1;
+ public const VARNAME_REGEX = '(?i:[A-Z][A-Z0-9_]*+)';
+ public const STATE_VARNAME = 0;
+ public const STATE_VALUE = 1;
private $path;
private $cursor;
@@ -34,47 +35,175 @@ final class Dotenv
private $data;
private $end;
private $values;
+ private $envKey;
+ private $debugKey;
+ private $prodEnvs = ['prod'];
+ private $usePutenv = false;
+
+ /**
+ * @param string $envKey
+ */
+ public function __construct($envKey = 'APP_ENV', string $debugKey = 'APP_DEBUG')
+ {
+ if (\in_array($envKey = (string) $envKey, ['1', ''], true)) {
+ trigger_deprecation('symfony/dotenv', '5.1', 'Passing a boolean to the constructor of "%s" is deprecated, use "Dotenv::usePutenv()".', __CLASS__);
+ $this->usePutenv = (bool) $envKey;
+ $envKey = 'APP_ENV';
+ }
+
+ $this->envKey = $envKey;
+ $this->debugKey = $debugKey;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setProdEnvs(array $prodEnvs): self
+ {
+ $this->prodEnvs = $prodEnvs;
+
+ return $this;
+ }
+
+ /**
+ * @param bool $usePutenv If `putenv()` should be used to define environment variables or not.
+ * Beware that `putenv()` is not thread safe, that's why this setting defaults to false
+ *
+ * @return $this
+ */
+ public function usePutenv(bool $usePutenv = true): self
+ {
+ $this->usePutenv = $usePutenv;
+
+ return $this;
+ }
/**
* Loads one or several .env files.
*
- * @param string $path A file to load
+ * @param string $path A file to load
+ * @param string[] ...$extraPaths A list of additional files to load
*
* @throws FormatException when a file has a syntax error
* @throws PathException when a file does not exist or is not readable
*/
- public function load($path/*, ...$paths*/)
+ public function load(string $path, string ...$extraPaths): void
{
- // func_get_args() to be replaced by a variadic argument for Symfony 4.0
- foreach (\func_get_args() as $path) {
- if (!is_readable($path) || is_dir($path)) {
- throw new PathException($path);
- }
+ $this->doLoad(false, \func_get_args());
+ }
- $this->populate($this->parse(file_get_contents($path), $path));
+ /**
+ * Loads a .env file and the corresponding .env.local, .env.$env and .env.$env.local files if they exist.
+ *
+ * .env.local is always ignored in test env because tests should produce the same results for everyone.
+ * .env.dist is loaded when it exists and .env is not found.
+ *
+ * @param string $path A file to load
+ * @param string $envKey|null The name of the env vars that defines the app env
+ * @param string $defaultEnv The app env to use when none is defined
+ * @param array $testEnvs A list of app envs for which .env.local should be ignored
+ *
+ * @throws FormatException when a file has a syntax error
+ * @throws PathException when a file does not exist or is not readable
+ */
+ public function loadEnv(string $path, string $envKey = null, string $defaultEnv = 'dev', array $testEnvs = ['test'], bool $overrideExistingVars = false): void
+ {
+ $k = $envKey ?? $this->envKey;
+
+ if (is_file($path) || !is_file($p = "$path.dist")) {
+ $this->doLoad($overrideExistingVars, [$path]);
+ } else {
+ $this->doLoad($overrideExistingVars, [$p]);
}
+
+ if (null === $env = $_SERVER[$k] ?? $_ENV[$k] ?? null) {
+ $this->populate([$k => $env = $defaultEnv], $overrideExistingVars);
+ }
+
+ if (!\in_array($env, $testEnvs, true) && is_file($p = "$path.local")) {
+ $this->doLoad($overrideExistingVars, [$p]);
+ $env = $_SERVER[$k] ?? $_ENV[$k] ?? $env;
+ }
+
+ if ('local' === $env) {
+ return;
+ }
+
+ if (is_file($p = "$path.$env")) {
+ $this->doLoad($overrideExistingVars, [$p]);
+ }
+
+ if (is_file($p = "$path.$env.local")) {
+ $this->doLoad($overrideExistingVars, [$p]);
+ }
+ }
+
+ /**
+ * Loads env vars from .env.local.php if the file exists or from the other .env files otherwise.
+ *
+ * This method also configures the APP_DEBUG env var according to the current APP_ENV.
+ *
+ * See method loadEnv() for rules related to .env files.
+ */
+ public function bootEnv(string $path, string $defaultEnv = 'dev', array $testEnvs = ['test'], bool $overrideExistingVars = false): void
+ {
+ $p = $path.'.local.php';
+ $env = is_file($p) ? include $p : null;
+ $k = $this->envKey;
+
+ if (\is_array($env) && ($overrideExistingVars || !isset($env[$k]) || ($_SERVER[$k] ?? $_ENV[$k] ?? $env[$k]) === $env[$k])) {
+ $this->populate($env, $overrideExistingVars);
+ } else {
+ $this->loadEnv($path, $k, $defaultEnv, $testEnvs, $overrideExistingVars);
+ }
+
+ $_SERVER += $_ENV;
+
+ $k = $this->debugKey;
+ $debug = $_SERVER[$k] ?? !\in_array($_SERVER[$this->envKey], $this->prodEnvs, true);
+ $_SERVER[$k] = $_ENV[$k] = (int) $debug || (!\is_bool($debug) && filter_var($debug, \FILTER_VALIDATE_BOOLEAN)) ? '1' : '0';
+ }
+
+ /**
+ * Loads one or several .env files and enables override existing vars.
+ *
+ * @param string $path A file to load
+ * @param string[] ...$extraPaths A list of additional files to load
+ *
+ * @throws FormatException when a file has a syntax error
+ * @throws PathException when a file does not exist or is not readable
+ */
+ public function overload(string $path, string ...$extraPaths): void
+ {
+ $this->doLoad(true, \func_get_args());
}
/**
* Sets values as environment variables (via putenv, $_ENV, and $_SERVER).
*
- * Note that existing environment variables are not overridden.
- *
- * @param array $values An array of env variables
+ * @param array $values An array of env variables
+ * @param bool $overrideExistingVars true when existing environment variables must be overridden
*/
- public function populate($values)
+ public function populate(array $values, bool $overrideExistingVars = false): void
{
$updateLoadedVars = false;
- $loadedVars = array_flip(explode(',', isset($_SERVER['SYMFONY_DOTENV_VARS']) ? $_SERVER['SYMFONY_DOTENV_VARS'] : (isset($_ENV['SYMFONY_DOTENV_VARS']) ? $_ENV['SYMFONY_DOTENV_VARS'] : '')));
+ $loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? ''));
foreach ($values as $name => $value) {
$notHttpName = 0 !== strpos($name, 'HTTP_');
+ if (isset($_SERVER[$name]) && $notHttpName && !isset($_ENV[$name])) {
+ $_ENV[$name] = $_SERVER[$name];
+ }
+
// don't check existence with getenv() because of thread safety issues
- if (!isset($loadedVars[$name]) && (isset($_ENV[$name]) || (isset($_SERVER[$name]) && $notHttpName))) {
+ if (!isset($loadedVars[$name]) && !$overrideExistingVars && isset($_ENV[$name])) {
continue;
}
- putenv("$name=$value");
+ if ($this->usePutenv) {
+ putenv("$name=$value");
+ }
+
$_ENV[$name] = $value;
if ($notHttpName) {
$_SERVER[$name] = $value;
@@ -88,7 +217,11 @@ final class Dotenv
if ($updateLoadedVars) {
unset($loadedVars['']);
$loadedVars = implode(',', array_keys($loadedVars));
- putenv('SYMFONY_DOTENV_VARS='.$_ENV['SYMFONY_DOTENV_VARS'] = $_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars);
+ $_ENV['SYMFONY_DOTENV_VARS'] = $_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars;
+
+ if ($this->usePutenv) {
+ putenv('SYMFONY_DOTENV_VARS='.$loadedVars);
+ }
}
}
@@ -98,11 +231,9 @@ final class Dotenv
* @param string $data The data to be parsed
* @param string $path The original file name where data where stored (used for more meaningful error messages)
*
- * @return array An array of env variables
- *
* @throws FormatException when a file has a syntax error
*/
- public function parse($data, $path = '.env')
+ public function parse(string $data, string $path = '.env'): array
{
$this->path = $path;
$this->data = str_replace(["\r\n", "\r"], "\n", $data);
@@ -142,7 +273,7 @@ final class Dotenv
}
}
- private function lexVarname()
+ private function lexVarname(): string
{
// var name + optional export
if (!preg_match('/(export[ \t]++)?('.self::VARNAME_REGEX.')/A', $this->data, $matches, 0, $this->cursor)) {
@@ -170,7 +301,7 @@ final class Dotenv
return $matches[2];
}
- private function lexValue()
+ private function lexValue(): string
{
if (preg_match('/[ \t]*+(?:#.*)?$/Am', $this->data, $matches, 0, $this->cursor)) {
$this->moveCursor($matches[0]);
@@ -183,7 +314,7 @@ final class Dotenv
throw $this->createFormatException('Whitespace are not supported before the value');
}
- $loadedVars = array_flip(explode(',', isset($_SERVER['SYMFONY_DOTENV_VARS']) ? $_SERVER['SYMFONY_DOTENV_VARS'] : (isset($_ENV['SYMFONY_DOTENV_VARS']) ? $_ENV['SYMFONY_DOTENV_VARS'] : '')));
+ $loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? ($_ENV['SYMFONY_DOTENV_VARS'] ?? '')));
unset($loadedVars['']);
$v = '';
@@ -216,9 +347,6 @@ final class Dotenv
throw $this->createFormatException('Missing quote to end the value');
}
}
- if ("\n" === $this->data[$this->cursor]) {
- throw $this->createFormatException('Missing quote to end the value');
- }
++$this->cursor;
$value = str_replace(['\\"', '\r', '\n'], ['"', "\r", "\n"], $value);
$resolvedValue = $value;
@@ -266,7 +394,7 @@ final class Dotenv
return $v;
}
- private function lexNestedExpression()
+ private function lexNestedExpression(): string
{
++$this->cursor;
$value = '';
@@ -299,7 +427,7 @@ final class Dotenv
}
}
- private function resolveCommands($value, $loadedVars)
+ private function resolveCommands(string $value, array $loadedVars): string
{
if (false === strpos($value, '$')) {
return $value;
@@ -328,8 +456,12 @@ final class Dotenv
throw new \LogicException('Resolving commands requires the Symfony Process component.');
}
- $process = new Process('echo '.$matches[0]);
- $process->inheritEnvironmentVariables(true);
+ $process = method_exists(Process::class, 'fromShellCommandline') ? Process::fromShellCommandline('echo '.$matches[0]) : new Process('echo '.$matches[0]);
+
+ if (!method_exists(Process::class, 'fromShellCommandline') && method_exists(Process::class, 'inheritEnvironmentVariables')) {
+ // Symfony 3.4 does not inherit env vars by default:
+ $process->inheritEnvironmentVariables();
+ }
$env = [];
foreach ($this->values as $name => $value) {
@@ -349,7 +481,7 @@ final class Dotenv
}, $value);
}
- private function resolveVariables($value, array $loadedVars)
+ private function resolveVariables(string $value, array $loadedVars): string
{
if (false === strpos($value, '$')) {
return $value;
@@ -362,6 +494,7 @@ final class Dotenv
(?!\() # no opening parenthesis
(?P\{)? # optional brace
(?P'.self::VARNAME_REGEX.')? # var name
+ (?P:[-=][^\}]++)? # optional default value
(?P\})? # optional closing brace
/x';
@@ -393,6 +526,19 @@ final class Dotenv
$value = (string) getenv($name);
}
+ if ('' === $value && isset($matches['default_value']) && '' !== $matches['default_value']) {
+ $unsupportedChars = strpbrk($matches['default_value'], '\'"{$');
+ if (false !== $unsupportedChars) {
+ throw $this->createFormatException(sprintf('Unsupported character "%s" found in the default value of variable "$%s".', $unsupportedChars[0], $name));
+ }
+
+ $value = substr($matches['default_value'], 2);
+
+ if ('=' === $matches['default_value'][1]) {
+ $this->values[$name] = $value;
+ }
+ }
+
if (!$matches['opening_brace'] && isset($matches['closing_brace'])) {
$value .= '}';
}
@@ -403,14 +549,25 @@ final class Dotenv
return $value;
}
- private function moveCursor($text)
+ private function moveCursor(string $text)
{
$this->cursor += \strlen($text);
$this->lineno += substr_count($text, "\n");
}
- private function createFormatException($message)
+ private function createFormatException(string $message): FormatException
{
return new FormatException($message, new FormatExceptionContext($this->data, $this->path, $this->lineno, $this->cursor));
}
+
+ private function doLoad(bool $overrideExistingVars, array $paths): void
+ {
+ foreach ($paths as $path) {
+ if (!is_readable($path) || is_dir($path)) {
+ throw new PathException($path);
+ }
+
+ $this->populate($this->parse(file_get_contents($path), $path), $overrideExistingVars);
+ }
+ }
}
diff --git a/lib/symfony/dotenv/Exception/ExceptionInterface.php b/lib/symfony/dotenv/Exception/ExceptionInterface.php
index 90509f7db..140a93f96 100644
--- a/lib/symfony/dotenv/Exception/ExceptionInterface.php
+++ b/lib/symfony/dotenv/Exception/ExceptionInterface.php
@@ -16,6 +16,6 @@ namespace Symfony\Component\Dotenv\Exception;
*
* @author Fabien Potencier
*/
-interface ExceptionInterface
+interface ExceptionInterface extends \Throwable
{
}
diff --git a/lib/symfony/dotenv/Exception/FormatException.php b/lib/symfony/dotenv/Exception/FormatException.php
index 26f1442b6..3ac77e592 100644
--- a/lib/symfony/dotenv/Exception/FormatException.php
+++ b/lib/symfony/dotenv/Exception/FormatException.php
@@ -20,14 +20,14 @@ final class FormatException extends \LogicException implements ExceptionInterfac
{
private $context;
- public function __construct($message, FormatExceptionContext $context, $code = 0, \Exception $previous = null)
+ public function __construct(string $message, FormatExceptionContext $context, int $code = 0, \Throwable $previous = null)
{
$this->context = $context;
parent::__construct(sprintf("%s in \"%s\" at line %d.\n%s", $message, $context->getPath(), $context->getLineno(), $context->getDetails()), $code, $previous);
}
- public function getContext()
+ public function getContext(): FormatExceptionContext
{
return $this->context;
}
diff --git a/lib/symfony/dotenv/Exception/FormatExceptionContext.php b/lib/symfony/dotenv/Exception/FormatExceptionContext.php
index f4d3cea0f..96d902fc8 100644
--- a/lib/symfony/dotenv/Exception/FormatExceptionContext.php
+++ b/lib/symfony/dotenv/Exception/FormatExceptionContext.php
@@ -21,7 +21,7 @@ final class FormatExceptionContext
private $lineno;
private $cursor;
- public function __construct($data, $path, $lineno, $cursor)
+ public function __construct(string $data, string $path, int $lineno, int $cursor)
{
$this->data = $data;
$this->path = $path;
@@ -29,17 +29,17 @@ final class FormatExceptionContext
$this->cursor = $cursor;
}
- public function getPath()
+ public function getPath(): string
{
return $this->path;
}
- public function getLineno()
+ public function getLineno(): int
{
return $this->lineno;
}
- public function getDetails()
+ public function getDetails(): string
{
$before = str_replace("\n", '\n', substr($this->data, max(0, $this->cursor - 20), min(20, $this->cursor)));
$after = str_replace("\n", '\n', substr($this->data, $this->cursor, 20));
diff --git a/lib/symfony/dotenv/Exception/PathException.php b/lib/symfony/dotenv/Exception/PathException.php
index ac4d540ff..4a4d71722 100644
--- a/lib/symfony/dotenv/Exception/PathException.php
+++ b/lib/symfony/dotenv/Exception/PathException.php
@@ -18,7 +18,7 @@ namespace Symfony\Component\Dotenv\Exception;
*/
final class PathException extends \RuntimeException implements ExceptionInterface
{
- public function __construct($path, $code = 0, \Exception $previous = null)
+ public function __construct(string $path, int $code = 0, \Throwable $previous = null)
{
parent::__construct(sprintf('Unable to read the "%s" environment file.', $path), $code, $previous);
}
diff --git a/lib/symfony/dotenv/LICENSE b/lib/symfony/dotenv/LICENSE
index a7ec70801..7fa953905 100644
--- a/lib/symfony/dotenv/LICENSE
+++ b/lib/symfony/dotenv/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2016-2020 Fabien Potencier
+Copyright (c) 2016-2022 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/symfony/dotenv/README.md b/lib/symfony/dotenv/README.md
index 244ed7700..08c90fcc8 100644
--- a/lib/symfony/dotenv/README.md
+++ b/lib/symfony/dotenv/README.md
@@ -2,13 +2,35 @@ Dotenv Component
================
Symfony Dotenv parses `.env` files to make environment variables stored in them
-accessible via `getenv()`, `$_ENV`, or `$_SERVER`.
+accessible via `$_SERVER` or `$_ENV`.
+
+Getting Started
+---------------
+
+```
+$ composer require symfony/dotenv
+```
+
+```php
+use Symfony\Component\Dotenv\Dotenv;
+
+$dotenv = new Dotenv();
+$dotenv->load(__DIR__.'/.env');
+
+// you can also load several files
+$dotenv->load(__DIR__.'/.env', __DIR__.'/.env.dev');
+
+// overwrites existing env variables
+$dotenv->overload(__DIR__.'/.env');
+
+// loads .env, .env.local, and .env.$APP_ENV.local or .env.$APP_ENV
+$dotenv->loadEnv(__DIR__.'/.env');
+```
Resources
---------
- * [Documentation](https://symfony.com/doc/current/components/dotenv.html)
- * [Contributing](https://symfony.com/doc/current/contributing/index.html)
- * [Report issues](https://github.com/symfony/symfony/issues) and
- [send Pull Requests](https://github.com/symfony/symfony/pulls)
- in the [main Symfony repository](https://github.com/symfony/symfony)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/lib/symfony/dotenv/composer.json b/lib/symfony/dotenv/composer.json
index be720a08e..bec034f87 100644
--- a/lib/symfony/dotenv/composer.json
+++ b/lib/symfony/dotenv/composer.json
@@ -16,10 +16,12 @@
}
],
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3"
},
"require-dev": {
- "symfony/process": "^3.4.2|^4.0"
+ "symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Dotenv\\": "" },
diff --git a/lib/symfony/dotenv/phpunit.xml.dist b/lib/symfony/dotenv/phpunit.xml.dist
deleted file mode 100644
index b1caee3c4..000000000
--- a/lib/symfony/dotenv/phpunit.xml.dist
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
- ./Tests/
-
-
-
-
-
- ./
-
- ./Tests
- ./vendor
-
-
-
-
diff --git a/lib/symfony/error-handler/BufferingLogger.php b/lib/symfony/error-handler/BufferingLogger.php
new file mode 100644
index 000000000..fdfc72497
--- /dev/null
+++ b/lib/symfony/error-handler/BufferingLogger.php
@@ -0,0 +1,71 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler;
+
+use Psr\Log\AbstractLogger;
+
+/**
+ * A buffering logger that stacks logs for later.
+ *
+ * @author Nicolas Grekas
+ */
+class BufferingLogger extends AbstractLogger
+{
+ private $logs = [];
+
+ public function log($level, $message, array $context = []): void
+ {
+ $this->logs[] = [$level, $message, $context];
+ }
+
+ public function cleanLogs(): array
+ {
+ $logs = $this->logs;
+ $this->logs = [];
+
+ return $logs;
+ }
+
+ /**
+ * @return array
+ */
+ public function __sleep()
+ {
+ throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
+ }
+
+ public function __wakeup()
+ {
+ throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
+ }
+
+ public function __destruct()
+ {
+ foreach ($this->logs as [$level, $message, $context]) {
+ if (false !== strpos($message, '{')) {
+ foreach ($context as $key => $val) {
+ if (null === $val || is_scalar($val) || (\is_object($val) && \is_callable([$val, '__toString']))) {
+ $message = str_replace("{{$key}}", $val, $message);
+ } elseif ($val instanceof \DateTimeInterface) {
+ $message = str_replace("{{$key}}", $val->format(\DateTime::RFC3339), $message);
+ } elseif (\is_object($val)) {
+ $message = str_replace("{{$key}}", '[object '.\get_class($val).']', $message);
+ } else {
+ $message = str_replace("{{$key}}", '['.\gettype($val).']', $message);
+ }
+ }
+ }
+
+ error_log(sprintf('%s [%s] %s', date(\DateTime::RFC3339), $level, $message));
+ }
+ }
+}
diff --git a/lib/symfony/error-handler/CHANGELOG.md b/lib/symfony/error-handler/CHANGELOG.md
new file mode 100644
index 000000000..2976566a1
--- /dev/null
+++ b/lib/symfony/error-handler/CHANGELOG.md
@@ -0,0 +1,24 @@
+CHANGELOG
+=========
+
+5.4
+---
+
+ * Make `DebugClassLoader` trigger deprecation notices on missing return types
+ * Add `SYMFONY_PATCH_TYPE_DECLARATIONS='force=2'` mode to `DebugClassLoader` to turn annotations into native return types
+
+5.2.0
+-----
+
+ * added the ability to set `HtmlErrorRenderer::$template` to a custom template to render when not in debug mode.
+
+5.1.0
+-----
+
+ * The `HtmlErrorRenderer` and `SerializerErrorRenderer` add `X-Debug-Exception` and `X-Debug-Exception-File` headers in debug mode.
+
+4.4.0
+-----
+
+ * added the component
+ * added `ErrorHandler::call()` method utility to turn any PHP error into `\ErrorException`
diff --git a/lib/symfony/error-handler/Debug.php b/lib/symfony/error-handler/Debug.php
new file mode 100644
index 000000000..4a8281218
--- /dev/null
+++ b/lib/symfony/error-handler/Debug.php
@@ -0,0 +1,41 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler;
+
+/**
+ * Registers all the debug tools.
+ *
+ * @author Fabien Potencier
+ */
+class Debug
+{
+ public static function enable(): ErrorHandler
+ {
+ error_reporting(-1);
+
+ if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
+ ini_set('display_errors', 0);
+ } elseif (!filter_var(ini_get('log_errors'), \FILTER_VALIDATE_BOOLEAN) || ini_get('error_log')) {
+ // CLI - display errors only if they're not already logged to STDERR
+ ini_set('display_errors', 1);
+ }
+
+ @ini_set('zend.assertions', 1);
+ ini_set('assert.active', 1);
+ ini_set('assert.warning', 0);
+ ini_set('assert.exception', 1);
+
+ DebugClassLoader::enable();
+
+ return ErrorHandler::register(new ErrorHandler(new BufferingLogger(), true));
+ }
+}
diff --git a/lib/symfony/error-handler/DebugClassLoader.php b/lib/symfony/error-handler/DebugClassLoader.php
new file mode 100644
index 000000000..e4388fed9
--- /dev/null
+++ b/lib/symfony/error-handler/DebugClassLoader.php
@@ -0,0 +1,1210 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler;
+
+use Composer\InstalledVersions;
+use Doctrine\Common\Persistence\Proxy as LegacyProxy;
+use Doctrine\Persistence\Proxy;
+use Mockery\MockInterface;
+use Phake\IMock;
+use PHPUnit\Framework\MockObject\Matcher\StatelessInvocation;
+use PHPUnit\Framework\MockObject\MockObject;
+use Prophecy\Prophecy\ProphecySubjectInterface;
+use ProxyManager\Proxy\ProxyInterface;
+use Symfony\Component\ErrorHandler\Internal\TentativeTypes;
+
+/**
+ * Autoloader checking if the class is really defined in the file found.
+ *
+ * The ClassLoader will wrap all registered autoloaders
+ * and will throw an exception if a file is found but does
+ * not declare the class.
+ *
+ * It can also patch classes to turn docblocks into actual return types.
+ * This behavior is controlled by the SYMFONY_PATCH_TYPE_DECLARATIONS env var,
+ * which is a url-encoded array with the follow parameters:
+ * - "force": any value enables deprecation notices - can be any of:
+ * - "phpdoc" to patch only docblock annotations
+ * - "2" to add all possible return types
+ * - "1" to add return types but only to tests/final/internal/private methods
+ * - "php": the target version of PHP - e.g. "7.1" doesn't generate "object" types
+ * - "deprecations": "1" to trigger a deprecation notice when a child class misses a
+ * return type while the parent declares an "@return" annotation
+ *
+ * Note that patching doesn't care about any coding style so you'd better to run
+ * php-cs-fixer after, with rules "phpdoc_trim_consecutive_blank_line_separation"
+ * and "no_superfluous_phpdoc_tags" enabled typically.
+ *
+ * @author Fabien Potencier
+ * @author Christophe Coevoet
+ * @author Nicolas Grekas
+ * @author Guilhem Niot
+ */
+class DebugClassLoader
+{
+ private const SPECIAL_RETURN_TYPES = [
+ 'void' => 'void',
+ 'null' => 'null',
+ 'resource' => 'resource',
+ 'boolean' => 'bool',
+ 'true' => 'bool',
+ 'false' => 'false',
+ 'integer' => 'int',
+ 'array' => 'array',
+ 'bool' => 'bool',
+ 'callable' => 'callable',
+ 'float' => 'float',
+ 'int' => 'int',
+ 'iterable' => 'iterable',
+ 'object' => 'object',
+ 'string' => 'string',
+ 'self' => 'self',
+ 'parent' => 'parent',
+ 'mixed' => 'mixed',
+ 'static' => 'static',
+ '$this' => 'static',
+ 'list' => 'array',
+ ];
+
+ private const BUILTIN_RETURN_TYPES = [
+ 'void' => true,
+ 'array' => true,
+ 'false' => true,
+ 'bool' => true,
+ 'callable' => true,
+ 'float' => true,
+ 'int' => true,
+ 'iterable' => true,
+ 'object' => true,
+ 'string' => true,
+ 'self' => true,
+ 'parent' => true,
+ 'mixed' => true,
+ 'static' => true,
+ ];
+
+ private const MAGIC_METHODS = [
+ '__isset' => 'bool',
+ '__sleep' => 'array',
+ '__toString' => 'string',
+ '__debugInfo' => 'array',
+ '__serialize' => 'array',
+ ];
+
+ private $classLoader;
+ private $isFinder;
+ private $loaded = [];
+ private $patchTypes;
+
+ private static $caseCheck;
+ private static $checkedClasses = [];
+ private static $final = [];
+ private static $finalMethods = [];
+ private static $deprecated = [];
+ private static $internal = [];
+ private static $internalMethods = [];
+ private static $annotatedParameters = [];
+ private static $darwinCache = ['/' => ['/', []]];
+ private static $method = [];
+ private static $returnTypes = [];
+ private static $methodTraits = [];
+ private static $fileOffsets = [];
+
+ public function __construct(callable $classLoader)
+ {
+ $this->classLoader = $classLoader;
+ $this->isFinder = \is_array($classLoader) && method_exists($classLoader[0], 'findFile');
+ parse_str(getenv('SYMFONY_PATCH_TYPE_DECLARATIONS') ?: '', $this->patchTypes);
+ $this->patchTypes += [
+ 'force' => null,
+ 'php' => \PHP_MAJOR_VERSION.'.'.\PHP_MINOR_VERSION,
+ 'deprecations' => \PHP_VERSION_ID >= 70400,
+ ];
+
+ if ('phpdoc' === $this->patchTypes['force']) {
+ $this->patchTypes['force'] = 'docblock';
+ }
+
+ if (!isset(self::$caseCheck)) {
+ $file = is_file(__FILE__) ? __FILE__ : rtrim(realpath('.'), \DIRECTORY_SEPARATOR);
+ $i = strrpos($file, \DIRECTORY_SEPARATOR);
+ $dir = substr($file, 0, 1 + $i);
+ $file = substr($file, 1 + $i);
+ $test = strtoupper($file) === $file ? strtolower($file) : strtoupper($file);
+ $test = realpath($dir.$test);
+
+ if (false === $test || false === $i) {
+ // filesystem is case sensitive
+ self::$caseCheck = 0;
+ } elseif (substr($test, -\strlen($file)) === $file) {
+ // filesystem is case insensitive and realpath() normalizes the case of characters
+ self::$caseCheck = 1;
+ } elseif ('Darwin' === \PHP_OS_FAMILY) {
+ // on MacOSX, HFS+ is case insensitive but realpath() doesn't normalize the case of characters
+ self::$caseCheck = 2;
+ } else {
+ // filesystem case checks failed, fallback to disabling them
+ self::$caseCheck = 0;
+ }
+ }
+ }
+
+ public function getClassLoader(): callable
+ {
+ return $this->classLoader;
+ }
+
+ /**
+ * Wraps all autoloaders.
+ */
+ public static function enable(): void
+ {
+ // Ensures we don't hit https://bugs.php.net/42098
+ class_exists(\Symfony\Component\ErrorHandler\ErrorHandler::class);
+ class_exists(\Psr\Log\LogLevel::class);
+
+ if (!\is_array($functions = spl_autoload_functions())) {
+ return;
+ }
+
+ foreach ($functions as $function) {
+ spl_autoload_unregister($function);
+ }
+
+ foreach ($functions as $function) {
+ if (!\is_array($function) || !$function[0] instanceof self) {
+ $function = [new static($function), 'loadClass'];
+ }
+
+ spl_autoload_register($function);
+ }
+ }
+
+ /**
+ * Disables the wrapping.
+ */
+ public static function disable(): void
+ {
+ if (!\is_array($functions = spl_autoload_functions())) {
+ return;
+ }
+
+ foreach ($functions as $function) {
+ spl_autoload_unregister($function);
+ }
+
+ foreach ($functions as $function) {
+ if (\is_array($function) && $function[0] instanceof self) {
+ $function = $function[0]->getClassLoader();
+ }
+
+ spl_autoload_register($function);
+ }
+ }
+
+ public static function checkClasses(): bool
+ {
+ if (!\is_array($functions = spl_autoload_functions())) {
+ return false;
+ }
+
+ $loader = null;
+
+ foreach ($functions as $function) {
+ if (\is_array($function) && $function[0] instanceof self) {
+ $loader = $function[0];
+ break;
+ }
+ }
+
+ if (null === $loader) {
+ return false;
+ }
+
+ static $offsets = [
+ 'get_declared_interfaces' => 0,
+ 'get_declared_traits' => 0,
+ 'get_declared_classes' => 0,
+ ];
+
+ foreach ($offsets as $getSymbols => $i) {
+ $symbols = $getSymbols();
+
+ for (; $i < \count($symbols); ++$i) {
+ if (!is_subclass_of($symbols[$i], MockObject::class)
+ && !is_subclass_of($symbols[$i], ProphecySubjectInterface::class)
+ && !is_subclass_of($symbols[$i], Proxy::class)
+ && !is_subclass_of($symbols[$i], ProxyInterface::class)
+ && !is_subclass_of($symbols[$i], LegacyProxy::class)
+ && !is_subclass_of($symbols[$i], MockInterface::class)
+ && !is_subclass_of($symbols[$i], IMock::class)
+ ) {
+ $loader->checkClass($symbols[$i]);
+ }
+ }
+
+ $offsets[$getSymbols] = $i;
+ }
+
+ return true;
+ }
+
+ public function findFile(string $class): ?string
+ {
+ return $this->isFinder ? ($this->classLoader[0]->findFile($class) ?: null) : null;
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @throws \RuntimeException
+ */
+ public function loadClass(string $class): void
+ {
+ $e = error_reporting(error_reporting() | \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR);
+
+ try {
+ if ($this->isFinder && !isset($this->loaded[$class])) {
+ $this->loaded[$class] = true;
+ if (!$file = $this->classLoader[0]->findFile($class) ?: '') {
+ // no-op
+ } elseif (\function_exists('opcache_is_script_cached') && @opcache_is_script_cached($file)) {
+ include $file;
+
+ return;
+ } elseif (false === include $file) {
+ return;
+ }
+ } else {
+ ($this->classLoader)($class);
+ $file = '';
+ }
+ } finally {
+ error_reporting($e);
+ }
+
+ $this->checkClass($class, $file);
+ }
+
+ private function checkClass(string $class, string $file = null): void
+ {
+ $exists = null === $file || class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false);
+
+ if (null !== $file && $class && '\\' === $class[0]) {
+ $class = substr($class, 1);
+ }
+
+ if ($exists) {
+ if (isset(self::$checkedClasses[$class])) {
+ return;
+ }
+ self::$checkedClasses[$class] = true;
+
+ $refl = new \ReflectionClass($class);
+ if (null === $file && $refl->isInternal()) {
+ return;
+ }
+ $name = $refl->getName();
+
+ if ($name !== $class && 0 === strcasecmp($name, $class)) {
+ throw new \RuntimeException(sprintf('Case mismatch between loaded and declared class names: "%s" vs "%s".', $class, $name));
+ }
+
+ $deprecations = $this->checkAnnotations($refl, $name);
+
+ foreach ($deprecations as $message) {
+ @trigger_error($message, \E_USER_DEPRECATED);
+ }
+ }
+
+ if (!$file) {
+ return;
+ }
+
+ if (!$exists) {
+ if (false !== strpos($class, '/')) {
+ throw new \RuntimeException(sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class));
+ }
+
+ throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
+ }
+
+ if (self::$caseCheck && $message = $this->checkCase($refl, $file, $class)) {
+ throw new \RuntimeException(sprintf('Case mismatch between class and real file names: "%s" vs "%s" in "%s".', $message[0], $message[1], $message[2]));
+ }
+ }
+
+ public function checkAnnotations(\ReflectionClass $refl, string $class): array
+ {
+ if (
+ 'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerForV7' === $class
+ || 'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerForV6' === $class
+ ) {
+ return [];
+ }
+ $deprecations = [];
+
+ $className = false !== strpos($class, "@anonymous\0") ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : $class;
+
+ // Don't trigger deprecations for classes in the same vendor
+ if ($class !== $className) {
+ $vendor = preg_match('/^namespace ([^;\\\\\s]++)[;\\\\]/m', @file_get_contents($refl->getFileName()), $vendor) ? $vendor[1].'\\' : '';
+ $vendorLen = \strlen($vendor);
+ } elseif (2 > $vendorLen = 1 + (strpos($class, '\\') ?: strpos($class, '_'))) {
+ $vendorLen = 0;
+ $vendor = '';
+ } else {
+ $vendor = str_replace('_', '\\', substr($class, 0, $vendorLen));
+ }
+
+ $parent = get_parent_class($class) ?: null;
+ self::$returnTypes[$class] = [];
+ $classIsTemplate = false;
+
+ // Detect annotations on the class
+ if ($doc = $this->parsePhpDoc($refl)) {
+ $classIsTemplate = isset($doc['template']);
+
+ foreach (['final', 'deprecated', 'internal'] as $annotation) {
+ if (null !== $description = $doc[$annotation][0] ?? null) {
+ self::${$annotation}[$class] = '' !== $description ? ' '.$description.(preg_match('/[.!]$/', $description) ? '' : '.') : '.';
+ }
+ }
+
+ if ($refl->isInterface() && isset($doc['method'])) {
+ foreach ($doc['method'] as $name => [$static, $returnType, $signature, $description]) {
+ self::$method[$class][] = [$class, $static, $returnType, $name.$signature, $description];
+
+ if ('' !== $returnType) {
+ $this->setReturnType($returnType, $refl->name, $name, $refl->getFileName(), $parent);
+ }
+ }
+ }
+ }
+
+ $parentAndOwnInterfaces = $this->getOwnInterfaces($class, $parent);
+ if ($parent) {
+ $parentAndOwnInterfaces[$parent] = $parent;
+
+ if (!isset(self::$checkedClasses[$parent])) {
+ $this->checkClass($parent);
+ }
+
+ if (isset(self::$final[$parent])) {
+ $deprecations[] = sprintf('The "%s" class is considered final%s It may change without further notice as of its next major version. You should not extend it from "%s".', $parent, self::$final[$parent], $className);
+ }
+ }
+
+ // Detect if the parent is annotated
+ foreach ($parentAndOwnInterfaces + class_uses($class, false) as $use) {
+ if (!isset(self::$checkedClasses[$use])) {
+ $this->checkClass($use);
+ }
+ if (isset(self::$deprecated[$use]) && strncmp($vendor, str_replace('_', '\\', $use), $vendorLen) && !isset(self::$deprecated[$class])) {
+ $type = class_exists($class, false) ? 'class' : (interface_exists($class, false) ? 'interface' : 'trait');
+ $verb = class_exists($use, false) || interface_exists($class, false) ? 'extends' : (interface_exists($use, false) ? 'implements' : 'uses');
+
+ $deprecations[] = sprintf('The "%s" %s %s "%s" that is deprecated%s', $className, $type, $verb, $use, self::$deprecated[$use]);
+ }
+ if (isset(self::$internal[$use]) && strncmp($vendor, str_replace('_', '\\', $use), $vendorLen)) {
+ $deprecations[] = sprintf('The "%s" %s is considered internal%s It may change without further notice. You should not use it from "%s".', $use, class_exists($use, false) ? 'class' : (interface_exists($use, false) ? 'interface' : 'trait'), self::$internal[$use], $className);
+ }
+ if (isset(self::$method[$use])) {
+ if ($refl->isAbstract()) {
+ if (isset(self::$method[$class])) {
+ self::$method[$class] = array_merge(self::$method[$class], self::$method[$use]);
+ } else {
+ self::$method[$class] = self::$method[$use];
+ }
+ } elseif (!$refl->isInterface()) {
+ if (!strncmp($vendor, str_replace('_', '\\', $use), $vendorLen)
+ && 0 === strpos($className, 'Symfony\\')
+ && (!class_exists(InstalledVersions::class)
+ || 'symfony/symfony' !== InstalledVersions::getRootPackage()['name'])
+ ) {
+ // skip "same vendor" @method deprecations for Symfony\* classes unless symfony/symfony is being tested
+ continue;
+ }
+ $hasCall = $refl->hasMethod('__call');
+ $hasStaticCall = $refl->hasMethod('__callStatic');
+ foreach (self::$method[$use] as [$interface, $static, $returnType, $name, $description]) {
+ if ($static ? $hasStaticCall : $hasCall) {
+ continue;
+ }
+ $realName = substr($name, 0, strpos($name, '('));
+ if (!$refl->hasMethod($realName) || !($methodRefl = $refl->getMethod($realName))->isPublic() || ($static && !$methodRefl->isStatic()) || (!$static && $methodRefl->isStatic())) {
+ $deprecations[] = sprintf('Class "%s" should implement method "%s::%s%s"%s', $className, ($static ? 'static ' : '').$interface, $name, $returnType ? ': '.$returnType : '', null === $description ? '.' : ': '.$description);
+ }
+ }
+ }
+ }
+ }
+
+ if (trait_exists($class)) {
+ $file = $refl->getFileName();
+
+ foreach ($refl->getMethods() as $method) {
+ if ($method->getFileName() === $file) {
+ self::$methodTraits[$file][$method->getStartLine()] = $class;
+ }
+ }
+
+ return $deprecations;
+ }
+
+ // Inherit @final, @internal, @param and @return annotations for methods
+ self::$finalMethods[$class] = [];
+ self::$internalMethods[$class] = [];
+ self::$annotatedParameters[$class] = [];
+ foreach ($parentAndOwnInterfaces as $use) {
+ foreach (['finalMethods', 'internalMethods', 'annotatedParameters', 'returnTypes'] as $property) {
+ if (isset(self::${$property}[$use])) {
+ self::${$property}[$class] = self::${$property}[$class] ? self::${$property}[$use] + self::${$property}[$class] : self::${$property}[$use];
+ }
+ }
+
+ if (null !== (TentativeTypes::RETURN_TYPES[$use] ?? null)) {
+ foreach (TentativeTypes::RETURN_TYPES[$use] as $method => $returnType) {
+ $returnType = explode('|', $returnType);
+ foreach ($returnType as $i => $t) {
+ if ('?' !== $t && !isset(self::BUILTIN_RETURN_TYPES[$t])) {
+ $returnType[$i] = '\\'.$t;
+ }
+ }
+ $returnType = implode('|', $returnType);
+
+ self::$returnTypes[$class] += [$method => [$returnType, 0 === strpos($returnType, '?') ? substr($returnType, 1).'|null' : $returnType, $use, '']];
+ }
+ }
+ }
+
+ foreach ($refl->getMethods() as $method) {
+ if ($method->class !== $class) {
+ continue;
+ }
+
+ if (null === $ns = self::$methodTraits[$method->getFileName()][$method->getStartLine()] ?? null) {
+ $ns = $vendor;
+ $len = $vendorLen;
+ } elseif (2 > $len = 1 + (strpos($ns, '\\') ?: strpos($ns, '_'))) {
+ $len = 0;
+ $ns = '';
+ } else {
+ $ns = str_replace('_', '\\', substr($ns, 0, $len));
+ }
+
+ if ($parent && isset(self::$finalMethods[$parent][$method->name])) {
+ [$declaringClass, $message] = self::$finalMethods[$parent][$method->name];
+ $deprecations[] = sprintf('The "%s::%s()" method is considered final%s It may change without further notice as of its next major version. You should not extend it from "%s".', $declaringClass, $method->name, $message, $className);
+ }
+
+ if (isset(self::$internalMethods[$class][$method->name])) {
+ [$declaringClass, $message] = self::$internalMethods[$class][$method->name];
+ if (strncmp($ns, $declaringClass, $len)) {
+ $deprecations[] = sprintf('The "%s::%s()" method is considered internal%s It may change without further notice. You should not extend it from "%s".', $declaringClass, $method->name, $message, $className);
+ }
+ }
+
+ // To read method annotations
+ $doc = $this->parsePhpDoc($method);
+
+ if (($classIsTemplate || isset($doc['template'])) && $method->hasReturnType()) {
+ unset($doc['return']);
+ }
+
+ if (isset(self::$annotatedParameters[$class][$method->name])) {
+ $definedParameters = [];
+ foreach ($method->getParameters() as $parameter) {
+ $definedParameters[$parameter->name] = true;
+ }
+
+ foreach (self::$annotatedParameters[$class][$method->name] as $parameterName => $deprecation) {
+ if (!isset($definedParameters[$parameterName]) && !isset($doc['param'][$parameterName])) {
+ $deprecations[] = sprintf($deprecation, $className);
+ }
+ }
+ }
+
+ $forcePatchTypes = $this->patchTypes['force'];
+
+ if ($canAddReturnType = null !== $forcePatchTypes && false === strpos($method->getFileName(), \DIRECTORY_SEPARATOR.'vendor'.\DIRECTORY_SEPARATOR)) {
+ if ('void' !== (self::MAGIC_METHODS[$method->name] ?? 'void')) {
+ $this->patchTypes['force'] = $forcePatchTypes ?: 'docblock';
+ }
+
+ $canAddReturnType = 2 === (int) $forcePatchTypes
+ || false !== stripos($method->getFileName(), \DIRECTORY_SEPARATOR.'Tests'.\DIRECTORY_SEPARATOR)
+ || $refl->isFinal()
+ || $method->isFinal()
+ || $method->isPrivate()
+ || ('.' === (self::$internal[$class] ?? null) && !$refl->isAbstract())
+ || '.' === (self::$final[$class] ?? null)
+ || '' === ($doc['final'][0] ?? null)
+ || '' === ($doc['internal'][0] ?? null)
+ ;
+ }
+
+ if (null !== ($returnType = self::$returnTypes[$class][$method->name] ?? null) && 'docblock' === $this->patchTypes['force'] && !$method->hasReturnType() && isset(TentativeTypes::RETURN_TYPES[$returnType[2]][$method->name])) {
+ $this->patchReturnTypeWillChange($method);
+ }
+
+ if (null !== ($returnType ?? $returnType = self::MAGIC_METHODS[$method->name] ?? null) && !$method->hasReturnType() && !isset($doc['return'])) {
+ [$normalizedType, $returnType, $declaringClass, $declaringFile] = \is_string($returnType) ? [$returnType, $returnType, '', ''] : $returnType;
+
+ if ($canAddReturnType && 'docblock' !== $this->patchTypes['force']) {
+ $this->patchMethod($method, $returnType, $declaringFile, $normalizedType);
+ }
+ if (!isset($doc['deprecated']) && strncmp($ns, $declaringClass, $len)) {
+ if ('docblock' === $this->patchTypes['force']) {
+ $this->patchMethod($method, $returnType, $declaringFile, $normalizedType);
+ } elseif ('' !== $declaringClass && $this->patchTypes['deprecations']) {
+ $deprecations[] = sprintf('Method "%s::%s()" might add "%s" as a native return type declaration in the future. Do the same in %s "%s" now to avoid errors or add an explicit @return annotation to suppress this message.', $declaringClass, $method->name, $normalizedType, interface_exists($declaringClass) ? 'implementation' : 'child class', $className);
+ }
+ }
+ }
+
+ if (!$doc) {
+ $this->patchTypes['force'] = $forcePatchTypes;
+
+ continue;
+ }
+
+ if (isset($doc['return']) || 'void' !== (self::MAGIC_METHODS[$method->name] ?? 'void')) {
+ $this->setReturnType($doc['return'] ?? self::MAGIC_METHODS[$method->name], $method->class, $method->name, $method->getFileName(), $parent, $method->getReturnType());
+
+ if (isset(self::$returnTypes[$class][$method->name][0]) && $canAddReturnType) {
+ $this->fixReturnStatements($method, self::$returnTypes[$class][$method->name][0]);
+ }
+
+ if ($method->isPrivate()) {
+ unset(self::$returnTypes[$class][$method->name]);
+ }
+ }
+
+ $this->patchTypes['force'] = $forcePatchTypes;
+
+ if ($method->isPrivate()) {
+ continue;
+ }
+
+ $finalOrInternal = false;
+
+ foreach (['final', 'internal'] as $annotation) {
+ if (null !== $description = $doc[$annotation][0] ?? null) {
+ self::${$annotation.'Methods'}[$class][$method->name] = [$class, '' !== $description ? ' '.$description.(preg_match('/[[:punct:]]$/', $description) ? '' : '.') : '.'];
+ $finalOrInternal = true;
+ }
+ }
+
+ if ($finalOrInternal || $method->isConstructor() || !isset($doc['param']) || StatelessInvocation::class === $class) {
+ continue;
+ }
+ if (!isset(self::$annotatedParameters[$class][$method->name])) {
+ $definedParameters = [];
+ foreach ($method->getParameters() as $parameter) {
+ $definedParameters[$parameter->name] = true;
+ }
+ }
+ foreach ($doc['param'] as $parameterName => $parameterType) {
+ if (!isset($definedParameters[$parameterName])) {
+ self::$annotatedParameters[$class][$method->name][$parameterName] = sprintf('The "%%s::%s()" method will require a new "%s$%s" argument in the next major version of its %s "%s", not defining it is deprecated.', $method->name, $parameterType ? $parameterType.' ' : '', $parameterName, interface_exists($className) ? 'interface' : 'parent class', $className);
+ }
+ }
+ }
+
+ return $deprecations;
+ }
+
+ public function checkCase(\ReflectionClass $refl, string $file, string $class): ?array
+ {
+ $real = explode('\\', $class.strrchr($file, '.'));
+ $tail = explode(\DIRECTORY_SEPARATOR, str_replace('/', \DIRECTORY_SEPARATOR, $file));
+
+ $i = \count($tail) - 1;
+ $j = \count($real) - 1;
+
+ while (isset($tail[$i], $real[$j]) && $tail[$i] === $real[$j]) {
+ --$i;
+ --$j;
+ }
+
+ array_splice($tail, 0, $i + 1);
+
+ if (!$tail) {
+ return null;
+ }
+
+ $tail = \DIRECTORY_SEPARATOR.implode(\DIRECTORY_SEPARATOR, $tail);
+ $tailLen = \strlen($tail);
+ $real = $refl->getFileName();
+
+ if (2 === self::$caseCheck) {
+ $real = $this->darwinRealpath($real);
+ }
+
+ if (0 === substr_compare($real, $tail, -$tailLen, $tailLen, true)
+ && 0 !== substr_compare($real, $tail, -$tailLen, $tailLen, false)
+ ) {
+ return [substr($tail, -$tailLen + 1), substr($real, -$tailLen + 1), substr($real, 0, -$tailLen + 1)];
+ }
+
+ return null;
+ }
+
+ /**
+ * `realpath` on MacOSX doesn't normalize the case of characters.
+ */
+ private function darwinRealpath(string $real): string
+ {
+ $i = 1 + strrpos($real, '/');
+ $file = substr($real, $i);
+ $real = substr($real, 0, $i);
+
+ if (isset(self::$darwinCache[$real])) {
+ $kDir = $real;
+ } else {
+ $kDir = strtolower($real);
+
+ if (isset(self::$darwinCache[$kDir])) {
+ $real = self::$darwinCache[$kDir][0];
+ } else {
+ $dir = getcwd();
+
+ if (!@chdir($real)) {
+ return $real.$file;
+ }
+
+ $real = getcwd().'/';
+ chdir($dir);
+
+ $dir = $real;
+ $k = $kDir;
+ $i = \strlen($dir) - 1;
+ while (!isset(self::$darwinCache[$k])) {
+ self::$darwinCache[$k] = [$dir, []];
+ self::$darwinCache[$dir] = &self::$darwinCache[$k];
+
+ while ('/' !== $dir[--$i]) {
+ }
+ $k = substr($k, 0, ++$i);
+ $dir = substr($dir, 0, $i--);
+ }
+ }
+ }
+
+ $dirFiles = self::$darwinCache[$kDir][1];
+
+ if (!isset($dirFiles[$file]) && ') : eval()\'d code' === substr($file, -17)) {
+ // Get the file name from "file_name.php(123) : eval()'d code"
+ $file = substr($file, 0, strrpos($file, '(', -17));
+ }
+
+ if (isset($dirFiles[$file])) {
+ return $real.$dirFiles[$file];
+ }
+
+ $kFile = strtolower($file);
+
+ if (!isset($dirFiles[$kFile])) {
+ foreach (scandir($real, 2) as $f) {
+ if ('.' !== $f[0]) {
+ $dirFiles[$f] = $f;
+ if ($f === $file) {
+ $kFile = $k = $file;
+ } elseif ($f !== $k = strtolower($f)) {
+ $dirFiles[$k] = $f;
+ }
+ }
+ }
+ self::$darwinCache[$kDir][1] = $dirFiles;
+ }
+
+ return $real.$dirFiles[$kFile];
+ }
+
+ /**
+ * `class_implements` includes interfaces from the parents so we have to manually exclude them.
+ *
+ * @return string[]
+ */
+ private function getOwnInterfaces(string $class, ?string $parent): array
+ {
+ $ownInterfaces = class_implements($class, false);
+
+ if ($parent) {
+ foreach (class_implements($parent, false) as $interface) {
+ unset($ownInterfaces[$interface]);
+ }
+ }
+
+ foreach ($ownInterfaces as $interface) {
+ foreach (class_implements($interface) as $interface) {
+ unset($ownInterfaces[$interface]);
+ }
+ }
+
+ return $ownInterfaces;
+ }
+
+ private function setReturnType(string $types, string $class, string $method, string $filename, ?string $parent, \ReflectionType $returnType = null): void
+ {
+ if ('__construct' === $method) {
+ return;
+ }
+
+ if ($nullable = 0 === strpos($types, 'null|')) {
+ $types = substr($types, 5);
+ } elseif ($nullable = '|null' === substr($types, -5)) {
+ $types = substr($types, 0, -5);
+ }
+ $arrayType = ['array' => 'array'];
+ $typesMap = [];
+ $glue = false !== strpos($types, '&') ? '&' : '|';
+ foreach (explode($glue, $types) as $t) {
+ $t = self::SPECIAL_RETURN_TYPES[strtolower($t)] ?? $t;
+ $typesMap[$this->normalizeType($t, $class, $parent, $returnType)][$t] = $t;
+ }
+
+ if (isset($typesMap['array'])) {
+ if (isset($typesMap['Traversable']) || isset($typesMap['\Traversable'])) {
+ $typesMap['iterable'] = $arrayType !== $typesMap['array'] ? $typesMap['array'] : ['iterable'];
+ unset($typesMap['array'], $typesMap['Traversable'], $typesMap['\Traversable']);
+ } elseif ($arrayType !== $typesMap['array'] && isset(self::$returnTypes[$class][$method]) && !$returnType) {
+ return;
+ }
+ }
+
+ if (isset($typesMap['array']) && isset($typesMap['iterable'])) {
+ if ($arrayType !== $typesMap['array']) {
+ $typesMap['iterable'] = $typesMap['array'];
+ }
+ unset($typesMap['array']);
+ }
+
+ $iterable = $object = true;
+ foreach ($typesMap as $n => $t) {
+ if ('null' !== $n) {
+ $iterable = $iterable && (\in_array($n, ['array', 'iterable']) || false !== strpos($n, 'Iterator'));
+ $object = $object && (\in_array($n, ['callable', 'object', '$this', 'static']) || !isset(self::SPECIAL_RETURN_TYPES[$n]));
+ }
+ }
+
+ $phpTypes = [];
+ $docTypes = [];
+
+ foreach ($typesMap as $n => $t) {
+ if ('null' === $n) {
+ $nullable = true;
+ continue;
+ }
+
+ $docTypes[] = $t;
+
+ if ('mixed' === $n || 'void' === $n) {
+ $nullable = false;
+ $phpTypes = ['' => $n];
+ continue;
+ }
+
+ if ('resource' === $n) {
+ // there is no native type for "resource"
+ return;
+ }
+
+ if (!isset($phpTypes[''])) {
+ $phpTypes[] = $n;
+ }
+ }
+ $docTypes = array_merge([], ...$docTypes);
+
+ if (!$phpTypes) {
+ return;
+ }
+
+ if (1 < \count($phpTypes)) {
+ if ($iterable && '8.0' > $this->patchTypes['php']) {
+ $phpTypes = $docTypes = ['iterable'];
+ } elseif ($object && 'object' === $this->patchTypes['force']) {
+ $phpTypes = $docTypes = ['object'];
+ } elseif ('8.0' > $this->patchTypes['php']) {
+ // ignore multi-types return declarations
+ return;
+ }
+ }
+
+ $phpType = sprintf($nullable ? (1 < \count($phpTypes) ? '%s|null' : '?%s') : '%s', implode($glue, $phpTypes));
+ $docType = sprintf($nullable ? '%s|null' : '%s', implode($glue, $docTypes));
+
+ self::$returnTypes[$class][$method] = [$phpType, $docType, $class, $filename];
+ }
+
+ private function normalizeType(string $type, string $class, ?string $parent, ?\ReflectionType $returnType): string
+ {
+ if (isset(self::SPECIAL_RETURN_TYPES[$lcType = strtolower($type)])) {
+ if ('parent' === $lcType = self::SPECIAL_RETURN_TYPES[$lcType]) {
+ $lcType = null !== $parent ? '\\'.$parent : 'parent';
+ } elseif ('self' === $lcType) {
+ $lcType = '\\'.$class;
+ }
+
+ return $lcType;
+ }
+
+ // We could resolve "use" statements to return the FQDN
+ // but this would be too expensive for a runtime checker
+
+ if ('[]' !== substr($type, -2)) {
+ return $type;
+ }
+
+ if ($returnType instanceof \ReflectionNamedType) {
+ $type = $returnType->getName();
+
+ if ('mixed' !== $type) {
+ return isset(self::SPECIAL_RETURN_TYPES[$type]) ? $type : '\\'.$type;
+ }
+ }
+
+ return 'array';
+ }
+
+ /**
+ * Utility method to add #[ReturnTypeWillChange] where php triggers deprecations.
+ */
+ private function patchReturnTypeWillChange(\ReflectionMethod $method)
+ {
+ if (\PHP_VERSION_ID >= 80000 && \count($method->getAttributes(\ReturnTypeWillChange::class))) {
+ return;
+ }
+
+ if (!is_file($file = $method->getFileName())) {
+ return;
+ }
+
+ $fileOffset = self::$fileOffsets[$file] ?? 0;
+
+ $code = file($file);
+
+ $startLine = $method->getStartLine() + $fileOffset - 2;
+
+ if (false !== stripos($code[$startLine], 'ReturnTypeWillChange')) {
+ return;
+ }
+
+ $code[$startLine] .= " #[\\ReturnTypeWillChange]\n";
+ self::$fileOffsets[$file] = 1 + $fileOffset;
+ file_put_contents($file, $code);
+ }
+
+ /**
+ * Utility method to add @return annotations to the Symfony code-base where it triggers self-deprecations.
+ */
+ private function patchMethod(\ReflectionMethod $method, string $returnType, string $declaringFile, string $normalizedType)
+ {
+ static $patchedMethods = [];
+ static $useStatements = [];
+
+ if (!is_file($file = $method->getFileName()) || isset($patchedMethods[$file][$startLine = $method->getStartLine()])) {
+ return;
+ }
+
+ $patchedMethods[$file][$startLine] = true;
+ $fileOffset = self::$fileOffsets[$file] ?? 0;
+ $startLine += $fileOffset - 2;
+ if ($nullable = '|null' === substr($returnType, -5)) {
+ $returnType = substr($returnType, 0, -5);
+ }
+ $glue = false !== strpos($returnType, '&') ? '&' : '|';
+ $returnType = explode($glue, $returnType);
+ $code = file($file);
+
+ foreach ($returnType as $i => $type) {
+ if (preg_match('/((?:\[\])+)$/', $type, $m)) {
+ $type = substr($type, 0, -\strlen($m[1]));
+ $format = '%s'.$m[1];
+ } else {
+ $format = null;
+ }
+
+ if (isset(self::SPECIAL_RETURN_TYPES[$type]) || ('\\' === $type[0] && !$p = strrpos($type, '\\', 1))) {
+ continue;
+ }
+
+ [$namespace, $useOffset, $useMap] = $useStatements[$file] ?? $useStatements[$file] = self::getUseStatements($file);
+
+ if ('\\' !== $type[0]) {
+ [$declaringNamespace, , $declaringUseMap] = $useStatements[$declaringFile] ?? $useStatements[$declaringFile] = self::getUseStatements($declaringFile);
+
+ $p = strpos($type, '\\', 1);
+ $alias = $p ? substr($type, 0, $p) : $type;
+
+ if (isset($declaringUseMap[$alias])) {
+ $type = '\\'.$declaringUseMap[$alias].($p ? substr($type, $p) : '');
+ } else {
+ $type = '\\'.$declaringNamespace.$type;
+ }
+
+ $p = strrpos($type, '\\', 1);
+ }
+
+ $alias = substr($type, 1 + $p);
+ $type = substr($type, 1);
+
+ if (!isset($useMap[$alias]) && (class_exists($c = $namespace.$alias) || interface_exists($c) || trait_exists($c))) {
+ $useMap[$alias] = $c;
+ }
+
+ if (!isset($useMap[$alias])) {
+ $useStatements[$file][2][$alias] = $type;
+ $code[$useOffset] = "use $type;\n".$code[$useOffset];
+ ++$fileOffset;
+ } elseif ($useMap[$alias] !== $type) {
+ $alias .= 'FIXME';
+ $useStatements[$file][2][$alias] = $type;
+ $code[$useOffset] = "use $type as $alias;\n".$code[$useOffset];
+ ++$fileOffset;
+ }
+
+ $returnType[$i] = null !== $format ? sprintf($format, $alias) : $alias;
+ }
+
+ if ('docblock' === $this->patchTypes['force'] || ('object' === $normalizedType && '7.1' === $this->patchTypes['php'])) {
+ $returnType = implode($glue, $returnType).($nullable ? '|null' : '');
+
+ if (false !== strpos($code[$startLine], '#[')) {
+ --$startLine;
+ }
+
+ if ($method->getDocComment()) {
+ $code[$startLine] = " * @return $returnType\n".$code[$startLine];
+ } else {
+ $code[$startLine] .= <<fixReturnStatements($method, $normalizedType);
+ }
+
+ private static function getUseStatements(string $file): array
+ {
+ $namespace = '';
+ $useMap = [];
+ $useOffset = 0;
+
+ if (!is_file($file)) {
+ return [$namespace, $useOffset, $useMap];
+ }
+
+ $file = file($file);
+
+ for ($i = 0; $i < \count($file); ++$i) {
+ if (preg_match('/^(class|interface|trait|abstract) /', $file[$i])) {
+ break;
+ }
+
+ if (0 === strpos($file[$i], 'namespace ')) {
+ $namespace = substr($file[$i], \strlen('namespace '), -2).'\\';
+ $useOffset = $i + 2;
+ }
+
+ if (0 === strpos($file[$i], 'use ')) {
+ $useOffset = $i;
+
+ for (; 0 === strpos($file[$i], 'use '); ++$i) {
+ $u = explode(' as ', substr($file[$i], 4, -2), 2);
+
+ if (1 === \count($u)) {
+ $p = strrpos($u[0], '\\');
+ $useMap[substr($u[0], false !== $p ? 1 + $p : 0)] = $u[0];
+ } else {
+ $useMap[$u[1]] = $u[0];
+ }
+ }
+
+ break;
+ }
+ }
+
+ return [$namespace, $useOffset, $useMap];
+ }
+
+ private function fixReturnStatements(\ReflectionMethod $method, string $returnType)
+ {
+ if ('docblock' !== $this->patchTypes['force']) {
+ if ('7.1' === $this->patchTypes['php'] && 'object' === ltrim($returnType, '?')) {
+ return;
+ }
+
+ if ('7.4' > $this->patchTypes['php'] && $method->hasReturnType()) {
+ return;
+ }
+
+ if ('8.0' > $this->patchTypes['php'] && (false !== strpos($returnType, '|') || \in_array($returnType, ['mixed', 'static'], true))) {
+ return;
+ }
+
+ if ('8.1' > $this->patchTypes['php'] && false !== strpos($returnType, '&')) {
+ return;
+ }
+ }
+
+ if (!is_file($file = $method->getFileName())) {
+ return;
+ }
+
+ $fixedCode = $code = file($file);
+ $i = (self::$fileOffsets[$file] ?? 0) + $method->getStartLine();
+
+ if ('?' !== $returnType && 'docblock' !== $this->patchTypes['force']) {
+ $fixedCode[$i - 1] = preg_replace('/\)(?::[^;\n]++)?(;?\n)/', "): $returnType\\1", $code[$i - 1]);
+ }
+
+ $end = $method->isGenerator() ? $i : $method->getEndLine();
+ for (; $i < $end; ++$i) {
+ if ('void' === $returnType) {
+ $fixedCode[$i] = str_replace(' return null;', ' return;', $code[$i]);
+ } elseif ('mixed' === $returnType || '?' === $returnType[0]) {
+ $fixedCode[$i] = str_replace(' return;', ' return null;', $code[$i]);
+ } else {
+ $fixedCode[$i] = str_replace(' return;', " return $returnType!?;", $code[$i]);
+ }
+ }
+
+ if ($fixedCode !== $code) {
+ file_put_contents($file, $fixedCode);
+ }
+ }
+
+ /**
+ * @param \ReflectionClass|\ReflectionMethod|\ReflectionProperty $reflector
+ */
+ private function parsePhpDoc(\Reflector $reflector): array
+ {
+ if (!$doc = $reflector->getDocComment()) {
+ return [];
+ }
+
+ $tagName = '';
+ $tagContent = '';
+
+ $tags = [];
+
+ foreach (explode("\n", substr($doc, 3, -2)) as $line) {
+ $line = ltrim($line);
+ $line = ltrim($line, '*');
+
+ if ('' === $line = trim($line)) {
+ if ('' !== $tagName) {
+ $tags[$tagName][] = $tagContent;
+ }
+ $tagName = $tagContent = '';
+ continue;
+ }
+
+ if ('@' === $line[0]) {
+ if ('' !== $tagName) {
+ $tags[$tagName][] = $tagContent;
+ $tagContent = '';
+ }
+
+ if (preg_match('{^@([-a-zA-Z0-9_:]++)(\s|$)}', $line, $m)) {
+ $tagName = $m[1];
+ $tagContent = str_replace("\t", ' ', ltrim(substr($line, 2 + \strlen($tagName))));
+ } else {
+ $tagName = '';
+ }
+ } elseif ('' !== $tagName) {
+ $tagContent .= ' '.str_replace("\t", ' ', $line);
+ }
+ }
+
+ if ('' !== $tagName) {
+ $tags[$tagName][] = $tagContent;
+ }
+
+ foreach ($tags['method'] ?? [] as $i => $method) {
+ unset($tags['method'][$i]);
+
+ $parts = preg_split('{(\s++|\((?:[^()]*+|(?R))*\)(?: *: *[^ ]++)?|<(?:[^<>]*+|(?R))*>|\{(?:[^{}]*+|(?R))*\})}', $method, -1, \PREG_SPLIT_DELIM_CAPTURE);
+ $returnType = '';
+ $static = 'static' === $parts[0];
+
+ for ($i = $static ? 2 : 0; null !== $p = $parts[$i] ?? null; $i += 2) {
+ if (\in_array($p, ['', '|', '&', 'callable'], true) || \in_array(substr($returnType, -1), ['|', '&'], true)) {
+ $returnType .= trim($parts[$i - 1] ?? '').$p;
+ continue;
+ }
+
+ $signature = '(' === ($parts[$i + 1][0] ?? '(') ? $parts[$i + 1] ?? '()' : null;
+
+ if (null === $signature && '' === $returnType) {
+ $returnType = $p;
+ continue;
+ }
+
+ if ($static && 2 === $i) {
+ $static = false;
+ $returnType = 'static';
+ }
+
+ if (\in_array($description = trim(implode('', \array_slice($parts, 2 + $i))), ['', '.'], true)) {
+ $description = null;
+ } elseif (!preg_match('/[.!]$/', $description)) {
+ $description .= '.';
+ }
+
+ $tags['method'][$p] = [$static, $returnType, $signature ?? '()', $description];
+ break;
+ }
+ }
+
+ foreach ($tags['param'] ?? [] as $i => $param) {
+ unset($tags['param'][$i]);
+
+ if (\strlen($param) !== strcspn($param, '<{(')) {
+ $param = preg_replace('{\(([^()]*+|(?R))*\)(?: *: *[^ ]++)?|<([^<>]*+|(?R))*>|\{([^{}]*+|(?R))*\}}', '', $param);
+ }
+
+ if (false === $i = strpos($param, '$')) {
+ continue;
+ }
+
+ $type = 0 === $i ? '' : rtrim(substr($param, 0, $i), ' &');
+ $param = substr($param, 1 + $i, (strpos($param, ' ', $i) ?: (1 + $i + \strlen($param))) - $i - 1);
+
+ $tags['param'][$param] = $type;
+ }
+
+ foreach (['var', 'return'] as $k) {
+ if (null === $v = $tags[$k][0] ?? null) {
+ continue;
+ }
+ if (\strlen($v) !== strcspn($v, '<{(')) {
+ $v = preg_replace('{\(([^()]*+|(?R))*\)(?: *: *[^ ]++)?|<([^<>]*+|(?R))*>|\{([^{}]*+|(?R))*\}}', '', $v);
+ }
+
+ $tags[$k] = substr($v, 0, strpos($v, ' ') ?: \strlen($v)) ?: null;
+ }
+
+ return $tags;
+ }
+}
diff --git a/lib/symfony/error-handler/Error/ClassNotFoundError.php b/lib/symfony/error-handler/Error/ClassNotFoundError.php
new file mode 100644
index 000000000..443fba2c3
--- /dev/null
+++ b/lib/symfony/error-handler/Error/ClassNotFoundError.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\Error;
+
+class ClassNotFoundError extends \Error
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(string $message, \Throwable $previous)
+ {
+ parent::__construct($message, $previous->getCode(), $previous->getPrevious());
+
+ foreach ([
+ 'file' => $previous->getFile(),
+ 'line' => $previous->getLine(),
+ 'trace' => $previous->getTrace(),
+ ] as $property => $value) {
+ $refl = new \ReflectionProperty(\Error::class, $property);
+ $refl->setAccessible(true);
+ $refl->setValue($this, $value);
+ }
+ }
+}
diff --git a/lib/symfony/debug/Exception/FatalErrorException.php b/lib/symfony/error-handler/Error/FatalError.php
similarity index 62%
rename from lib/symfony/debug/Exception/FatalErrorException.php
rename to lib/symfony/error-handler/Error/FatalError.php
index 0f70ef929..57fc690e2 100644
--- a/lib/symfony/debug/Exception/FatalErrorException.php
+++ b/lib/symfony/error-handler/Error/FatalError.php
@@ -9,18 +9,22 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\Debug\Exception;
+namespace Symfony\Component\ErrorHandler\Error;
-/**
- * Fatal Error Exception.
- *
- * @author Konstanton Myakshin
- */
-class FatalErrorException extends \ErrorException
+class FatalError extends \Error
{
- public function __construct($message, $code, $severity, $filename, $lineno, $traceOffset = null, $traceArgs = true, array $trace = null, $previous = null)
+ private $error;
+
+ /**
+ * {@inheritdoc}
+ *
+ * @param array $error An array as returned by error_get_last()
+ */
+ public function __construct(string $message, int $code, array $error, int $traceOffset = null, bool $traceArgs = true, array $trace = null)
{
- parent::__construct($message, $code, $severity, $filename, $lineno, $previous);
+ parent::__construct($message, $code);
+
+ $this->error = $error;
if (null !== $trace) {
if (!$traceArgs) {
@@ -28,11 +32,8 @@ class FatalErrorException extends \ErrorException
unset($frame['args'], $frame['this'], $frame);
}
}
-
- $this->setTrace($trace);
} elseif (null !== $traceOffset) {
- if (\function_exists('xdebug_get_function_stack')) {
- $trace = xdebug_get_function_stack();
+ if (\function_exists('xdebug_get_function_stack') && $trace = @xdebug_get_function_stack()) {
if (0 < $traceOffset) {
array_splice($trace, -$traceOffset);
}
@@ -60,23 +61,29 @@ class FatalErrorException extends \ErrorException
unset($frame);
$trace = array_reverse($trace);
- } elseif (\function_exists('symfony_debug_backtrace')) {
- $trace = symfony_debug_backtrace();
- if (0 < $traceOffset) {
- array_splice($trace, 0, $traceOffset);
- }
} else {
$trace = [];
}
+ }
- $this->setTrace($trace);
+ foreach ([
+ 'file' => $error['file'],
+ 'line' => $error['line'],
+ 'trace' => $trace,
+ ] as $property => $value) {
+ if (null !== $value) {
+ $refl = new \ReflectionProperty(\Error::class, $property);
+ $refl->setAccessible(true);
+ $refl->setValue($this, $value);
+ }
}
}
- protected function setTrace($trace)
+ /**
+ * {@inheritdoc}
+ */
+ public function getError(): array
{
- $traceReflector = new \ReflectionProperty('Exception', 'trace');
- $traceReflector->setAccessible(true);
- $traceReflector->setValue($this, $trace);
+ return $this->error;
}
}
diff --git a/lib/symfony/error-handler/Error/OutOfMemoryError.php b/lib/symfony/error-handler/Error/OutOfMemoryError.php
new file mode 100644
index 000000000..d685c3d36
--- /dev/null
+++ b/lib/symfony/error-handler/Error/OutOfMemoryError.php
@@ -0,0 +1,16 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\Error;
+
+class OutOfMemoryError extends FatalError
+{
+}
diff --git a/lib/symfony/error-handler/Error/UndefinedFunctionError.php b/lib/symfony/error-handler/Error/UndefinedFunctionError.php
new file mode 100644
index 000000000..b57dd1579
--- /dev/null
+++ b/lib/symfony/error-handler/Error/UndefinedFunctionError.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\Error;
+
+class UndefinedFunctionError extends \Error
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(string $message, \Throwable $previous)
+ {
+ parent::__construct($message, $previous->getCode(), $previous->getPrevious());
+
+ foreach ([
+ 'file' => $previous->getFile(),
+ 'line' => $previous->getLine(),
+ 'trace' => $previous->getTrace(),
+ ] as $property => $value) {
+ $refl = new \ReflectionProperty(\Error::class, $property);
+ $refl->setAccessible(true);
+ $refl->setValue($this, $value);
+ }
+ }
+}
diff --git a/lib/symfony/error-handler/Error/UndefinedMethodError.php b/lib/symfony/error-handler/Error/UndefinedMethodError.php
new file mode 100644
index 000000000..adc8731f3
--- /dev/null
+++ b/lib/symfony/error-handler/Error/UndefinedMethodError.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\Error;
+
+class UndefinedMethodError extends \Error
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(string $message, \Throwable $previous)
+ {
+ parent::__construct($message, $previous->getCode(), $previous->getPrevious());
+
+ foreach ([
+ 'file' => $previous->getFile(),
+ 'line' => $previous->getLine(),
+ 'trace' => $previous->getTrace(),
+ ] as $property => $value) {
+ $refl = new \ReflectionProperty(\Error::class, $property);
+ $refl->setAccessible(true);
+ $refl->setValue($this, $value);
+ }
+ }
+}
diff --git a/lib/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php b/lib/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php
similarity index 75%
rename from lib/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php
rename to lib/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php
index b1216fe7a..f85d27515 100644
--- a/lib/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php
+++ b/lib/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php
@@ -9,27 +9,26 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\Debug\FatalErrorHandler;
+namespace Symfony\Component\ErrorHandler\ErrorEnhancer;
-use Composer\Autoload\ClassLoader as ComposerClassLoader;
-use Symfony\Component\ClassLoader\ClassLoader as SymfonyClassLoader;
-use Symfony\Component\Debug\DebugClassLoader;
-use Symfony\Component\Debug\Exception\ClassNotFoundException;
-use Symfony\Component\Debug\Exception\FatalErrorException;
+use Composer\Autoload\ClassLoader;
+use Symfony\Component\ErrorHandler\DebugClassLoader;
+use Symfony\Component\ErrorHandler\Error\ClassNotFoundError;
+use Symfony\Component\ErrorHandler\Error\FatalError;
/**
- * ErrorHandler for classes that do not exist.
- *
* @author Fabien Potencier
*/
-class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
+class ClassNotFoundErrorEnhancer implements ErrorEnhancerInterface
{
/**
* {@inheritdoc}
*/
- public function handleError(array $error, FatalErrorException $exception)
+ public function enhance(\Throwable $error): ?\Throwable
{
- if (!preg_match('/^(Class|Interface|Trait) [\'"]([^\'"]+)[\'"] not found$/', $error['message'], $matches)) {
+ // Some specific versions of PHP produce a fatal error when extending a not found class.
+ $message = !$error instanceof FatalError ? $error->getMessage() : $error->getError()['message'];
+ if (!preg_match('/^(Class|Interface|Trait) [\'"]([^\'"]+)[\'"] not found$/', $message, $matches)) {
return null;
}
$typeName = strtolower($matches[1]);
@@ -56,7 +55,7 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
}
$message .= "\nDid you forget a \"use\" statement".$tail;
- return new ClassNotFoundException($message, $exception);
+ return new ClassNotFoundError($message, $error);
}
/**
@@ -67,9 +66,9 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
*
* @param string $class A class name (without its namespace)
*
- * @return array An array of possible fully qualified class names
+ * Returns an array of possible fully qualified class names
*/
- private function getClassCandidates($class)
+ private function getClassCandidates(string $class): array
{
if (!\is_array($functions = spl_autoload_functions())) {
return [];
@@ -91,33 +90,25 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
}
}
- if ($function[0] instanceof ComposerClassLoader || $function[0] instanceof SymfonyClassLoader) {
+ if ($function[0] instanceof ClassLoader) {
foreach ($function[0]->getPrefixes() as $prefix => $paths) {
foreach ($paths as $path) {
- $classes = array_merge($classes, $this->findClassInPath($path, $class, $prefix));
+ $classes[] = $this->findClassInPath($path, $class, $prefix);
}
}
- }
- if ($function[0] instanceof ComposerClassLoader) {
+
foreach ($function[0]->getPrefixesPsr4() as $prefix => $paths) {
foreach ($paths as $path) {
- $classes = array_merge($classes, $this->findClassInPath($path, $class, $prefix));
+ $classes[] = $this->findClassInPath($path, $class, $prefix);
}
}
}
}
- return array_unique($classes);
+ return array_unique(array_merge([], ...$classes));
}
- /**
- * @param string $path
- * @param string $class
- * @param string $prefix
- *
- * @return array
- */
- private function findClassInPath($path, $class, $prefix)
+ private function findClassInPath(string $path, string $class, string $prefix): array
{
if (!$path = realpath($path.'/'.strtr($prefix, '\\_', '//')) ?: realpath($path.'/'.\dirname(strtr($prefix, '\\_', '//'))) ?: realpath($path)) {
return [];
@@ -134,14 +125,7 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
return $classes;
}
- /**
- * @param string $path
- * @param string $file
- * @param string $prefix
- *
- * @return string|null
- */
- private function convertFileToClass($path, $file, $prefix)
+ private function convertFileToClass(string $path, string $file, string $prefix): ?string
{
$candidates = [
// namespaced class
@@ -186,12 +170,7 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
return null;
}
- /**
- * @param string $class
- *
- * @return bool
- */
- private function classExists($class)
+ private function classExists(string $class): bool
{
return class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false);
}
diff --git a/lib/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php b/lib/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php
new file mode 100644
index 000000000..7c3f4ef94
--- /dev/null
+++ b/lib/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\ErrorEnhancer;
+
+interface ErrorEnhancerInterface
+{
+ /**
+ * Returns an \Throwable instance if the class is able to improve the error, null otherwise.
+ */
+ public function enhance(\Throwable $error): ?\Throwable;
+}
diff --git a/lib/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php b/lib/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php
similarity index 75%
rename from lib/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php
rename to lib/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php
index 77fc7aa26..f4c49c285 100644
--- a/lib/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php
+++ b/lib/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php
@@ -9,41 +9,44 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\Debug\FatalErrorHandler;
+namespace Symfony\Component\ErrorHandler\ErrorEnhancer;
-use Symfony\Component\Debug\Exception\FatalErrorException;
-use Symfony\Component\Debug\Exception\UndefinedFunctionException;
+use Symfony\Component\ErrorHandler\Error\FatalError;
+use Symfony\Component\ErrorHandler\Error\UndefinedFunctionError;
/**
- * ErrorHandler for undefined functions.
- *
* @author Fabien Potencier
*/
-class UndefinedFunctionFatalErrorHandler implements FatalErrorHandlerInterface
+class UndefinedFunctionErrorEnhancer implements ErrorEnhancerInterface
{
/**
* {@inheritdoc}
*/
- public function handleError(array $error, FatalErrorException $exception)
+ public function enhance(\Throwable $error): ?\Throwable
{
- $messageLen = \strlen($error['message']);
+ if ($error instanceof FatalError) {
+ return null;
+ }
+
+ $message = $error->getMessage();
+ $messageLen = \strlen($message);
$notFoundSuffix = '()';
$notFoundSuffixLen = \strlen($notFoundSuffix);
if ($notFoundSuffixLen > $messageLen) {
return null;
}
- if (0 !== substr_compare($error['message'], $notFoundSuffix, -$notFoundSuffixLen)) {
+ if (0 !== substr_compare($message, $notFoundSuffix, -$notFoundSuffixLen)) {
return null;
}
$prefix = 'Call to undefined function ';
$prefixLen = \strlen($prefix);
- if (0 !== strpos($error['message'], $prefix)) {
+ if (0 !== strpos($message, $prefix)) {
return null;
}
- $fullyQualifiedFunctionName = substr($error['message'], $prefixLen, -$notFoundSuffixLen);
+ $fullyQualifiedFunctionName = substr($message, $prefixLen, -$notFoundSuffixLen);
if (false !== $namespaceSeparatorIndex = strrpos($fullyQualifiedFunctionName, '\\')) {
$functionName = substr($fullyQualifiedFunctionName, $namespaceSeparatorIndex + 1);
$namespacePrefix = substr($fullyQualifiedFunctionName, 0, $namespaceSeparatorIndex);
@@ -79,6 +82,6 @@ class UndefinedFunctionFatalErrorHandler implements FatalErrorHandlerInterface
$message .= "\nDid you mean to call ".$candidates;
}
- return new UndefinedFunctionException($message, $exception);
+ return new UndefinedFunctionError($message, $error);
}
}
diff --git a/lib/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php b/lib/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php
similarity index 68%
rename from lib/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php
rename to lib/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php
index ff2843b68..c4355f92c 100644
--- a/lib/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php
+++ b/lib/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php
@@ -9,24 +9,27 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\Debug\FatalErrorHandler;
+namespace Symfony\Component\ErrorHandler\ErrorEnhancer;
-use Symfony\Component\Debug\Exception\FatalErrorException;
-use Symfony\Component\Debug\Exception\UndefinedMethodException;
+use Symfony\Component\ErrorHandler\Error\FatalError;
+use Symfony\Component\ErrorHandler\Error\UndefinedMethodError;
/**
- * ErrorHandler for undefined methods.
- *
* @author GrƩgoire Pineau
*/
-class UndefinedMethodFatalErrorHandler implements FatalErrorHandlerInterface
+class UndefinedMethodErrorEnhancer implements ErrorEnhancerInterface
{
/**
* {@inheritdoc}
*/
- public function handleError(array $error, FatalErrorException $exception)
+ public function enhance(\Throwable $error): ?\Throwable
{
- preg_match('/^Call to undefined method (.*)::(.*)\(\)$/', $error['message'], $matches);
+ if ($error instanceof FatalError) {
+ return null;
+ }
+
+ $message = $error->getMessage();
+ preg_match('/^Call to undefined method (.*)::(.*)\(\)$/', $message, $matches);
if (!$matches) {
return null;
}
@@ -36,9 +39,9 @@ class UndefinedMethodFatalErrorHandler implements FatalErrorHandlerInterface
$message = sprintf('Attempted to call an undefined method named "%s" of class "%s".', $methodName, $className);
- if (!class_exists($className) || null === $methods = get_class_methods($className)) {
+ if ('' === $methodName || !class_exists($className) || null === $methods = get_class_methods($className)) {
// failed to get the class or its methods on which an unknown method was called (for example on an anonymous class)
- return new UndefinedMethodException($message, $exception);
+ return new UndefinedMethodError($message, $error);
}
$candidates = [];
@@ -61,6 +64,6 @@ class UndefinedMethodFatalErrorHandler implements FatalErrorHandlerInterface
$message .= "\nDid you mean to call ".$candidates;
}
- return new UndefinedMethodException($message, $exception);
+ return new UndefinedMethodError($message, $error);
}
}
diff --git a/lib/symfony/debug/ErrorHandler.php b/lib/symfony/error-handler/ErrorHandler.php
similarity index 66%
rename from lib/symfony/debug/ErrorHandler.php
rename to lib/symfony/error-handler/ErrorHandler.php
index b8ec09e80..ffb823eed 100644
--- a/lib/symfony/debug/ErrorHandler.php
+++ b/lib/symfony/error-handler/ErrorHandler.php
@@ -9,19 +9,19 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\Debug;
+namespace Symfony\Component\ErrorHandler;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
-use Symfony\Component\Debug\Exception\ContextErrorException;
-use Symfony\Component\Debug\Exception\FatalErrorException;
-use Symfony\Component\Debug\Exception\FatalThrowableError;
-use Symfony\Component\Debug\Exception\OutOfMemoryException;
-use Symfony\Component\Debug\Exception\SilencedErrorContext;
-use Symfony\Component\Debug\FatalErrorHandler\ClassNotFoundFatalErrorHandler;
-use Symfony\Component\Debug\FatalErrorHandler\FatalErrorHandlerInterface;
-use Symfony\Component\Debug\FatalErrorHandler\UndefinedFunctionFatalErrorHandler;
-use Symfony\Component\Debug\FatalErrorHandler\UndefinedMethodFatalErrorHandler;
+use Symfony\Component\ErrorHandler\Error\FatalError;
+use Symfony\Component\ErrorHandler\Error\OutOfMemoryError;
+use Symfony\Component\ErrorHandler\ErrorEnhancer\ClassNotFoundErrorEnhancer;
+use Symfony\Component\ErrorHandler\ErrorEnhancer\ErrorEnhancerInterface;
+use Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedFunctionErrorEnhancer;
+use Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedMethodErrorEnhancer;
+use Symfony\Component\ErrorHandler\ErrorRenderer\CliErrorRenderer;
+use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
+use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext;
/**
* A generic ErrorHandler for the PHP engine.
@@ -45,6 +45,8 @@ use Symfony\Component\Debug\FatalErrorHandler\UndefinedMethodFatalErrorHandler;
*
* @author Nicolas Grekas
* @author GrƩgoire Pineau
+ *
+ * @final
*/
class ErrorHandler
{
@@ -89,7 +91,8 @@ class ErrorHandler
private $tracedErrors = 0x77FB; // E_ALL - E_STRICT - E_PARSE
private $screamedErrors = 0x55; // E_ERROR + E_CORE_ERROR + E_COMPILE_ERROR + E_PARSE
private $loggedErrors = 0;
- private $traceReflector;
+ private $configureException;
+ private $debug;
private $isRecursive = 0;
private $isRoot = false;
@@ -97,25 +100,18 @@ class ErrorHandler
private $bootstrappingLogger;
private static $reservedMemory;
- private static $stackedErrors = [];
- private static $stackedErrorLevels = [];
- private static $toStringException = null;
+ private static $toStringException;
private static $silencedErrorCache = [];
private static $silencedErrorCount = 0;
private static $exitCode = 0;
/**
* Registers the error handler.
- *
- * @param self|null $handler The handler to register
- * @param bool $replace Whether to replace or not any existing handler
- *
- * @return self The registered error handler
*/
- public static function register(self $handler = null, $replace = true)
+ public static function register(self $handler = null, bool $replace = true): self
{
if (null === self::$reservedMemory) {
- self::$reservedMemory = str_repeat('x', 10240);
+ self::$reservedMemory = str_repeat('x', 32768);
register_shutdown_function(__CLASS__.'::handleFatalError');
}
@@ -151,7 +147,7 @@ class ErrorHandler
$prev[0]->setExceptionHandler($p);
}
} else {
- $handler->setExceptionHandler($prev);
+ $handler->setExceptionHandler($prev ?? [$handler, 'renderException']);
}
$handler->throwAt(\E_ALL & $handler->thrownErrors, true);
@@ -159,24 +155,57 @@ class ErrorHandler
return $handler;
}
- public function __construct(BufferingLogger $bootstrappingLogger = null)
+ /**
+ * Calls a function and turns any PHP error into \ErrorException.
+ *
+ * @return mixed What $function(...$arguments) returns
+ *
+ * @throws \ErrorException When $function(...$arguments) triggers a PHP error
+ */
+ public static function call(callable $function, ...$arguments)
+ {
+ set_error_handler(static function (int $type, string $message, string $file, int $line) {
+ if (__FILE__ === $file) {
+ $trace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 3);
+ $file = $trace[2]['file'] ?? $file;
+ $line = $trace[2]['line'] ?? $line;
+ }
+
+ throw new \ErrorException($message, 0, $type, $file, $line);
+ });
+
+ try {
+ return $function(...$arguments);
+ } finally {
+ restore_error_handler();
+ }
+ }
+
+ public function __construct(BufferingLogger $bootstrappingLogger = null, bool $debug = false)
{
if ($bootstrappingLogger) {
$this->bootstrappingLogger = $bootstrappingLogger;
$this->setDefaultLogger($bootstrappingLogger);
}
- $this->traceReflector = new \ReflectionProperty('Exception', 'trace');
- $this->traceReflector->setAccessible(true);
+ $traceReflector = new \ReflectionProperty(\Exception::class, 'trace');
+ $traceReflector->setAccessible(true);
+ $this->configureException = \Closure::bind(static function ($e, $trace, $file = null, $line = null) use ($traceReflector) {
+ $traceReflector->setValue($e, $trace);
+ $e->file = $file ?? $e->file;
+ $e->line = $line ?? $e->line;
+ }, null, new class() extends \Exception {
+ });
+ $this->debug = $debug;
}
/**
* Sets a logger to non assigned errors levels.
*
* @param LoggerInterface $logger A PSR-3 logger to put as default for the given levels
- * @param array|int $levels An array map of E_* to LogLevel::* or an integer bit field of E_* constants
+ * @param array|int|null $levels An array map of E_* to LogLevel::* or an integer bit field of E_* constants
* @param bool $replace Whether to replace or not any existing logger
*/
- public function setDefaultLogger(LoggerInterface $logger, $levels = \E_ALL, $replace = false)
+ public function setDefaultLogger(LoggerInterface $logger, $levels = \E_ALL, bool $replace = false): void
{
$loggers = [];
@@ -210,7 +239,7 @@ class ErrorHandler
*
* @throws \InvalidArgumentException
*/
- public function setLoggers(array $loggers)
+ public function setLoggers(array $loggers): array
{
$prevLogged = $this->loggedErrors;
$prev = $this->loggers;
@@ -242,7 +271,7 @@ class ErrorHandler
if ($flush) {
foreach ($this->bootstrappingLogger->cleanLogs() as $log) {
- $type = $log[2]['exception'] instanceof \ErrorException ? $log[2]['exception']->getSeverity() : \E_ERROR;
+ $type = ThrowableUtils::getSeverity($log[2]['exception']);
if (!isset($flush[$type])) {
$this->bootstrappingLogger->log($log[0], $log[1], $log[2]);
} elseif ($this->loggers[$type][0]) {
@@ -257,11 +286,11 @@ class ErrorHandler
/**
* Sets a user exception handler.
*
- * @param callable $handler A handler that will be called on Exception
+ * @param callable(\Throwable $e)|null $handler
*
* @return callable|null The previous exception handler
*/
- public function setExceptionHandler(callable $handler = null)
+ public function setExceptionHandler(?callable $handler): ?callable
{
$prev = $this->exceptionHandler;
$this->exceptionHandler = $handler;
@@ -277,7 +306,7 @@ class ErrorHandler
*
* @return int The previous value
*/
- public function throwAt($levels, $replace = false)
+ public function throwAt(int $levels, bool $replace = false): int
{
$prev = $this->thrownErrors;
$this->thrownErrors = ($levels | \E_RECOVERABLE_ERROR | \E_USER_ERROR) & ~\E_USER_DEPRECATED & ~\E_DEPRECATED;
@@ -297,10 +326,10 @@ class ErrorHandler
*
* @return int The previous value
*/
- public function scopeAt($levels, $replace = false)
+ public function scopeAt(int $levels, bool $replace = false): int
{
$prev = $this->scopedErrors;
- $this->scopedErrors = (int) $levels;
+ $this->scopedErrors = $levels;
if (!$replace) {
$this->scopedErrors |= $prev;
}
@@ -316,10 +345,10 @@ class ErrorHandler
*
* @return int The previous value
*/
- public function traceAt($levels, $replace = false)
+ public function traceAt(int $levels, bool $replace = false): int
{
$prev = $this->tracedErrors;
- $this->tracedErrors = (int) $levels;
+ $this->tracedErrors = $levels;
if (!$replace) {
$this->tracedErrors |= $prev;
}
@@ -335,10 +364,10 @@ class ErrorHandler
*
* @return int The previous value
*/
- public function screamAt($levels, $replace = false)
+ public function screamAt(int $levels, bool $replace = false): int
{
$prev = $this->screamedErrors;
- $this->screamedErrors = (int) $levels;
+ $this->screamedErrors = $levels;
if (!$replace) {
$this->screamedErrors |= $prev;
}
@@ -349,7 +378,7 @@ class ErrorHandler
/**
* Re-registers as a PHP error handler if levels changed.
*/
- private function reRegister($prev)
+ private function reRegister(int $prev): void
{
if ($prev !== $this->thrownErrors | $this->loggedErrors) {
$handler = set_error_handler('var_dump');
@@ -369,18 +398,13 @@ class ErrorHandler
/**
* Handles errors by filtering then logging them according to the configured bit fields.
*
- * @param int $type One of the E_* constants
- * @param string $message
- * @param string $file
- * @param int $line
- *
* @return bool Returns false when no handling happens so that the PHP engine can handle the error itself
*
* @throws \ErrorException When $this->thrownErrors requests so
*
* @internal
*/
- public function handleError($type, $message, $file, $line)
+ public function handleError(int $type, string $message, string $file, int $line): bool
{
if (\PHP_VERSION_ID >= 70300 && \E_WARNING === $type && '"' === $message[0] && false !== strpos($message, '" targeting switch is equivalent to "break')) {
$type = \E_DEPRECATED;
@@ -395,32 +419,13 @@ class ErrorHandler
$throw = $this->thrownErrors & $type & $level;
$type &= $level | $this->screamedErrors;
+ // Never throw on warnings triggered by assert()
+ if (\E_WARNING === $type && 'a' === $message[0] && 0 === strncmp($message, 'assert(): ', 10)) {
+ $throw = 0;
+ }
+
if (!$type || (!$log && !$throw)) {
- return !$silenced && $type && $log;
- }
- $scope = $this->scopedErrors & $type;
-
- if (4 < $numArgs = \func_num_args()) {
- $context = func_get_arg(4) ?: [];
- $backtrace = 5 < $numArgs ? func_get_arg(5) : null; // defined on HHVM
- } else {
- $context = [];
- $backtrace = null;
- }
-
- if (isset($context['GLOBALS']) && $scope) {
- $e = $context; // Whatever the signature of the method,
- unset($e['GLOBALS'], $context); // $context is always a reference in 5.3
- $context = $e;
- }
-
- if (null !== $backtrace && $type & \E_ERROR) {
- // E_ERROR fatal errors are triggered on HHVM when
- // hhvm.error_handling.call_user_handler_on_fatals=1
- // which is the way to get their backtrace.
- $this->handleFatalError(compact('type', 'message', 'file', 'line', 'backtrace'));
-
- return true;
+ return false;
}
$logMessage = $this->levels[$type].': '.$message;
@@ -430,8 +435,8 @@ class ErrorHandler
self::$toStringException = null;
} elseif (!$throw && !($type & $level)) {
if (!isset(self::$silencedErrorCache[$id = $file.':'.$line])) {
- $lightTrace = $this->tracedErrors & $type ? $this->cleanTrace(debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 3), $type, $file, $line, false) : [];
- $errorAsException = new SilencedErrorContext($type, $file, $line, $lightTrace);
+ $lightTrace = $this->tracedErrors & $type ? $this->cleanTrace(debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 5), $type, $file, $line, false) : [];
+ $errorAsException = new SilencedErrorContext($type, $file, $line, isset($lightTrace[1]) ? [$lightTrace[0]] : $lightTrace);
} elseif (isset(self::$silencedErrorCache[$id][$message])) {
$lightTrace = null;
$errorAsException = self::$silencedErrorCache[$id][$message];
@@ -452,19 +457,32 @@ class ErrorHandler
return true;
}
} else {
- if ($scope) {
- $errorAsException = new ContextErrorException($logMessage, 0, $type, $file, $line, $context);
- } else {
- $errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line);
+ if (false !== strpos($message, '@anonymous')) {
+ $backtrace = debug_backtrace(false, 5);
+
+ for ($i = 1; isset($backtrace[$i]); ++$i) {
+ if (isset($backtrace[$i]['function'], $backtrace[$i]['args'][0])
+ && ('trigger_error' === $backtrace[$i]['function'] || 'user_error' === $backtrace[$i]['function'])
+ ) {
+ if ($backtrace[$i]['args'][0] !== $message) {
+ $message = $this->parseAnonymousClass($backtrace[$i]['args'][0]);
+ $logMessage = $this->levels[$type].': '.$message;
+ }
+
+ break;
+ }
+ }
}
- // Clean the trace by removing function arguments and the first frames added by the error handler itself.
+ $errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line);
+
if ($throw || $this->tracedErrors & $type) {
- $backtrace = $backtrace ?: $errorAsException->getTrace();
+ $backtrace = $errorAsException->getTrace();
$lightTrace = $this->cleanTrace($backtrace, $type, $file, $line, $throw);
- $this->traceReflector->setValue($errorAsException, $lightTrace);
+ ($this->configureException)($errorAsException, $lightTrace, $file, $line);
} else {
- $this->traceReflector->setValue($errorAsException, []);
+ ($this->configureException)($errorAsException, []);
+ $backtrace = [];
}
}
@@ -478,32 +496,27 @@ class ErrorHandler
&& ('trigger_error' === $backtrace[$i - 1]['function'] || 'user_error' === $backtrace[$i - 1]['function'])
) {
// Here, we know trigger_error() has been called from __toString().
- // HHVM is fine with throwing from __toString() but PHP triggers a fatal error instead.
+ // PHP triggers a fatal error when throwing from __toString().
// A small convention allows working around the limitation:
// given a caught $e exception in __toString(), quitting the method with
// `return trigger_error($e, E_USER_ERROR);` allows this error handler
// to make $e get through the __toString() barrier.
+ $context = 4 < \func_num_args() ? (func_get_arg(4) ?: []) : [];
+
foreach ($context as $e) {
- if (($e instanceof \Exception || $e instanceof \Throwable) && $e->__toString() === $message) {
- if (1 === $i) {
- // On HHVM
- $errorAsException = $e;
- break;
- }
+ if ($e instanceof \Throwable && $e->__toString() === $message) {
self::$toStringException = $e;
return true;
}
}
- if (1 < $i) {
- // On PHP (not on HHVM), display the original error message instead of the default one.
- $this->handleException($errorAsException);
+ // Display the original error message instead of the default one.
+ $this->handleException($errorAsException);
- // Stop the process by giving back the error to the native handler.
- return false;
- }
+ // Stop the process by giving back the error to the native handler.
+ return false;
}
}
}
@@ -513,15 +526,8 @@ class ErrorHandler
if ($this->isRecursive) {
$log = 0;
- } elseif (self::$stackedErrorLevels) {
- self::$stackedErrors[] = [
- $this->loggers[$type][0],
- ($type & $level) ? $this->loggers[$type][1] : LogLevel::DEBUG,
- $logMessage,
- $errorAsException ? ['exception' => $errorAsException] : [],
- ];
} else {
- if (\PHP_VERSION_ID < (\PHP_VERSION_ID < 70400 ? 70316 : 70404) && !\defined('HHVM_VERSION')) {
+ if (\PHP_VERSION_ID < (\PHP_VERSION_ID < 70400 ? 70316 : 70404)) {
$currentErrorHandler = set_error_handler('var_dump');
restore_error_handler();
}
@@ -533,7 +539,7 @@ class ErrorHandler
} finally {
$this->isRecursive = false;
- if (\PHP_VERSION_ID < (\PHP_VERSION_ID < 70400 ? 70316 : 70404) && !\defined('HHVM_VERSION')) {
+ if (\PHP_VERSION_ID < (\PHP_VERSION_ID < 70400 ? 70316 : 70404)) {
set_error_handler($currentErrorHandler);
}
}
@@ -545,82 +551,89 @@ class ErrorHandler
/**
* Handles an exception by logging then forwarding it to another handler.
*
- * @param \Exception|\Throwable $exception An exception to handle
- * @param array $error An array as returned by error_get_last()
- *
* @internal
*/
- public function handleException($exception, array $error = null)
+ public function handleException(\Throwable $exception)
{
- if (null === $error) {
- self::$exitCode = 255;
- }
- if (!$exception instanceof \Exception) {
- $exception = new FatalThrowableError($exception);
- }
- $type = $exception instanceof FatalErrorException ? $exception->getSeverity() : \E_ERROR;
$handlerException = null;
- if (($this->loggedErrors & $type) || $exception instanceof FatalThrowableError) {
- if ($exception instanceof FatalErrorException) {
- if ($exception instanceof FatalThrowableError) {
- $error = [
- 'type' => $type,
- 'message' => $message = $exception->getMessage(),
- 'file' => $exception->getFile(),
- 'line' => $exception->getLine(),
- ];
- } else {
- $message = 'Fatal '.$exception->getMessage();
- }
- } elseif ($exception instanceof \ErrorException) {
- $message = 'Uncaught '.$exception->getMessage();
- } else {
- $message = 'Uncaught Exception: '.$exception->getMessage();
- }
+ if (!$exception instanceof FatalError) {
+ self::$exitCode = 255;
+
+ $type = ThrowableUtils::getSeverity($exception);
+ } else {
+ $type = $exception->getError()['type'];
}
+
if ($this->loggedErrors & $type) {
+ if (false !== strpos($message = $exception->getMessage(), "@anonymous\0")) {
+ $message = $this->parseAnonymousClass($message);
+ }
+
+ if ($exception instanceof FatalError) {
+ $message = 'Fatal '.$message;
+ } elseif ($exception instanceof \Error) {
+ $message = 'Uncaught Error: '.$message;
+ } elseif ($exception instanceof \ErrorException) {
+ $message = 'Uncaught '.$message;
+ } else {
+ $message = 'Uncaught Exception: '.$message;
+ }
+
try {
$this->loggers[$type][0]->log($this->loggers[$type][1], $message, ['exception' => $exception]);
- } catch (\Exception $handlerException) {
} catch (\Throwable $handlerException) {
}
}
- if ($exception instanceof FatalErrorException && !$exception instanceof OutOfMemoryException && $error) {
- foreach ($this->getFatalErrorHandlers() as $handler) {
- if ($e = $handler->handleError($error, $exception)) {
+
+ if (!$exception instanceof OutOfMemoryError) {
+ foreach ($this->getErrorEnhancers() as $errorEnhancer) {
+ if ($e = $errorEnhancer->enhance($exception)) {
$exception = $e;
break;
}
}
}
+
$exceptionHandler = $this->exceptionHandler;
- $this->exceptionHandler = null;
+ $this->exceptionHandler = [$this, 'renderException'];
+
+ if (null === $exceptionHandler || $exceptionHandler === $this->exceptionHandler) {
+ $this->exceptionHandler = null;
+ }
+
try {
if (null !== $exceptionHandler) {
- $exceptionHandler($exception);
-
- return;
+ return $exceptionHandler($exception);
}
$handlerException = $handlerException ?: $exception;
- } catch (\Exception $handlerException) {
} catch (\Throwable $handlerException) {
}
- if ($exception === $handlerException) {
+ if ($exception === $handlerException && null === $this->exceptionHandler) {
self::$reservedMemory = null; // Disable the fatal error handler
throw $exception; // Give back $exception to the native handler
}
- $this->handleException($handlerException);
+
+ $loggedErrors = $this->loggedErrors;
+ if ($exception === $handlerException) {
+ $this->loggedErrors &= ~$type;
+ }
+
+ try {
+ $this->handleException($handlerException);
+ } finally {
+ $this->loggedErrors = $loggedErrors;
+ }
}
/**
* Shutdown registered function for handling PHP fatal errors.
*
- * @param array $error An array as returned by error_get_last()
+ * @param array|null $error An array as returned by error_get_last()
*
* @internal
*/
- public static function handleFatalError(array $error = null)
+ public static function handleFatalError(array $error = null): void
{
if (null === self::$reservedMemory) {
return;
@@ -664,34 +677,26 @@ class ErrorHandler
$error = error_get_last();
}
- try {
- while (self::$stackedErrorLevels) {
- static::unstackErrors();
- }
- } catch (\Exception $exception) {
- // Handled below
- } catch (\Throwable $exception) {
- // Handled below
- }
-
if ($error && $error['type'] &= \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR) {
// Let's not throw anymore but keep logging
$handler->throwAt(0, true);
- $trace = isset($error['backtrace']) ? $error['backtrace'] : null;
+ $trace = $error['backtrace'] ?? null;
if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) {
- $exception = new OutOfMemoryException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, false, $trace);
+ $fatalError = new OutOfMemoryError($handler->levels[$error['type']].': '.$error['message'], 0, $error, 2, false, $trace);
} else {
- $exception = new FatalErrorException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, true, $trace);
+ $fatalError = new FatalError($handler->levels[$error['type']].': '.$error['message'], 0, $error, 2, true, $trace);
}
+ } else {
+ $fatalError = null;
}
try {
- if (isset($exception)) {
+ if (null !== $fatalError) {
self::$exitCode = 255;
- $handler->handleException($exception, $error);
+ $handler->handleException($fatalError);
}
- } catch (FatalErrorException $e) {
+ } catch (FatalError $e) {
// Ignore this re-throw
}
@@ -702,71 +707,46 @@ class ErrorHandler
}
/**
- * Configures the error handler for delayed handling.
- * Ensures also that non-catchable fatal errors are never silenced.
+ * Renders the given exception.
*
- * As shown by http://bugs.php.net/42098 and http://bugs.php.net/60724
- * PHP has a compile stage where it behaves unusually. To workaround it,
- * we plug an error handler that only stacks errors for later.
- *
- * The most important feature of this is to prevent
- * autoloading until unstackErrors() is called.
- *
- * @deprecated since version 3.4, to be removed in 4.0.
+ * As this method is mainly called during boot where nothing is yet available,
+ * the output is always either HTML or CLI depending where PHP runs.
*/
- public static function stackErrors()
+ private function renderException(\Throwable $exception): void
{
- @trigger_error('Support for stacking errors is deprecated since Symfony 3.4 and will be removed in 4.0.', \E_USER_DEPRECATED);
+ $renderer = \in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) ? new CliErrorRenderer() : new HtmlErrorRenderer($this->debug);
- self::$stackedErrorLevels[] = error_reporting(error_reporting() | \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR);
- }
+ $exception = $renderer->render($exception);
- /**
- * Unstacks stacked errors and forwards to the logger.
- *
- * @deprecated since version 3.4, to be removed in 4.0.
- */
- public static function unstackErrors()
- {
- @trigger_error('Support for unstacking errors is deprecated since Symfony 3.4 and will be removed in 4.0.', \E_USER_DEPRECATED);
+ if (!headers_sent()) {
+ http_response_code($exception->getStatusCode());
- $level = array_pop(self::$stackedErrorLevels);
-
- if (null !== $level) {
- $errorReportingLevel = error_reporting($level);
- if ($errorReportingLevel !== ($level | \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR)) {
- // If the user changed the error level, do not overwrite it
- error_reporting($errorReportingLevel);
+ foreach ($exception->getHeaders() as $name => $value) {
+ header($name.': '.$value, false);
}
}
- if (empty(self::$stackedErrorLevels)) {
- $errors = self::$stackedErrors;
- self::$stackedErrors = [];
-
- foreach ($errors as $error) {
- $error[0]->log($error[1], $error[2], $error[3]);
- }
- }
+ echo $exception->getAsString();
}
/**
- * Gets the fatal error handlers.
+ * Override this method if you want to define more error enhancers.
*
- * Override this method if you want to define more fatal error handlers.
- *
- * @return FatalErrorHandlerInterface[] An array of FatalErrorHandlerInterface
+ * @return ErrorEnhancerInterface[]
*/
- protected function getFatalErrorHandlers()
+ protected function getErrorEnhancers(): iterable
{
return [
- new UndefinedFunctionFatalErrorHandler(),
- new UndefinedMethodFatalErrorHandler(),
- new ClassNotFoundFatalErrorHandler(),
+ new UndefinedFunctionErrorEnhancer(),
+ new UndefinedMethodErrorEnhancer(),
+ new ClassNotFoundErrorEnhancer(),
];
}
- private function cleanTrace($backtrace, $type, $file, $line, $throw)
+ /**
+ * Cleans the trace by removing function arguments and the frames added by the error handler and DebugClassLoader.
+ */
+ private function cleanTrace(array $backtrace, int $type, string &$file, int &$line, bool $throw): array
{
$lightTrace = $backtrace;
@@ -776,6 +756,26 @@ class ErrorHandler
break;
}
}
+ if (\E_USER_DEPRECATED === $type) {
+ for ($i = 0; isset($lightTrace[$i]); ++$i) {
+ if (!isset($lightTrace[$i]['file'], $lightTrace[$i]['line'], $lightTrace[$i]['function'])) {
+ continue;
+ }
+ if (!isset($lightTrace[$i]['class']) && 'trigger_deprecation' === $lightTrace[$i]['function']) {
+ $file = $lightTrace[$i]['file'];
+ $line = $lightTrace[$i]['line'];
+ $lightTrace = \array_slice($lightTrace, 1 + $i);
+ break;
+ }
+ }
+ }
+ if (class_exists(DebugClassLoader::class, false)) {
+ for ($i = \count($lightTrace) - 2; 0 < $i; --$i) {
+ if (DebugClassLoader::class === ($lightTrace[$i]['class'] ?? null)) {
+ array_splice($lightTrace, --$i, 2);
+ }
+ }
+ }
if (!($throw || $this->scopedErrors & $type)) {
for ($i = 0; isset($lightTrace[$i]); ++$i) {
unset($lightTrace[$i]['args'], $lightTrace[$i]['object']);
@@ -784,4 +784,15 @@ class ErrorHandler
return $lightTrace;
}
+
+ /**
+ * Parse the error message by removing the anonymous class notation
+ * and using the parent class instead if possible.
+ */
+ private function parseAnonymousClass(string $message): string
+ {
+ return preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', static function ($m) {
+ return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0];
+ }, $message);
+ }
}
diff --git a/lib/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php b/lib/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php
new file mode 100644
index 000000000..5c0f6a7dc
--- /dev/null
+++ b/lib/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php
@@ -0,0 +1,49 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\ErrorRenderer;
+
+use Symfony\Component\ErrorHandler\Exception\FlattenException;
+use Symfony\Component\VarDumper\Cloner\VarCloner;
+use Symfony\Component\VarDumper\Dumper\CliDumper;
+
+// Help opcache.preload discover always-needed symbols
+class_exists(CliDumper::class);
+
+/**
+ * @author Nicolas Grekas
+ */
+class CliErrorRenderer implements ErrorRendererInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function render(\Throwable $exception): FlattenException
+ {
+ $cloner = new VarCloner();
+ $dumper = new class() extends CliDumper {
+ protected function supportsColors(): bool
+ {
+ $outputStream = $this->outputStream;
+ $this->outputStream = fopen('php://stdout', 'w');
+
+ try {
+ return parent::supportsColors();
+ } finally {
+ $this->outputStream = $outputStream;
+ }
+ }
+ };
+
+ return FlattenException::createFromThrowable($exception)
+ ->setAsString($dumper->dump($cloner->cloneVar($exception), true));
+ }
+}
diff --git a/lib/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php b/lib/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php
new file mode 100644
index 000000000..aba196603
--- /dev/null
+++ b/lib/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\ErrorRenderer;
+
+use Symfony\Component\ErrorHandler\Exception\FlattenException;
+
+/**
+ * Formats an exception to be used as response content.
+ *
+ * @author Yonel Ceruto
+ */
+interface ErrorRendererInterface
+{
+ /**
+ * Renders a Throwable as a FlattenException.
+ */
+ public function render(\Throwable $exception): FlattenException;
+}
diff --git a/lib/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php b/lib/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php
new file mode 100644
index 000000000..dbd293565
--- /dev/null
+++ b/lib/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php
@@ -0,0 +1,367 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\ErrorRenderer;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\ErrorHandler\Exception\FlattenException;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
+use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+
+/**
+ * @author Yonel Ceruto
+ */
+class HtmlErrorRenderer implements ErrorRendererInterface
+{
+ private const GHOST_ADDONS = [
+ '02-14' => self::GHOST_HEART,
+ '02-29' => self::GHOST_PLUS,
+ '10-18' => self::GHOST_GIFT,
+ ];
+
+ private const GHOST_GIFT = 'M124.00534057617188,5.3606138080358505 C124.40059661865234,4.644828304648399 125.1237564086914,3.712414965033531 123.88127899169922,3.487462028861046 C123.53517150878906,3.3097832053899765 123.18894958496094,2.9953975528478622 122.8432846069336,3.345616325736046 C122.07421112060547,3.649444565176964 121.40750122070312,4.074306473135948 122.2164306640625,4.869479164481163 C122.57514953613281,5.3830065578222275 122.90142822265625,6.503447040915489 123.3077621459961,6.626829609274864 C123.55027770996094,6.210384353995323 123.7774658203125,5.785196766257286 124.00534057617188,5.3606138080358505 zM122.30630493164062,7.336987480521202 C121.60028076171875,6.076864704489708 121.03211975097656,4.72498320043087 120.16796875,3.562500938773155 C119.11695098876953,2.44033907353878 117.04605865478516,2.940566048026085 116.57544708251953,4.387995228171349 C115.95028686523438,5.819030746817589 117.2991714477539,7.527640804648399 118.826171875,7.348545059561729 C119.98493194580078,7.367936596274376 121.15027618408203,7.420116886496544 122.30630493164062,7.336987480521202 zM128.1732177734375,7.379541382193565 C129.67486572265625,7.17823551595211 130.53842163085938,5.287807449698448 129.68344116210938,4.032590612769127 C128.92578125,2.693056806921959 126.74605560302734,2.6463639587163925 125.98509216308594,4.007616028189659 C125.32617950439453,5.108129009604454 124.75428009033203,6.258124336600304 124.14962768554688,7.388818249106407 C125.48638916015625,7.465229496359825 126.8357162475586,7.447416767477989 128.1732177734375,7.379541382193565 zM130.6601104736328,8.991325363516808 C131.17202758789062,8.540884003043175 133.1543731689453,8.009847149252892 131.65304565429688,7.582054600119591 C131.2811279296875,7.476506695151329 130.84751892089844,6.99234913289547 130.5132598876953,7.124847874045372 C129.78744506835938,8.02728746831417 128.67140197753906,8.55669592320919 127.50616455078125,8.501235947012901 C127.27806091308594,8.576229080557823 126.11459350585938,8.38720129430294 126.428955078125,8.601900085806847 C127.25099182128906,9.070617660880089 128.0523223876953,9.579657539725304 128.902587890625,9.995706543326378 C129.49813842773438,9.678531631827354 130.0761260986328,9.329126343131065 130.6601104736328,8.991325363516808 zM118.96446990966797,9.246344551444054 C119.4022445678711,8.991325363516808 119.84001922607422,8.736305221915245 120.27779388427734,8.481284126639366 C118.93965911865234,8.414779648184776 117.40827941894531,8.607666000723839 116.39698791503906,7.531384453177452 C116.11186981201172,7.212117180228233 115.83845520019531,6.846597656607628 115.44329071044922,7.248530372977257 C114.96995544433594,7.574637398123741 113.5140609741211,7.908811077475548 114.63501739501953,8.306883797049522 C115.61112976074219,8.883499130606651 116.58037567138672,9.474181160330772 117.58061218261719,10.008124336600304 C118.05723571777344,9.784612640738487 118.50651550292969,9.5052699893713 118.96446990966797,9.246344551444054 zM125.38018035888672,12.091858848929405 C125.9474868774414,11.636047348380089 127.32159423828125,11.201767906546593 127.36749267578125,10.712632164359093 C126.08487701416016,9.974547371268272 124.83960723876953,9.152772888541222 123.49772644042969,8.528907760977745 C123.03594207763672,8.353693947196007 122.66152954101562,8.623294815421104 122.28982543945312,8.857431396842003 C121.19065856933594,9.51122473180294 120.06505584716797,10.12446115911007 119.00167083740234,10.835315689444542 C120.39238739013672,11.69529627263546 121.79983520507812,12.529837593436241 123.22095489501953,13.338589653372765 C123.94580841064453,12.932025894522667 124.66128540039062,12.508862480521202 125.38018035888672,12.091858848929405 zM131.07164001464844,13.514615997672081 C131.66018676757812,13.143282875418663 132.2487335205078,12.771927818655968 132.8372802734375,12.400571808218956 C132.8324737548828,11.156818374991417 132.8523406982422,9.912529930472374 132.81829833984375,8.669195160269737 C131.63046264648438,9.332009300589561 130.45948791503906,10.027913078665733 129.30828857421875,10.752535805106163 C129.182373046875,12.035354599356651 129.24623107910156,13.33940313756466 129.27359008789062,14.628684982657433 C129.88104248046875,14.27079389989376 130.4737548828125,13.888019546866417 131.07164001464844,13.514640793204308 zM117.26847839355469,12.731024727225304 C117.32825469970703,11.67083452641964 117.45709991455078,10.46224020421505 116.17853546142578,10.148179039359093 C115.37110900878906,9.77159021794796 114.25194549560547,8.806716904044151 113.62991333007812,8.81639002263546 C113.61052703857422,10.0110072940588 113.62078857421875,11.20585821568966 113.61869049072266,12.400571808218956 C114.81139373779297,13.144886955618858 115.98292541503906,13.925040230154991 117.20137023925781,14.626662239432335 C117.31951141357422,14.010867103934288 117.24227905273438,13.35805033147335 117.26847839355469,12.731024727225304 zM125.80937957763672,16.836034759879112 C126.51483917236328,16.390663132071495 127.22030639648438,15.945291504263878 127.92576599121094,15.49991987645626 C127.92250061035156,14.215868934988976 127.97560119628906,12.929980263113976 127.91757202148438,11.647302612662315 C127.14225769042969,11.869626984000206 126.25550079345703,12.556857094168663 125.43866729736328,12.983742699027061 C124.82704162597656,13.342005714774132 124.21542358398438,13.700271591544151 123.60379028320312,14.05853746831417 C123.61585235595703,15.429577812552452 123.57081604003906,16.803131088614464 123.64839172363281,18.172149643301964 C124.37957000732422,17.744937881827354 125.09130859375,17.284801468253136 125.80937957763672,16.836034759879112 zM122.8521499633789,16.115344032645226 C122.8521499633789,15.429741844534874 122.8521499633789,14.744139656424522 122.8521499633789,14.05853746831417 C121.43595123291016,13.230924591422081 120.02428436279297,12.395455345511436 118.60256958007812,11.577354416251183 C118.52394104003906,12.888403877615929 118.56887817382812,14.204405769705772 118.55702209472656,15.517732605338097 C119.97289276123047,16.4041957706213 121.37410736083984,17.314891800284386 122.80789947509766,18.172149643301964 C122.86368560791016,17.488990768790245 122.84332275390625,16.800363525748253 122.8521499633789,16.115344032645226 zM131.10684204101562,18.871450409293175 C131.68399047851562,18.48711584508419 132.2611541748047,18.10278509557247 132.8383026123047,17.718475326895714 C132.81423950195312,16.499977096915245 132.89776611328125,15.264989838004112 132.77627563476562,14.05993078649044 C131.5760040283203,14.744719490408897 130.41763305664062,15.524359688162804 129.23875427246094,16.255397781729698 C129.26707458496094,17.516149505972862 129.18060302734375,18.791316971182823 129.3108367919922,20.041303619742393 C129.91973876953125,19.667551025748253 130.51010131835938,19.264152511954308 131.10684204101562,18.871450409293175 zM117.2557373046875,18.188333496451378 C117.25104522705078,17.549470886588097 117.24633026123047,16.91058538854122 117.24163055419922,16.271720871329308 C116.04924774169922,15.525708183646202 114.87187957763672,14.75476549565792 113.66158294677734,14.038097366690636 C113.5858383178711,15.262084946036339 113.62901306152344,16.49083898961544 113.61761474609375,17.717010483145714 C114.82051086425781,18.513254150748253 116.00987243652344,19.330610260367393 117.22888946533203,20.101993545889854 C117.27559661865234,19.466014847159386 117.25241088867188,18.825733169913292 117.2557373046875,18.188333496451378 zM125.8398666381836,22.38675306737423 C126.54049682617188,21.921453461050987 127.24110412597656,21.456151947379112 127.94172668457031,20.99083136022091 C127.94009399414062,19.693386062979698 127.96646118164062,18.395381912589073 127.93160247802734,17.098379120230675 C126.50540924072266,17.97775076329708 125.08877563476562,18.873308166861534 123.68258666992188,19.78428266942501 C123.52366638183594,21.03710363805294 123.626708984375,22.32878302037716 123.62647247314453,23.595300659537315 C124.06291198730469,23.86113165318966 125.1788101196289,22.68297766149044 125.8398666381836,22.38675306737423 zM122.8521499633789,21.83134649693966 C122.76741790771484,20.936696991324425 123.21651458740234,19.67745779454708 122.0794677734375,19.330633148550987 C120.93280029296875,18.604360565543175 119.7907485961914,17.870157226920128 118.62899780273438,17.16818617284298 C118.45966339111328,18.396427139639854 118.63676452636719,19.675991043448448 118.50668334960938,20.919256195425987 C119.89984130859375,21.92635916173458 121.32942199707031,22.88914106786251 122.78502655029297,23.803510650992393 C122.90177917480469,23.1627406924963 122.82917022705078,22.48402212560177 122.8521499633789,21.83134649693966 zM117.9798355102539,21.59483526647091 C116.28416442871094,20.46288488805294 114.58848571777344,19.330957397818565 112.892822265625,18.199007019400597 C112.89473724365234,14.705654129385948 112.84647369384766,11.211485847830772 112.90847778320312,7.718807205557823 C113.7575912475586,7.194885239005089 114.66117858886719,6.765397056937218 115.5350341796875,6.284702762961388 C114.97061157226562,4.668964847922325 115.78496551513672,2.7054970115423203 117.42159271240234,2.1007001250982285 C118.79354095458984,1.537783369421959 120.44731903076172,2.0457767099142075 121.32200622558594,3.23083733022213 C121.95732116699219,2.9050118774175644 122.59264373779297,2.5791852325201035 123.22796630859375,2.253336176276207 C123.86669921875,2.5821153968572617 124.50543975830078,2.9108948558568954 125.1441650390625,3.23967407643795 C126.05941009521484,2.154020771384239 127.62747192382812,1.5344576686620712 128.986328125,2.1429056972265244 C130.61741638183594,2.716217741370201 131.50650024414062,4.675290569663048 130.9215545654297,6.2884936183691025 C131.8018341064453,6.78548763692379 132.7589111328125,7.1738648265600204 133.5660400390625,7.780336365103722 C133.60182189941406,11.252970680594444 133.56637573242188,14.726140961050987 133.5631103515625,18.199007019400597 C130.18914794921875,20.431867584586143 126.86984252929688,22.74994657933712 123.44108581542969,24.897907242178917 C122.44406127929688,24.897628769278526 121.5834732055664,23.815067276358604 120.65831756591797,23.37616156041622 C119.76387023925781,22.784828171133995 118.87168884277344,22.19007681310177 117.9798355102539,21.59483526647091 z';
+ private const GHOST_HEART = 'M125.91386369681868,8.305165958366445 C128.95033202169043,-0.40540639102854037 140.8469835342744,8.305165958366445 125.91386369681868,19.504526138305664 C110.98208663272044,8.305165958366445 122.87795231771452,-0.40540639102854037 125.91386369681868,8.305165958366445 z';
+ private const GHOST_PLUS = 'M111.36824226379395,8.969108581542969 L118.69175148010254,8.969108581542969 L118.69175148010254,1.6455793380737305 L126.20429420471191,1.6455793380737305 L126.20429420471191,8.969108581542969 L133.52781105041504,8.969108581542969 L133.52781105041504,16.481630325317383 L126.20429420471191,16.481630325317383 L126.20429420471191,23.805158615112305 L118.69175148010254,23.805158615112305 L118.69175148010254,16.481630325317383 L111.36824226379395,16.481630325317383 z';
+
+ private $debug;
+ private $charset;
+ private $fileLinkFormat;
+ private $projectDir;
+ private $outputBuffer;
+ private $logger;
+
+ private static $template = 'views/error.html.php';
+
+ /**
+ * @param bool|callable $debug The debugging mode as a boolean or a callable that should return it
+ * @param string|FileLinkFormatter|null $fileLinkFormat
+ * @param bool|callable $outputBuffer The output buffer as a string or a callable that should return it
+ */
+ public function __construct($debug = false, string $charset = null, $fileLinkFormat = null, string $projectDir = null, $outputBuffer = '', LoggerInterface $logger = null)
+ {
+ if (!\is_bool($debug) && !\is_callable($debug)) {
+ throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a boolean or a callable, "%s" given.', __METHOD__, \gettype($debug)));
+ }
+
+ if (!\is_string($outputBuffer) && !\is_callable($outputBuffer)) {
+ throw new \TypeError(sprintf('Argument 5 passed to "%s()" must be a string or a callable, "%s" given.', __METHOD__, \gettype($outputBuffer)));
+ }
+
+ $this->debug = $debug;
+ $this->charset = $charset ?: (ini_get('default_charset') ?: 'UTF-8');
+ $this->fileLinkFormat = $fileLinkFormat ?: (ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'));
+ $this->projectDir = $projectDir;
+ $this->outputBuffer = $outputBuffer;
+ $this->logger = $logger;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function render(\Throwable $exception): FlattenException
+ {
+ $headers = ['Content-Type' => 'text/html; charset='.$this->charset];
+ if (\is_bool($this->debug) ? $this->debug : ($this->debug)($exception)) {
+ $headers['X-Debug-Exception'] = rawurlencode($exception->getMessage());
+ $headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine();
+ }
+
+ $exception = FlattenException::createFromThrowable($exception, null, $headers);
+
+ return $exception->setAsString($this->renderException($exception));
+ }
+
+ /**
+ * Gets the HTML content associated with the given exception.
+ */
+ public function getBody(FlattenException $exception): string
+ {
+ return $this->renderException($exception, 'views/exception.html.php');
+ }
+
+ /**
+ * Gets the stylesheet associated with the given exception.
+ */
+ public function getStylesheet(): string
+ {
+ if (!$this->debug) {
+ return $this->include('assets/css/error.css');
+ }
+
+ return $this->include('assets/css/exception.css');
+ }
+
+ public static function isDebug(RequestStack $requestStack, bool $debug): \Closure
+ {
+ return static function () use ($requestStack, $debug): bool {
+ if (!$request = $requestStack->getCurrentRequest()) {
+ return $debug;
+ }
+
+ return $debug && $request->attributes->getBoolean('showException', true);
+ };
+ }
+
+ public static function getAndCleanOutputBuffer(RequestStack $requestStack): \Closure
+ {
+ return static function () use ($requestStack): string {
+ if (!$request = $requestStack->getCurrentRequest()) {
+ return '';
+ }
+
+ $startObLevel = $request->headers->get('X-Php-Ob-Level', -1);
+
+ if (ob_get_level() <= $startObLevel) {
+ return '';
+ }
+
+ Response::closeOutputBuffers($startObLevel + 1, true);
+
+ return ob_get_clean();
+ };
+ }
+
+ private function renderException(FlattenException $exception, string $debugTemplate = 'views/exception_full.html.php'): string
+ {
+ $debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception);
+ $statusText = $this->escape($exception->getStatusText());
+ $statusCode = $this->escape($exception->getStatusCode());
+
+ if (!$debug) {
+ return $this->include(self::$template, [
+ 'statusText' => $statusText,
+ 'statusCode' => $statusCode,
+ ]);
+ }
+
+ $exceptionMessage = $this->escape($exception->getMessage());
+
+ return $this->include($debugTemplate, [
+ 'exception' => $exception,
+ 'exceptionMessage' => $exceptionMessage,
+ 'statusText' => $statusText,
+ 'statusCode' => $statusCode,
+ 'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null,
+ 'currentContent' => \is_string($this->outputBuffer) ? $this->outputBuffer : ($this->outputBuffer)(),
+ ]);
+ }
+
+ /**
+ * Formats an array as a string.
+ */
+ private function formatArgs(array $args): string
+ {
+ $result = [];
+ foreach ($args as $key => $item) {
+ if ('object' === $item[0]) {
+ $formattedValue = sprintf('object (%s)', $this->abbrClass($item[1]));
+ } elseif ('array' === $item[0]) {
+ $formattedValue = sprintf('array (%s)', \is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
+ } elseif ('null' === $item[0]) {
+ $formattedValue = 'null ';
+ } elseif ('boolean' === $item[0]) {
+ $formattedValue = ''.strtolower(var_export($item[1], true)).' ';
+ } elseif ('resource' === $item[0]) {
+ $formattedValue = 'resource ';
+ } else {
+ $formattedValue = str_replace("\n", '', $this->escape(var_export($item[1], true)));
+ }
+
+ $result[] = \is_int($key) ? $formattedValue : sprintf("'%s' => %s", $this->escape($key), $formattedValue);
+ }
+
+ return implode(', ', $result);
+ }
+
+ private function formatArgsAsText(array $args)
+ {
+ return strip_tags($this->formatArgs($args));
+ }
+
+ private function escape(string $string): string
+ {
+ return htmlspecialchars($string, \ENT_COMPAT | \ENT_SUBSTITUTE, $this->charset);
+ }
+
+ private function abbrClass(string $class): string
+ {
+ $parts = explode('\\', $class);
+ $short = array_pop($parts);
+
+ return sprintf('%s ', $class, $short);
+ }
+
+ private function getFileRelative(string $file): ?string
+ {
+ $file = str_replace('\\', '/', $file);
+
+ if (null !== $this->projectDir && 0 === strpos($file, $this->projectDir)) {
+ return ltrim(substr($file, \strlen($this->projectDir)), '/');
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the link for a given file/line pair.
+ *
+ * @return string|false
+ */
+ private function getFileLink(string $file, int $line)
+ {
+ if ($fmt = $this->fileLinkFormat) {
+ return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line);
+ }
+
+ return false;
+ }
+
+ /**
+ * Formats a file path.
+ *
+ * @param string $file An absolute file path
+ * @param int $line The line number
+ * @param string $text Use this text for the link rather than the file path
+ */
+ private function formatFile(string $file, int $line, string $text = null): string
+ {
+ $file = trim($file);
+
+ if (null === $text) {
+ $text = $file;
+ if (null !== $rel = $this->getFileRelative($text)) {
+ $rel = explode('/', $rel, 2);
+ $text = sprintf('%s %s', $this->projectDir, $rel[0], '/'.($rel[1] ?? ''));
+ }
+ }
+
+ if (0 < $line) {
+ $text .= ' at line '.$line;
+ }
+
+ if (false !== $link = $this->getFileLink($file, $line)) {
+ return sprintf('%s ', $this->escape($link), $text);
+ }
+
+ return $text;
+ }
+
+ /**
+ * Returns an excerpt of a code file around the given line number.
+ *
+ * @param string $file A file path
+ * @param int $line The selected line number
+ * @param int $srcContext The number of displayed lines around or -1 for the whole file
+ */
+ private function fileExcerpt(string $file, int $line, int $srcContext = 3): string
+ {
+ if (is_file($file) && is_readable($file)) {
+ // highlight_file could throw warnings
+ // see https://bugs.php.net/25725
+ $code = @highlight_file($file, true);
+ // remove main code/span tags
+ $code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code);
+ // split multiline spans
+ $code = preg_replace_callback('#]++)>((?:[^<]*+ )++[^<]*+) #', function ($m) {
+ return "".str_replace(' ', " ", $m[2]).' ';
+ }, $code);
+ $content = explode(' ', $code);
+
+ $lines = [];
+ if (0 > $srcContext) {
+ $srcContext = \count($content);
+ }
+
+ for ($i = max($line - $srcContext, 1), $max = min($line + $srcContext, \count($content)); $i <= $max; ++$i) {
+ $lines[] = ''.$this->fixCodeMarkup($content[$i - 1]).' ';
+ }
+
+ return ''.implode("\n", $lines).' ';
+ }
+
+ return '';
+ }
+
+ private function fixCodeMarkup(string $line)
+ {
+ // ending tag from previous line
+ $opening = strpos($line, '');
+ if (false !== $closing && (false === $opening || $closing < $opening)) {
+ $line = substr_replace($line, '', $closing, 7);
+ }
+
+ // missing tag at the end of line
+ $opening = strrpos($line, '');
+ if (false !== $opening && (false === $closing || $closing < $opening)) {
+ $line .= ' ';
+ }
+
+ return trim($line);
+ }
+
+ private function formatFileFromText(string $text)
+ {
+ return preg_replace_callback('/in ("|")?(.+?)\1(?: +(?:on|at))? +line (\d+)/s', function ($match) {
+ return 'in '.$this->formatFile($match[2], $match[3]);
+ }, $text);
+ }
+
+ private function formatLogMessage(string $message, array $context)
+ {
+ if ($context && false !== strpos($message, '{')) {
+ $replacements = [];
+ foreach ($context as $key => $val) {
+ if (is_scalar($val)) {
+ $replacements['{'.$key.'}'] = $val;
+ }
+ }
+
+ if ($replacements) {
+ $message = strtr($message, $replacements);
+ }
+ }
+
+ return $this->escape($message);
+ }
+
+ private function addElementToGhost(): string
+ {
+ if (!isset(self::GHOST_ADDONS[date('m-d')])) {
+ return '';
+ }
+
+ return ' ';
+ }
+
+ private function include(string $name, array $context = []): string
+ {
+ extract($context, \EXTR_SKIP);
+ ob_start();
+
+ include is_file(\dirname(__DIR__).'/Resources/'.$name) ? \dirname(__DIR__).'/Resources/'.$name : $name;
+
+ return trim(ob_get_clean());
+ }
+
+ /**
+ * Allows overriding the default non-debug template.
+ *
+ * @param string $template path to the custom template file to render
+ */
+ public static function setTemplate(string $template): void
+ {
+ self::$template = $template;
+ }
+}
diff --git a/lib/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php b/lib/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php
new file mode 100644
index 000000000..cec8e4d41
--- /dev/null
+++ b/lib/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php
@@ -0,0 +1,94 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\ErrorRenderer;
+
+use Symfony\Component\ErrorHandler\Exception\FlattenException;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\Serializer\Exception\NotEncodableValueException;
+use Symfony\Component\Serializer\SerializerInterface;
+
+/**
+ * Formats an exception using Serializer for rendering.
+ *
+ * @author Nicolas Grekas
+ */
+class SerializerErrorRenderer implements ErrorRendererInterface
+{
+ private $serializer;
+ private $format;
+ private $fallbackErrorRenderer;
+ private $debug;
+
+ /**
+ * @param string|callable(FlattenException) $format The format as a string or a callable that should return it
+ * formats not supported by Request::getMimeTypes() should be given as mime types
+ * @param bool|callable $debug The debugging mode as a boolean or a callable that should return it
+ */
+ public function __construct(SerializerInterface $serializer, $format, ErrorRendererInterface $fallbackErrorRenderer = null, $debug = false)
+ {
+ if (!\is_string($format) && !\is_callable($format)) {
+ throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be a string or a callable, "%s" given.', __METHOD__, \gettype($format)));
+ }
+
+ if (!\is_bool($debug) && !\is_callable($debug)) {
+ throw new \TypeError(sprintf('Argument 4 passed to "%s()" must be a boolean or a callable, "%s" given.', __METHOD__, \gettype($debug)));
+ }
+
+ $this->serializer = $serializer;
+ $this->format = $format;
+ $this->fallbackErrorRenderer = $fallbackErrorRenderer ?? new HtmlErrorRenderer();
+ $this->debug = $debug;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function render(\Throwable $exception): FlattenException
+ {
+ $headers = [];
+ $debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception);
+ if ($debug) {
+ $headers['X-Debug-Exception'] = rawurlencode($exception->getMessage());
+ $headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine();
+ }
+
+ $flattenException = FlattenException::createFromThrowable($exception, null, $headers);
+
+ try {
+ $format = \is_string($this->format) ? $this->format : ($this->format)($flattenException);
+ $headers = [
+ 'Content-Type' => Request::getMimeTypes($format)[0] ?? $format,
+ 'Vary' => 'Accept',
+ ];
+
+ return $flattenException->setAsString($this->serializer->serialize($flattenException, $format, [
+ 'exception' => $exception,
+ 'debug' => $debug,
+ ]))
+ ->setHeaders($flattenException->getHeaders() + $headers);
+ } catch (NotEncodableValueException $e) {
+ return $this->fallbackErrorRenderer->render($exception);
+ }
+ }
+
+ public static function getPreferredFormat(RequestStack $requestStack): \Closure
+ {
+ return static function () use ($requestStack) {
+ if (!$request = $requestStack->getCurrentRequest()) {
+ throw new NotEncodableValueException();
+ }
+
+ return $request->getPreferredFormat();
+ };
+ }
+}
diff --git a/lib/symfony/error-handler/Exception/FlattenException.php b/lib/symfony/error-handler/Exception/FlattenException.php
new file mode 100644
index 000000000..262dae62b
--- /dev/null
+++ b/lib/symfony/error-handler/Exception/FlattenException.php
@@ -0,0 +1,427 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\Exception;
+
+use Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
+
+/**
+ * FlattenException wraps a PHP Error or Exception to be able to serialize it.
+ *
+ * Basically, this class removes all objects from the trace.
+ *
+ * @author Fabien Potencier
+ */
+class FlattenException
+{
+ /** @var string */
+ private $message;
+
+ /** @var int|string */
+ private $code;
+
+ /** @var self|null */
+ private $previous;
+
+ /** @var array */
+ private $trace;
+
+ /** @var string */
+ private $traceAsString;
+
+ /** @var string */
+ private $class;
+
+ /** @var int */
+ private $statusCode;
+
+ /** @var string */
+ private $statusText;
+
+ /** @var array */
+ private $headers;
+
+ /** @var string */
+ private $file;
+
+ /** @var int */
+ private $line;
+
+ /** @var string|null */
+ private $asString;
+
+ /**
+ * @return static
+ */
+ public static function create(\Exception $exception, int $statusCode = null, array $headers = []): self
+ {
+ return static::createFromThrowable($exception, $statusCode, $headers);
+ }
+
+ /**
+ * @return static
+ */
+ public static function createFromThrowable(\Throwable $exception, int $statusCode = null, array $headers = []): self
+ {
+ $e = new static();
+ $e->setMessage($exception->getMessage());
+ $e->setCode($exception->getCode());
+
+ if ($exception instanceof HttpExceptionInterface) {
+ $statusCode = $exception->getStatusCode();
+ $headers = array_merge($headers, $exception->getHeaders());
+ } elseif ($exception instanceof RequestExceptionInterface) {
+ $statusCode = 400;
+ }
+
+ if (null === $statusCode) {
+ $statusCode = 500;
+ }
+
+ if (class_exists(Response::class) && isset(Response::$statusTexts[$statusCode])) {
+ $statusText = Response::$statusTexts[$statusCode];
+ } else {
+ $statusText = 'Whoops, looks like something went wrong.';
+ }
+
+ $e->setStatusText($statusText);
+ $e->setStatusCode($statusCode);
+ $e->setHeaders($headers);
+ $e->setTraceFromThrowable($exception);
+ $e->setClass(\get_class($exception));
+ $e->setFile($exception->getFile());
+ $e->setLine($exception->getLine());
+
+ $previous = $exception->getPrevious();
+
+ if ($previous instanceof \Throwable) {
+ $e->setPrevious(static::createFromThrowable($previous));
+ }
+
+ return $e;
+ }
+
+ public function toArray(): array
+ {
+ $exceptions = [];
+ foreach (array_merge([$this], $this->getAllPrevious()) as $exception) {
+ $exceptions[] = [
+ 'message' => $exception->getMessage(),
+ 'class' => $exception->getClass(),
+ 'trace' => $exception->getTrace(),
+ ];
+ }
+
+ return $exceptions;
+ }
+
+ public function getStatusCode(): int
+ {
+ return $this->statusCode;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setStatusCode(int $code): self
+ {
+ $this->statusCode = $code;
+
+ return $this;
+ }
+
+ public function getHeaders(): array
+ {
+ return $this->headers;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setHeaders(array $headers): self
+ {
+ $this->headers = $headers;
+
+ return $this;
+ }
+
+ public function getClass(): string
+ {
+ return $this->class;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setClass(string $class): self
+ {
+ $this->class = false !== strpos($class, "@anonymous\0") ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : $class;
+
+ return $this;
+ }
+
+ public function getFile(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setFile(string $file): self
+ {
+ $this->file = $file;
+
+ return $this;
+ }
+
+ public function getLine(): int
+ {
+ return $this->line;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setLine(int $line): self
+ {
+ $this->line = $line;
+
+ return $this;
+ }
+
+ public function getStatusText(): string
+ {
+ return $this->statusText;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setStatusText(string $statusText): self
+ {
+ $this->statusText = $statusText;
+
+ return $this;
+ }
+
+ public function getMessage(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setMessage(string $message): self
+ {
+ if (false !== strpos($message, "@anonymous\0")) {
+ $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) {
+ return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0];
+ }, $message);
+ }
+
+ $this->message = $message;
+
+ return $this;
+ }
+
+ /**
+ * @return int|string int most of the time (might be a string with PDOException)
+ */
+ public function getCode()
+ {
+ return $this->code;
+ }
+
+ /**
+ * @param int|string $code
+ *
+ * @return $this
+ */
+ public function setCode($code): self
+ {
+ $this->code = $code;
+
+ return $this;
+ }
+
+ public function getPrevious(): ?self
+ {
+ return $this->previous;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setPrevious(?self $previous): self
+ {
+ $this->previous = $previous;
+
+ return $this;
+ }
+
+ /**
+ * @return self[]
+ */
+ public function getAllPrevious(): array
+ {
+ $exceptions = [];
+ $e = $this;
+ while ($e = $e->getPrevious()) {
+ $exceptions[] = $e;
+ }
+
+ return $exceptions;
+ }
+
+ public function getTrace(): array
+ {
+ return $this->trace;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setTraceFromThrowable(\Throwable $throwable): self
+ {
+ $this->traceAsString = $throwable->getTraceAsString();
+
+ return $this->setTrace($throwable->getTrace(), $throwable->getFile(), $throwable->getLine());
+ }
+
+ /**
+ * @return $this
+ */
+ public function setTrace(array $trace, ?string $file, ?int $line): self
+ {
+ $this->trace = [];
+ $this->trace[] = [
+ 'namespace' => '',
+ 'short_class' => '',
+ 'class' => '',
+ 'type' => '',
+ 'function' => '',
+ 'file' => $file,
+ 'line' => $line,
+ 'args' => [],
+ ];
+ foreach ($trace as $entry) {
+ $class = '';
+ $namespace = '';
+ if (isset($entry['class'])) {
+ $parts = explode('\\', $entry['class']);
+ $class = array_pop($parts);
+ $namespace = implode('\\', $parts);
+ }
+
+ $this->trace[] = [
+ 'namespace' => $namespace,
+ 'short_class' => $class,
+ 'class' => $entry['class'] ?? '',
+ 'type' => $entry['type'] ?? '',
+ 'function' => $entry['function'] ?? null,
+ 'file' => $entry['file'] ?? null,
+ 'line' => $entry['line'] ?? null,
+ 'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : [],
+ ];
+ }
+
+ return $this;
+ }
+
+ private function flattenArgs(array $args, int $level = 0, int &$count = 0): array
+ {
+ $result = [];
+ foreach ($args as $key => $value) {
+ if (++$count > 1e4) {
+ return ['array', '*SKIPPED over 10000 entries*'];
+ }
+ if ($value instanceof \__PHP_Incomplete_Class) {
+ $result[$key] = ['incomplete-object', $this->getClassNameFromIncomplete($value)];
+ } elseif (\is_object($value)) {
+ $result[$key] = ['object', \get_class($value)];
+ } elseif (\is_array($value)) {
+ if ($level > 10) {
+ $result[$key] = ['array', '*DEEP NESTED ARRAY*'];
+ } else {
+ $result[$key] = ['array', $this->flattenArgs($value, $level + 1, $count)];
+ }
+ } elseif (null === $value) {
+ $result[$key] = ['null', null];
+ } elseif (\is_bool($value)) {
+ $result[$key] = ['boolean', $value];
+ } elseif (\is_int($value)) {
+ $result[$key] = ['integer', $value];
+ } elseif (\is_float($value)) {
+ $result[$key] = ['float', $value];
+ } elseif (\is_resource($value)) {
+ $result[$key] = ['resource', get_resource_type($value)];
+ } else {
+ $result[$key] = ['string', (string) $value];
+ }
+ }
+
+ return $result;
+ }
+
+ private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value): string
+ {
+ $array = new \ArrayObject($value);
+
+ return $array['__PHP_Incomplete_Class_Name'];
+ }
+
+ public function getTraceAsString(): string
+ {
+ return $this->traceAsString;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setAsString(?string $asString): self
+ {
+ $this->asString = $asString;
+
+ return $this;
+ }
+
+ public function getAsString(): string
+ {
+ if (null !== $this->asString) {
+ return $this->asString;
+ }
+
+ $message = '';
+ $next = false;
+
+ foreach (array_reverse(array_merge([$this], $this->getAllPrevious())) as $exception) {
+ if ($next) {
+ $message .= 'Next ';
+ } else {
+ $next = true;
+ }
+ $message .= $exception->getClass();
+
+ if ('' != $exception->getMessage()) {
+ $message .= ': '.$exception->getMessage();
+ }
+
+ $message .= ' in '.$exception->getFile().':'.$exception->getLine().
+ "\nStack trace:\n".$exception->getTraceAsString()."\n\n";
+ }
+
+ return rtrim($message);
+ }
+}
diff --git a/lib/symfony/debug/Exception/SilencedErrorContext.php b/lib/symfony/error-handler/Exception/SilencedErrorContext.php
similarity index 75%
rename from lib/symfony/debug/Exception/SilencedErrorContext.php
rename to lib/symfony/error-handler/Exception/SilencedErrorContext.php
index 2bacfd5c9..18defc72c 100644
--- a/lib/symfony/debug/Exception/SilencedErrorContext.php
+++ b/lib/symfony/error-handler/Exception/SilencedErrorContext.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\Debug\Exception;
+namespace Symfony\Component\ErrorHandler\Exception;
/**
* Data Object that represents a Silenced Error.
@@ -25,7 +25,7 @@ class SilencedErrorContext implements \JsonSerializable
private $line;
private $trace;
- public function __construct($severity, $file, $line, array $trace = [], $count = 1)
+ public function __construct(int $severity, string $file, int $line, array $trace = [], int $count = 1)
{
$this->severity = $severity;
$this->file = $file;
@@ -34,27 +34,27 @@ class SilencedErrorContext implements \JsonSerializable
$this->count = $count;
}
- public function getSeverity()
+ public function getSeverity(): int
{
return $this->severity;
}
- public function getFile()
+ public function getFile(): string
{
return $this->file;
}
- public function getLine()
+ public function getLine(): int
{
return $this->line;
}
- public function getTrace()
+ public function getTrace(): array
{
return $this->trace;
}
- public function jsonSerialize()
+ public function jsonSerialize(): array
{
return [
'severity' => $this->severity,
diff --git a/lib/symfony/error-handler/Internal/TentativeTypes.php b/lib/symfony/error-handler/Internal/TentativeTypes.php
new file mode 100644
index 000000000..2168a1c07
--- /dev/null
+++ b/lib/symfony/error-handler/Internal/TentativeTypes.php
@@ -0,0 +1,1642 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\Internal;
+
+/**
+ * This class has been generated by extract-tentative-return-types.php.
+ *
+ * @internal
+ */
+class TentativeTypes
+{
+ public const RETURN_TYPES = [
+ 'CURLFile' => [
+ 'getFilename' => 'string',
+ 'getMimeType' => 'string',
+ 'getPostFilename' => 'string',
+ 'setMimeType' => 'void',
+ 'setPostFilename' => 'void',
+ ],
+ 'DateTimeInterface' => [
+ 'format' => 'string',
+ 'getTimezone' => 'DateTimeZone|false',
+ 'getOffset' => 'int',
+ 'getTimestamp' => 'int',
+ 'diff' => 'DateInterval',
+ '__wakeup' => 'void',
+ ],
+ 'DateTime' => [
+ '__wakeup' => 'void',
+ '__set_state' => 'DateTime',
+ 'createFromImmutable' => 'static',
+ 'createFromFormat' => 'DateTime|false',
+ 'getLastErrors' => 'array|false',
+ 'format' => 'string',
+ 'modify' => 'DateTime|false',
+ 'add' => 'DateTime',
+ 'sub' => 'DateTime',
+ 'getTimezone' => 'DateTimeZone|false',
+ 'setTimezone' => 'DateTime',
+ 'getOffset' => 'int',
+ 'setTime' => 'DateTime',
+ 'setDate' => 'DateTime',
+ 'setISODate' => 'DateTime',
+ 'setTimestamp' => 'DateTime',
+ 'getTimestamp' => 'int',
+ 'diff' => 'DateInterval',
+ ],
+ 'DateTimeImmutable' => [
+ '__wakeup' => 'void',
+ '__set_state' => 'DateTimeImmutable',
+ 'createFromFormat' => 'DateTimeImmutable|false',
+ 'getLastErrors' => 'array|false',
+ 'format' => 'string',
+ 'getTimezone' => 'DateTimeZone|false',
+ 'getOffset' => 'int',
+ 'getTimestamp' => 'int',
+ 'diff' => 'DateInterval',
+ 'modify' => 'DateTimeImmutable|false',
+ 'add' => 'DateTimeImmutable',
+ 'sub' => 'DateTimeImmutable',
+ 'setTimezone' => 'DateTimeImmutable',
+ 'setTime' => 'DateTimeImmutable',
+ 'setDate' => 'DateTimeImmutable',
+ 'setISODate' => 'DateTimeImmutable',
+ 'setTimestamp' => 'DateTimeImmutable',
+ 'createFromMutable' => 'static',
+ ],
+ 'DateTimeZone' => [
+ 'getName' => 'string',
+ 'getOffset' => 'int',
+ 'getTransitions' => 'array|false',
+ 'getLocation' => 'array|false',
+ 'listAbbreviations' => 'array',
+ 'listIdentifiers' => 'array',
+ '__wakeup' => 'void',
+ '__set_state' => 'DateTimeZone',
+ ],
+ 'DateInterval' => [
+ 'createFromDateString' => 'DateInterval|false',
+ 'format' => 'string',
+ '__wakeup' => 'void',
+ '__set_state' => 'DateInterval',
+ ],
+ 'DatePeriod' => [
+ 'getStartDate' => 'DateTimeInterface',
+ 'getEndDate' => '?DateTimeInterface',
+ 'getDateInterval' => 'DateInterval',
+ 'getRecurrences' => '?int',
+ '__wakeup' => 'void',
+ '__set_state' => 'DatePeriod',
+ ],
+ 'DOMNode' => [
+ 'C14N' => 'string|false',
+ 'C14NFile' => 'int|false',
+ 'getLineNo' => 'int',
+ 'getNodePath' => '?string',
+ 'hasAttributes' => 'bool',
+ 'hasChildNodes' => 'bool',
+ 'isDefaultNamespace' => 'bool',
+ 'isSameNode' => 'bool',
+ 'isSupported' => 'bool',
+ 'lookupNamespaceURI' => '?string',
+ 'lookupPrefix' => '?string',
+ 'normalize' => 'void',
+ ],
+ 'DOMImplementation' => [
+ 'getFeature' => 'never',
+ 'hasFeature' => 'bool',
+ ],
+ 'DOMDocumentFragment' => [
+ 'appendXML' => 'bool',
+ ],
+ 'DOMNodeList' => [
+ 'count' => 'int',
+ ],
+ 'DOMCharacterData' => [
+ 'appendData' => 'bool',
+ 'insertData' => 'bool',
+ 'deleteData' => 'bool',
+ 'replaceData' => 'bool',
+ ],
+ 'DOMAttr' => [
+ 'isId' => 'bool',
+ ],
+ 'DOMElement' => [
+ 'getAttribute' => 'string',
+ 'getAttributeNS' => 'string',
+ 'getElementsByTagName' => 'DOMNodeList',
+ 'getElementsByTagNameNS' => 'DOMNodeList',
+ 'hasAttribute' => 'bool',
+ 'hasAttributeNS' => 'bool',
+ 'removeAttribute' => 'bool',
+ 'removeAttributeNS' => 'void',
+ 'setAttributeNS' => 'void',
+ 'setIdAttribute' => 'void',
+ 'setIdAttributeNS' => 'void',
+ 'setIdAttributeNode' => 'void',
+ ],
+ 'DOMDocument' => [
+ 'createComment' => 'DOMComment',
+ 'createDocumentFragment' => 'DOMDocumentFragment',
+ 'createTextNode' => 'DOMText',
+ 'getElementById' => '?DOMElement',
+ 'getElementsByTagName' => 'DOMNodeList',
+ 'getElementsByTagNameNS' => 'DOMNodeList',
+ 'normalizeDocument' => 'void',
+ 'registerNodeClass' => 'bool',
+ 'save' => 'int|false',
+ 'saveHTML' => 'string|false',
+ 'saveHTMLFile' => 'int|false',
+ 'saveXML' => 'string|false',
+ 'schemaValidate' => 'bool',
+ 'schemaValidateSource' => 'bool',
+ 'relaxNGValidate' => 'bool',
+ 'relaxNGValidateSource' => 'bool',
+ 'validate' => 'bool',
+ 'xinclude' => 'int|false',
+ ],
+ 'DOMText' => [
+ 'isWhitespaceInElementContent' => 'bool',
+ 'isElementContentWhitespace' => 'bool',
+ ],
+ 'DOMNamedNodeMap' => [
+ 'getNamedItem' => '?DOMNode',
+ 'getNamedItemNS' => '?DOMNode',
+ 'item' => '?DOMNode',
+ 'count' => 'int',
+ ],
+ 'DOMXPath' => [
+ 'evaluate' => 'mixed',
+ 'query' => 'mixed',
+ 'registerNamespace' => 'bool',
+ 'registerPhpFunctions' => 'void',
+ ],
+ 'finfo' => [
+ 'file' => 'string|false',
+ 'buffer' => 'string|false',
+ ],
+ 'IntlPartsIterator' => [
+ 'getBreakIterator' => 'IntlBreakIterator',
+ 'getRuleStatus' => 'int',
+ ],
+ 'IntlBreakIterator' => [
+ 'createCharacterInstance' => '?IntlBreakIterator',
+ 'createCodePointInstance' => 'IntlCodePointBreakIterator',
+ 'createLineInstance' => '?IntlBreakIterator',
+ 'createSentenceInstance' => '?IntlBreakIterator',
+ 'createTitleInstance' => '?IntlBreakIterator',
+ 'createWordInstance' => '?IntlBreakIterator',
+ 'current' => 'int',
+ 'first' => 'int',
+ 'following' => 'int',
+ 'getErrorCode' => 'int',
+ 'getErrorMessage' => 'string',
+ 'getLocale' => 'string|false',
+ 'getPartsIterator' => 'IntlPartsIterator',
+ 'getText' => '?string',
+ 'isBoundary' => 'bool',
+ 'last' => 'int',
+ 'next' => 'int',
+ 'preceding' => 'int',
+ 'previous' => 'int',
+ 'setText' => '?bool',
+ ],
+ 'IntlRuleBasedBreakIterator' => [
+ 'getBinaryRules' => 'string|false',
+ 'getRules' => 'string|false',
+ 'getRuleStatus' => 'int',
+ 'getRuleStatusVec' => 'array|false',
+ ],
+ 'IntlCodePointBreakIterator' => [
+ 'getLastCodePoint' => 'int',
+ ],
+ 'IntlCalendar' => [
+ 'createInstance' => '?IntlCalendar',
+ 'equals' => 'bool',
+ 'fieldDifference' => 'int|false',
+ 'add' => 'bool',
+ 'after' => 'bool',
+ 'before' => 'bool',
+ 'fromDateTime' => '?IntlCalendar',
+ 'get' => 'int|false',
+ 'getActualMaximum' => 'int|false',
+ 'getActualMinimum' => 'int|false',
+ 'getAvailableLocales' => 'array',
+ 'getDayOfWeekType' => 'int|false',
+ 'getErrorCode' => 'int|false',
+ 'getErrorMessage' => 'string|false',
+ 'getFirstDayOfWeek' => 'int|false',
+ 'getGreatestMinimum' => 'int|false',
+ 'getKeywordValuesForLocale' => 'IntlIterator|false',
+ 'getLeastMaximum' => 'int|false',
+ 'getLocale' => 'string|false',
+ 'getMaximum' => 'int|false',
+ 'getMinimalDaysInFirstWeek' => 'int|false',
+ 'getMinimum' => 'int|false',
+ 'getNow' => 'float',
+ 'getRepeatedWallTimeOption' => 'int',
+ 'getSkippedWallTimeOption' => 'int',
+ 'getTime' => 'float|false',
+ 'getTimeZone' => 'IntlTimeZone|false',
+ 'getType' => 'string',
+ 'getWeekendTransition' => 'int|false',
+ 'inDaylightTime' => 'bool',
+ 'isEquivalentTo' => 'bool',
+ 'isLenient' => 'bool',
+ 'isWeekend' => 'bool',
+ 'roll' => 'bool',
+ 'isSet' => 'bool',
+ 'setTime' => 'bool',
+ 'setTimeZone' => 'bool',
+ 'toDateTime' => 'DateTime|false',
+ ],
+ 'IntlGregorianCalendar' => [
+ 'setGregorianChange' => 'bool',
+ 'getGregorianChange' => 'float',
+ 'isLeapYear' => 'bool',
+ ],
+ 'Collator' => [
+ 'create' => '?Collator',
+ 'compare' => 'int|false',
+ 'sort' => 'bool',
+ 'sortWithSortKeys' => 'bool',
+ 'asort' => 'bool',
+ 'getAttribute' => 'int|false',
+ 'setAttribute' => 'bool',
+ 'getStrength' => 'int',
+ 'getLocale' => 'string|false',
+ 'getErrorCode' => 'int|false',
+ 'getErrorMessage' => 'string|false',
+ 'getSortKey' => 'string|false',
+ ],
+ 'IntlIterator' => [
+ 'current' => 'mixed',
+ 'key' => 'mixed',
+ 'next' => 'void',
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ ],
+ 'UConverter' => [
+ 'convert' => 'string|false',
+ 'fromUCallback' => 'string|int|array|null',
+ 'getAliases' => 'array|false|null',
+ 'getAvailable' => 'array',
+ 'getDestinationEncoding' => 'string|false|null',
+ 'getDestinationType' => 'int|false|null',
+ 'getErrorCode' => 'int',
+ 'getErrorMessage' => '?string',
+ 'getSourceEncoding' => 'string|false|null',
+ 'getSourceType' => 'int|false|null',
+ 'getStandards' => '?array',
+ 'getSubstChars' => 'string|false|null',
+ 'reasonText' => 'string',
+ 'setDestinationEncoding' => 'bool',
+ 'setSourceEncoding' => 'bool',
+ 'setSubstChars' => 'bool',
+ 'toUCallback' => 'string|int|array|null',
+ 'transcode' => 'string|false',
+ ],
+ 'IntlDateFormatter' => [
+ 'create' => '?IntlDateFormatter',
+ 'getDateType' => 'int|false',
+ 'getTimeType' => 'int|false',
+ 'getCalendar' => 'int|false',
+ 'setCalendar' => 'bool',
+ 'getTimeZoneId' => 'string|false',
+ 'getCalendarObject' => 'IntlCalendar|false|null',
+ 'getTimeZone' => 'IntlTimeZone|false',
+ 'setTimeZone' => '?bool',
+ 'setPattern' => 'bool',
+ 'getPattern' => 'string|false',
+ 'getLocale' => 'string|false',
+ 'setLenient' => 'void',
+ 'isLenient' => 'bool',
+ 'format' => 'string|false',
+ 'formatObject' => 'string|false',
+ 'parse' => 'int|float|false',
+ 'localtime' => 'array|false',
+ 'getErrorCode' => 'int',
+ 'getErrorMessage' => 'string',
+ ],
+ 'NumberFormatter' => [
+ 'create' => '?NumberFormatter',
+ 'format' => 'string|false',
+ 'parse' => 'int|float|false',
+ 'formatCurrency' => 'string|false',
+ 'parseCurrency' => 'float|false',
+ 'setAttribute' => 'bool',
+ 'getAttribute' => 'int|float|false',
+ 'setTextAttribute' => 'bool',
+ 'getTextAttribute' => 'string|false',
+ 'setSymbol' => 'bool',
+ 'getSymbol' => 'string|false',
+ 'setPattern' => 'bool',
+ 'getPattern' => 'string|false',
+ 'getLocale' => 'string|false',
+ 'getErrorCode' => 'int',
+ 'getErrorMessage' => 'string',
+ ],
+ 'Locale' => [
+ 'getDefault' => 'string',
+ 'getPrimaryLanguage' => '?string',
+ 'getScript' => '?string',
+ 'getRegion' => '?string',
+ 'getKeywords' => 'array|false|null',
+ 'getDisplayScript' => 'string|false',
+ 'getDisplayRegion' => 'string|false',
+ 'getDisplayName' => 'string|false',
+ 'getDisplayLanguage' => 'string|false',
+ 'getDisplayVariant' => 'string|false',
+ 'composeLocale' => 'string|false',
+ 'parseLocale' => '?array',
+ 'getAllVariants' => '?array',
+ 'filterMatches' => '?bool',
+ 'lookup' => '?string',
+ 'canonicalize' => '?string',
+ 'acceptFromHttp' => 'string|false',
+ ],
+ 'MessageFormatter' => [
+ 'create' => '?MessageFormatter',
+ 'format' => 'string|false',
+ 'formatMessage' => 'string|false',
+ 'parse' => 'array|false',
+ 'parseMessage' => 'array|false',
+ 'setPattern' => 'bool',
+ 'getPattern' => 'string|false',
+ 'getLocale' => 'string',
+ 'getErrorCode' => 'int',
+ 'getErrorMessage' => 'string',
+ ],
+ 'Normalizer' => [
+ 'normalize' => 'string|false',
+ 'isNormalized' => 'bool',
+ 'getRawDecomposition' => '?string',
+ ],
+ 'ResourceBundle' => [
+ 'create' => '?ResourceBundle',
+ 'get' => 'mixed',
+ 'count' => 'int',
+ 'getLocales' => 'array|false',
+ 'getErrorCode' => 'int',
+ 'getErrorMessage' => 'string',
+ ],
+ 'Spoofchecker' => [
+ 'isSuspicious' => 'bool',
+ 'areConfusable' => 'bool',
+ 'setAllowedLocales' => 'void',
+ 'setChecks' => 'void',
+ 'setRestrictionLevel' => 'void',
+ ],
+ 'IntlTimeZone' => [
+ 'countEquivalentIDs' => 'int|false',
+ 'createDefault' => 'IntlTimeZone',
+ 'createEnumeration' => 'IntlIterator|false',
+ 'createTimeZone' => '?IntlTimeZone',
+ 'createTimeZoneIDEnumeration' => 'IntlIterator|false',
+ 'fromDateTimeZone' => '?IntlTimeZone',
+ 'getCanonicalID' => 'string|false',
+ 'getDisplayName' => 'string|false',
+ 'getDSTSavings' => 'int',
+ 'getEquivalentID' => 'string|false',
+ 'getErrorCode' => 'int|false',
+ 'getErrorMessage' => 'string|false',
+ 'getGMT' => 'IntlTimeZone',
+ 'getID' => 'string|false',
+ 'getOffset' => 'bool',
+ 'getRawOffset' => 'int',
+ 'getRegion' => 'string|false',
+ 'getTZDataVersion' => 'string|false',
+ 'getUnknown' => 'IntlTimeZone',
+ 'getWindowsID' => 'string|false',
+ 'getIDForWindowsID' => 'string|false',
+ 'hasSameRules' => 'bool',
+ 'toDateTimeZone' => 'DateTimeZone|false',
+ 'useDaylightTime' => 'bool',
+ ],
+ 'Transliterator' => [
+ 'create' => '?Transliterator',
+ 'createFromRules' => '?Transliterator',
+ 'createInverse' => '?Transliterator',
+ 'listIDs' => 'array|false',
+ 'transliterate' => 'string|false',
+ 'getErrorCode' => 'int|false',
+ 'getErrorMessage' => 'string|false',
+ ],
+ 'IntlChar' => [
+ 'hasBinaryProperty' => '?bool',
+ 'charAge' => '?array',
+ 'charDigitValue' => '?int',
+ 'charDirection' => '?int',
+ 'charFromName' => '?int',
+ 'charMirror' => 'int|string|null',
+ 'charName' => '?string',
+ 'charType' => '?int',
+ 'chr' => '?string',
+ 'digit' => 'int|false|null',
+ 'enumCharNames' => '?bool',
+ 'enumCharTypes' => 'void',
+ 'foldCase' => 'int|string|null',
+ 'forDigit' => 'int',
+ 'getBidiPairedBracket' => 'int|string|null',
+ 'getBlockCode' => '?int',
+ 'getCombiningClass' => '?int',
+ 'getFC_NFKC_Closure' => 'string|false|null',
+ 'getIntPropertyMaxValue' => 'int',
+ 'getIntPropertyMinValue' => 'int',
+ 'getIntPropertyValue' => '?int',
+ 'getNumericValue' => '?float',
+ 'getPropertyEnum' => 'int',
+ 'getPropertyName' => 'string|false',
+ 'getPropertyValueEnum' => 'int',
+ 'getPropertyValueName' => 'string|false',
+ 'getUnicodeVersion' => 'array',
+ 'isalnum' => '?bool',
+ 'isalpha' => '?bool',
+ 'isbase' => '?bool',
+ 'isblank' => '?bool',
+ 'iscntrl' => '?bool',
+ 'isdefined' => '?bool',
+ 'isdigit' => '?bool',
+ 'isgraph' => '?bool',
+ 'isIDIgnorable' => '?bool',
+ 'isIDPart' => '?bool',
+ 'isIDStart' => '?bool',
+ 'isISOControl' => '?bool',
+ 'isJavaIDPart' => '?bool',
+ 'isJavaIDStart' => '?bool',
+ 'isJavaSpaceChar' => '?bool',
+ 'islower' => '?bool',
+ 'isMirrored' => '?bool',
+ 'isprint' => '?bool',
+ 'ispunct' => '?bool',
+ 'isspace' => '?bool',
+ 'istitle' => '?bool',
+ 'isUAlphabetic' => '?bool',
+ 'isULowercase' => '?bool',
+ 'isupper' => '?bool',
+ 'isUUppercase' => '?bool',
+ 'isUWhiteSpace' => '?bool',
+ 'isWhitespace' => '?bool',
+ 'isxdigit' => '?bool',
+ 'ord' => '?int',
+ 'tolower' => 'int|string|null',
+ 'totitle' => 'int|string|null',
+ 'toupper' => 'int|string|null',
+ ],
+ 'JsonSerializable' => [
+ 'jsonSerialize' => 'mixed',
+ ],
+ 'mysqli' => [
+ 'autocommit' => 'bool',
+ 'begin_transaction' => 'bool',
+ 'change_user' => 'bool',
+ 'character_set_name' => 'string',
+ 'commit' => 'bool',
+ 'connect' => 'bool',
+ 'dump_debug_info' => 'bool',
+ 'get_charset' => '?object',
+ 'get_client_info' => 'string',
+ 'get_connection_stats' => 'array',
+ 'get_server_info' => 'string',
+ 'get_warnings' => 'mysqli_warning|false',
+ 'kill' => 'bool',
+ 'multi_query' => 'bool',
+ 'more_results' => 'bool',
+ 'next_result' => 'bool',
+ 'ping' => 'bool',
+ 'poll' => 'int|false',
+ 'prepare' => 'mysqli_stmt|false',
+ 'query' => 'mysqli_result|bool',
+ 'real_connect' => 'bool',
+ 'real_escape_string' => 'string',
+ 'reap_async_query' => 'mysqli_result|bool',
+ 'escape_string' => 'string',
+ 'real_query' => 'bool',
+ 'release_savepoint' => 'bool',
+ 'rollback' => 'bool',
+ 'savepoint' => 'bool',
+ 'select_db' => 'bool',
+ 'set_charset' => 'bool',
+ 'options' => 'bool',
+ 'set_opt' => 'bool',
+ 'stat' => 'string|false',
+ 'stmt_init' => 'mysqli_stmt|false',
+ 'store_result' => 'mysqli_result|false',
+ 'thread_safe' => 'bool',
+ 'use_result' => 'mysqli_result|false',
+ 'refresh' => 'bool',
+ ],
+ 'mysqli_result' => [
+ 'close' => 'void',
+ 'free' => 'void',
+ 'data_seek' => 'bool',
+ 'fetch_field' => 'object|false',
+ 'fetch_fields' => 'array',
+ 'fetch_field_direct' => 'object|false',
+ 'fetch_all' => 'array',
+ 'fetch_array' => 'array|null|false',
+ 'fetch_assoc' => 'array|null|false',
+ 'fetch_object' => 'object|null|false',
+ 'fetch_row' => 'array|null|false',
+ 'field_seek' => 'bool',
+ 'free_result' => 'void',
+ ],
+ 'mysqli_stmt' => [
+ 'attr_get' => 'int',
+ 'attr_set' => 'bool',
+ 'bind_param' => 'bool',
+ 'bind_result' => 'bool',
+ 'data_seek' => 'void',
+ 'execute' => 'bool',
+ 'fetch' => '?bool',
+ 'get_warnings' => 'mysqli_warning|false',
+ 'result_metadata' => 'mysqli_result|false',
+ 'more_results' => 'bool',
+ 'next_result' => 'bool',
+ 'num_rows' => 'int|string',
+ 'send_long_data' => 'bool',
+ 'free_result' => 'void',
+ 'reset' => 'bool',
+ 'prepare' => 'bool',
+ 'store_result' => 'bool',
+ 'get_result' => 'mysqli_result|false',
+ ],
+ 'OCILob' => [
+ 'save' => 'bool',
+ 'import' => 'bool',
+ 'saveFile' => 'bool',
+ 'load' => 'string|false',
+ 'read' => 'string|false',
+ 'eof' => 'bool',
+ 'tell' => 'int|false',
+ 'rewind' => 'bool',
+ 'seek' => 'bool',
+ 'size' => 'int|false',
+ 'write' => 'int|false',
+ 'append' => 'bool',
+ 'truncate' => 'bool',
+ 'erase' => 'int|false',
+ 'flush' => 'bool',
+ 'setBuffering' => 'bool',
+ 'getBuffering' => 'bool',
+ 'writeToFile' => 'bool',
+ 'export' => 'bool',
+ 'writeTemporary' => 'bool',
+ 'close' => 'bool',
+ 'free' => 'bool',
+ ],
+ 'OCICollection' => [
+ 'free' => 'bool',
+ 'append' => 'bool',
+ 'getElem' => 'string|float|null|false',
+ 'assign' => 'bool',
+ 'assignElem' => 'bool',
+ 'size' => 'int|false',
+ 'max' => 'int|false',
+ 'trim' => 'bool',
+ ],
+ 'PDO' => [
+ 'beginTransaction' => 'bool',
+ 'commit' => 'bool',
+ 'errorCode' => '?string',
+ 'errorInfo' => 'array',
+ 'exec' => 'int|false',
+ 'getAttribute' => 'mixed',
+ 'getAvailableDrivers' => 'array',
+ 'inTransaction' => 'bool',
+ 'lastInsertId' => 'string|false',
+ 'prepare' => 'PDOStatement|false',
+ 'query' => 'PDOStatement|false',
+ 'quote' => 'string|false',
+ 'rollBack' => 'bool',
+ 'setAttribute' => 'bool',
+ ],
+ 'PDOStatement' => [
+ 'bindColumn' => 'bool',
+ 'bindParam' => 'bool',
+ 'bindValue' => 'bool',
+ 'closeCursor' => 'bool',
+ 'columnCount' => 'int',
+ 'debugDumpParams' => '?bool',
+ 'errorCode' => '?string',
+ 'errorInfo' => 'array',
+ 'execute' => 'bool',
+ 'fetch' => 'mixed',
+ 'fetchAll' => 'array',
+ 'fetchColumn' => 'mixed',
+ 'fetchObject' => 'object|false',
+ 'getAttribute' => 'mixed',
+ 'getColumnMeta' => 'array|false',
+ 'nextRowset' => 'bool',
+ 'rowCount' => 'int',
+ 'setAttribute' => 'bool',
+ ],
+ 'PDO_PGSql_Ext' => [
+ 'pgsqlCopyFromArray' => 'bool',
+ 'pgsqlCopyFromFile' => 'bool',
+ 'pgsqlCopyToArray' => 'array|false',
+ 'pgsqlCopyToFile' => 'bool',
+ 'pgsqlLOBCreate' => 'string|false',
+ 'pgsqlLOBUnlink' => 'bool',
+ 'pgsqlGetNotify' => 'array|false',
+ 'pgsqlGetPid' => 'int',
+ ],
+ 'PDO_SQLite_Ext' => [
+ 'sqliteCreateFunction' => 'bool',
+ 'sqliteCreateAggregate' => 'bool',
+ 'sqliteCreateCollation' => 'bool',
+ ],
+ 'Phar' => [
+ 'addEmptyDir' => 'void',
+ 'addFile' => 'void',
+ 'addFromString' => 'void',
+ 'buildFromDirectory' => 'array',
+ 'buildFromIterator' => 'array',
+ 'compressFiles' => 'void',
+ 'compress' => '?Phar',
+ 'decompress' => '?Phar',
+ 'convertToExecutable' => '?Phar',
+ 'convertToData' => '?PharData',
+ 'count' => 'int',
+ 'extractTo' => 'bool',
+ 'getAlias' => '?string',
+ 'getPath' => 'string',
+ 'getMetadata' => 'mixed',
+ 'getModified' => 'bool',
+ 'getSignature' => 'array|false',
+ 'getStub' => 'string',
+ 'getVersion' => 'string',
+ 'hasMetadata' => 'bool',
+ 'isBuffering' => 'bool',
+ 'isCompressed' => 'int|false',
+ 'isFileFormat' => 'bool',
+ 'isWritable' => 'bool',
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'SplFileInfo',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ 'setAlias' => 'bool',
+ 'setDefaultStub' => 'bool',
+ 'setMetadata' => 'void',
+ 'setSignatureAlgorithm' => 'void',
+ 'startBuffering' => 'void',
+ 'stopBuffering' => 'void',
+ ],
+ 'PharData' => [
+ 'addEmptyDir' => 'void',
+ 'addFile' => 'void',
+ 'addFromString' => 'void',
+ 'buildFromDirectory' => 'array',
+ 'buildFromIterator' => 'array',
+ 'compressFiles' => 'void',
+ 'compress' => '?PharData',
+ 'decompress' => '?PharData',
+ 'convertToExecutable' => '?Phar',
+ 'convertToData' => '?PharData',
+ 'count' => 'int',
+ 'extractTo' => 'bool',
+ 'getAlias' => '?string',
+ 'getPath' => 'string',
+ 'getMetadata' => 'mixed',
+ 'getModified' => 'bool',
+ 'getSignature' => 'array|false',
+ 'getStub' => 'string',
+ 'getVersion' => 'string',
+ 'hasMetadata' => 'bool',
+ 'isBuffering' => 'bool',
+ 'isCompressed' => 'int|false',
+ 'isFileFormat' => 'bool',
+ 'isWritable' => 'bool',
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'SplFileInfo',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ 'setAlias' => 'bool',
+ 'setDefaultStub' => 'bool',
+ 'setMetadata' => 'void',
+ 'setSignatureAlgorithm' => 'void',
+ 'startBuffering' => 'void',
+ 'stopBuffering' => 'void',
+ ],
+ 'PharFileInfo' => [
+ 'chmod' => 'void',
+ 'getCompressedSize' => 'int',
+ 'getCRC32' => 'int',
+ 'getContent' => 'string',
+ 'getMetadata' => 'mixed',
+ 'getPharFlags' => 'int',
+ 'hasMetadata' => 'bool',
+ 'isCompressed' => 'bool',
+ 'isCRCChecked' => 'bool',
+ 'setMetadata' => 'void',
+ ],
+ 'Reflection' => [
+ 'getModifierNames' => 'array',
+ ],
+ 'ReflectionFunctionAbstract' => [
+ 'inNamespace' => 'bool',
+ 'isClosure' => 'bool',
+ 'isDeprecated' => 'bool',
+ 'isInternal' => 'bool',
+ 'isUserDefined' => 'bool',
+ 'isGenerator' => 'bool',
+ 'isVariadic' => 'bool',
+ 'isStatic' => 'bool',
+ 'getClosureThis' => '?object',
+ 'getClosureScopeClass' => '?ReflectionClass',
+ 'getDocComment' => 'string|false',
+ 'getEndLine' => 'int|false',
+ 'getExtension' => '?ReflectionExtension',
+ 'getExtensionName' => 'string|false',
+ 'getFileName' => 'string|false',
+ 'getName' => 'string',
+ 'getNamespaceName' => 'string',
+ 'getNumberOfParameters' => 'int',
+ 'getNumberOfRequiredParameters' => 'int',
+ 'getParameters' => 'array',
+ 'getShortName' => 'string',
+ 'getStartLine' => 'int|false',
+ 'getStaticVariables' => 'array',
+ 'returnsReference' => 'bool',
+ 'hasReturnType' => 'bool',
+ 'getReturnType' => '?ReflectionType',
+ ],
+ 'ReflectionFunction' => [
+ 'isDisabled' => 'bool',
+ 'invoke' => 'mixed',
+ 'invokeArgs' => 'mixed',
+ 'getClosure' => 'Closure',
+ 'getExecutingLine' => 'int',
+ 'getExecutingFile' => 'string',
+ 'getTrace' => 'array',
+ 'getFunction' => 'ReflectionFunctionAbstract',
+ 'getThis' => '?object',
+ 'getExecutingGenerator' => 'Generator',
+ ],
+ 'ReflectionMethod' => [
+ 'isPublic' => 'bool',
+ 'isPrivate' => 'bool',
+ 'isProtected' => 'bool',
+ 'isAbstract' => 'bool',
+ 'isFinal' => 'bool',
+ 'isConstructor' => 'bool',
+ 'isDestructor' => 'bool',
+ 'getClosure' => 'Closure',
+ 'getModifiers' => 'int',
+ 'invoke' => 'mixed',
+ 'invokeArgs' => 'mixed',
+ 'getDeclaringClass' => 'ReflectionClass',
+ 'getPrototype' => 'ReflectionMethod',
+ 'setAccessible' => 'void',
+ ],
+ 'ReflectionClass' => [
+ 'getName' => 'string',
+ 'isInternal' => 'bool',
+ 'isUserDefined' => 'bool',
+ 'isAnonymous' => 'bool',
+ 'isInstantiable' => 'bool',
+ 'isCloneable' => 'bool',
+ 'getFileName' => 'string|false',
+ 'getStartLine' => 'int|false',
+ 'getEndLine' => 'int|false',
+ 'getDocComment' => 'string|false',
+ 'getConstructor' => '?ReflectionMethod',
+ 'hasMethod' => 'bool',
+ 'getMethod' => 'ReflectionMethod',
+ 'getMethods' => 'array',
+ 'hasProperty' => 'bool',
+ 'getProperty' => 'ReflectionProperty',
+ 'getProperties' => 'array',
+ 'hasConstant' => 'bool',
+ 'getConstants' => 'array',
+ 'getReflectionConstants' => 'array',
+ 'getConstant' => 'mixed',
+ 'getReflectionConstant' => 'ReflectionClassConstant|false',
+ 'getInterfaces' => 'array',
+ 'getInterfaceNames' => 'array',
+ 'isInterface' => 'bool',
+ 'getTraits' => 'array',
+ 'getTraitNames' => 'array',
+ 'getTraitAliases' => 'array',
+ 'isTrait' => 'bool',
+ 'isAbstract' => 'bool',
+ 'isFinal' => 'bool',
+ 'getModifiers' => 'int',
+ 'isInstance' => 'bool',
+ 'newInstance' => 'object',
+ 'newInstanceWithoutConstructor' => 'object',
+ 'newInstanceArgs' => '?object',
+ 'getParentClass' => 'ReflectionClass|false',
+ 'isSubclassOf' => 'bool',
+ 'getStaticProperties' => '?array',
+ 'getStaticPropertyValue' => 'mixed',
+ 'setStaticPropertyValue' => 'void',
+ 'getDefaultProperties' => 'array',
+ 'isIterable' => 'bool',
+ 'isIterateable' => 'bool',
+ 'implementsInterface' => 'bool',
+ 'getExtension' => '?ReflectionExtension',
+ 'getExtensionName' => 'string|false',
+ 'inNamespace' => 'bool',
+ 'getNamespaceName' => 'string',
+ 'getShortName' => 'string',
+ ],
+ 'ReflectionProperty' => [
+ 'getName' => 'string',
+ 'getValue' => 'mixed',
+ 'setValue' => 'void',
+ 'isInitialized' => 'bool',
+ 'isPublic' => 'bool',
+ 'isPrivate' => 'bool',
+ 'isProtected' => 'bool',
+ 'isStatic' => 'bool',
+ 'isDefault' => 'bool',
+ 'getModifiers' => 'int',
+ 'getDeclaringClass' => 'ReflectionClass',
+ 'getDocComment' => 'string|false',
+ 'setAccessible' => 'void',
+ 'getType' => '?ReflectionType',
+ 'hasType' => 'bool',
+ 'getDefaultValue' => 'mixed',
+ ],
+ 'ReflectionClassConstant' => [
+ 'getName' => 'string',
+ 'getValue' => 'mixed',
+ 'isPublic' => 'bool',
+ 'isPrivate' => 'bool',
+ 'isProtected' => 'bool',
+ 'getModifiers' => 'int',
+ 'getDeclaringClass' => 'ReflectionClass',
+ 'getDocComment' => 'string|false',
+ ],
+ 'ReflectionParameter' => [
+ 'getName' => 'string',
+ 'isPassedByReference' => 'bool',
+ 'canBePassedByValue' => 'bool',
+ 'getDeclaringFunction' => 'ReflectionFunctionAbstract',
+ 'getDeclaringClass' => '?ReflectionClass',
+ 'getClass' => '?ReflectionClass',
+ 'hasType' => 'bool',
+ 'getType' => '?ReflectionType',
+ 'isArray' => 'bool',
+ 'isCallable' => 'bool',
+ 'allowsNull' => 'bool',
+ 'getPosition' => 'int',
+ 'isOptional' => 'bool',
+ 'isDefaultValueAvailable' => 'bool',
+ 'getDefaultValue' => 'mixed',
+ 'isDefaultValueConstant' => 'bool',
+ 'getDefaultValueConstantName' => '?string',
+ 'isVariadic' => 'bool',
+ ],
+ 'ReflectionType' => [
+ 'allowsNull' => 'bool',
+ ],
+ 'ReflectionNamedType' => [
+ 'getName' => 'string',
+ 'isBuiltin' => 'bool',
+ ],
+ 'ReflectionExtension' => [
+ 'getName' => 'string',
+ 'getVersion' => '?string',
+ 'getFunctions' => 'array',
+ 'getConstants' => 'array',
+ 'getINIEntries' => 'array',
+ 'getClasses' => 'array',
+ 'getClassNames' => 'array',
+ 'getDependencies' => 'array',
+ 'info' => 'void',
+ 'isPersistent' => 'bool',
+ 'isTemporary' => 'bool',
+ ],
+ 'ReflectionZendExtension' => [
+ 'getName' => 'string',
+ 'getVersion' => 'string',
+ 'getAuthor' => 'string',
+ 'getURL' => 'string',
+ 'getCopyright' => 'string',
+ ],
+ 'SessionHandlerInterface' => [
+ 'open' => 'bool',
+ 'close' => 'bool',
+ 'read' => 'string|false',
+ 'write' => 'bool',
+ 'destroy' => 'bool',
+ 'gc' => 'int|false',
+ ],
+ 'SessionIdInterface' => [
+ 'create_sid' => 'string',
+ ],
+ 'SessionUpdateTimestampHandlerInterface' => [
+ 'validateId' => 'bool',
+ 'updateTimestamp' => 'bool',
+ ],
+ 'SessionHandler' => [
+ 'open' => 'bool',
+ 'close' => 'bool',
+ 'read' => 'string|false',
+ 'write' => 'bool',
+ 'destroy' => 'bool',
+ 'gc' => 'int|false',
+ 'create_sid' => 'string',
+ ],
+ 'SimpleXMLElement' => [
+ 'xpath' => 'array|null|false',
+ 'registerXPathNamespace' => 'bool',
+ 'asXML' => 'string|bool',
+ 'saveXML' => 'string|bool',
+ 'getNamespaces' => 'array',
+ 'getDocNamespaces' => 'array|false',
+ 'children' => '?SimpleXMLElement',
+ 'attributes' => '?SimpleXMLElement',
+ 'addChild' => '?SimpleXMLElement',
+ 'addAttribute' => 'void',
+ 'getName' => 'string',
+ 'count' => 'int',
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'current' => 'SimpleXMLElement',
+ 'key' => 'string',
+ 'next' => 'void',
+ 'hasChildren' => 'bool',
+ 'getChildren' => '?SimpleXMLElement',
+ ],
+ 'SNMP' => [
+ 'close' => 'bool',
+ 'setSecurity' => 'bool',
+ 'get' => 'mixed',
+ 'getnext' => 'mixed',
+ 'walk' => 'array|false',
+ 'set' => 'bool',
+ 'getErrno' => 'int',
+ 'getError' => 'string',
+ ],
+ 'SoapServer' => [
+ 'fault' => 'void',
+ 'addSoapHeader' => 'void',
+ 'setPersistence' => 'void',
+ 'setClass' => 'void',
+ 'setObject' => 'void',
+ 'getFunctions' => 'array',
+ 'addFunction' => 'void',
+ 'handle' => 'void',
+ ],
+ 'SoapClient' => [
+ '__call' => 'mixed',
+ '__soapCall' => 'mixed',
+ '__getFunctions' => '?array',
+ '__getTypes' => '?array',
+ '__getLastRequest' => '?string',
+ '__getLastResponse' => '?string',
+ '__getLastRequestHeaders' => '?string',
+ '__getLastResponseHeaders' => '?string',
+ '__doRequest' => '?string',
+ '__setCookie' => 'void',
+ '__getCookies' => 'array',
+ '__setSoapHeaders' => 'bool',
+ '__setLocation' => '?string',
+ ],
+ 'ArrayObject' => [
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'mixed',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ 'append' => 'void',
+ 'getArrayCopy' => 'array',
+ 'count' => 'int',
+ 'getFlags' => 'int',
+ 'setFlags' => 'void',
+ 'asort' => 'bool',
+ 'ksort' => 'bool',
+ 'uasort' => 'bool',
+ 'uksort' => 'bool',
+ 'natsort' => 'bool',
+ 'natcasesort' => 'bool',
+ 'unserialize' => 'void',
+ 'serialize' => 'string',
+ '__serialize' => 'array',
+ '__unserialize' => 'void',
+ 'getIterator' => 'Iterator',
+ 'exchangeArray' => 'array',
+ 'setIteratorClass' => 'void',
+ 'getIteratorClass' => 'string',
+ '__debugInfo' => 'array',
+ ],
+ 'ArrayIterator' => [
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'mixed',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ 'append' => 'void',
+ 'getArrayCopy' => 'array',
+ 'count' => 'int',
+ 'getFlags' => 'int',
+ 'setFlags' => 'void',
+ 'asort' => 'bool',
+ 'ksort' => 'bool',
+ 'uasort' => 'bool',
+ 'uksort' => 'bool',
+ 'natsort' => 'bool',
+ 'natcasesort' => 'bool',
+ 'unserialize' => 'void',
+ 'serialize' => 'string',
+ '__serialize' => 'array',
+ '__unserialize' => 'void',
+ 'rewind' => 'void',
+ 'current' => 'mixed',
+ 'key' => 'string|int|null',
+ 'next' => 'void',
+ 'valid' => 'bool',
+ 'seek' => 'void',
+ '__debugInfo' => 'array',
+ ],
+ 'RecursiveArrayIterator' => [
+ 'hasChildren' => 'bool',
+ 'getChildren' => '?RecursiveArrayIterator',
+ ],
+ 'SplFileInfo' => [
+ 'getPath' => 'string',
+ 'getFilename' => 'string',
+ 'getExtension' => 'string',
+ 'getBasename' => 'string',
+ 'getPathname' => 'string',
+ 'getPerms' => 'int|false',
+ 'getInode' => 'int|false',
+ 'getSize' => 'int|false',
+ 'getOwner' => 'int|false',
+ 'getGroup' => 'int|false',
+ 'getATime' => 'int|false',
+ 'getMTime' => 'int|false',
+ 'getCTime' => 'int|false',
+ 'getType' => 'string|false',
+ 'isWritable' => 'bool',
+ 'isReadable' => 'bool',
+ 'isExecutable' => 'bool',
+ 'isFile' => 'bool',
+ 'isDir' => 'bool',
+ 'isLink' => 'bool',
+ 'getLinkTarget' => 'string|false',
+ 'getRealPath' => 'string|false',
+ 'getFileInfo' => 'SplFileInfo',
+ 'getPathInfo' => '?SplFileInfo',
+ 'openFile' => 'SplFileObject',
+ 'setFileClass' => 'void',
+ 'setInfoClass' => 'void',
+ '__debugInfo' => 'array',
+ '_bad_state_ex' => 'void',
+ ],
+ 'DirectoryIterator' => [
+ 'getFilename' => 'string',
+ 'getExtension' => 'string',
+ 'getBasename' => 'string',
+ 'isDot' => 'bool',
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'key' => 'mixed',
+ 'current' => 'mixed',
+ 'next' => 'void',
+ 'seek' => 'void',
+ ],
+ 'FilesystemIterator' => [
+ 'rewind' => 'void',
+ 'key' => 'string',
+ 'current' => 'string|SplFileInfo|FilesystemIterator',
+ 'getFlags' => 'int',
+ 'setFlags' => 'void',
+ ],
+ 'RecursiveDirectoryIterator' => [
+ 'hasChildren' => 'bool',
+ 'getChildren' => 'RecursiveDirectoryIterator',
+ 'getSubPath' => 'string',
+ 'getSubPathname' => 'string',
+ ],
+ 'GlobIterator' => [
+ 'count' => 'int',
+ ],
+ 'SplFileObject' => [
+ 'rewind' => 'void',
+ 'eof' => 'bool',
+ 'valid' => 'bool',
+ 'fgets' => 'string',
+ 'fread' => 'string|false',
+ 'fgetcsv' => 'array|false',
+ 'fputcsv' => 'int|false',
+ 'setCsvControl' => 'void',
+ 'getCsvControl' => 'array',
+ 'flock' => 'bool',
+ 'fflush' => 'bool',
+ 'ftell' => 'int|false',
+ 'fseek' => 'int',
+ 'fgetc' => 'string|false',
+ 'fpassthru' => 'int',
+ 'fscanf' => 'array|int|null',
+ 'fwrite' => 'int|false',
+ 'fstat' => 'array',
+ 'ftruncate' => 'bool',
+ 'current' => 'string|array|false',
+ 'key' => 'int',
+ 'next' => 'void',
+ 'setFlags' => 'void',
+ 'getFlags' => 'int',
+ 'setMaxLineLen' => 'void',
+ 'getMaxLineLen' => 'int',
+ 'hasChildren' => 'false',
+ 'getChildren' => 'null',
+ 'seek' => 'void',
+ 'getCurrentLine' => 'string',
+ ],
+ 'SplDoublyLinkedList' => [
+ 'add' => 'void',
+ 'pop' => 'mixed',
+ 'shift' => 'mixed',
+ 'push' => 'void',
+ 'unshift' => 'void',
+ 'top' => 'mixed',
+ 'bottom' => 'mixed',
+ '__debugInfo' => 'array',
+ 'count' => 'int',
+ 'isEmpty' => 'bool',
+ 'setIteratorMode' => 'int',
+ 'getIteratorMode' => 'int',
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'mixed',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ 'rewind' => 'void',
+ 'current' => 'mixed',
+ 'key' => 'int',
+ 'prev' => 'void',
+ 'next' => 'void',
+ 'valid' => 'bool',
+ 'unserialize' => 'void',
+ 'serialize' => 'string',
+ '__serialize' => 'array',
+ '__unserialize' => 'void',
+ ],
+ 'SplQueue' => [
+ 'enqueue' => 'void',
+ 'dequeue' => 'mixed',
+ ],
+ 'SplFixedArray' => [
+ '__wakeup' => 'void',
+ 'count' => 'int',
+ 'toArray' => 'array',
+ 'fromArray' => 'SplFixedArray',
+ 'getSize' => 'int',
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'mixed',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ ],
+ 'SplPriorityQueue' => [
+ 'compare' => 'int',
+ 'setExtractFlags' => 'int',
+ 'top' => 'mixed',
+ 'extract' => 'mixed',
+ 'count' => 'int',
+ 'isEmpty' => 'bool',
+ 'rewind' => 'void',
+ 'current' => 'mixed',
+ 'key' => 'int',
+ 'next' => 'void',
+ 'valid' => 'bool',
+ 'isCorrupted' => 'bool',
+ 'getExtractFlags' => 'int',
+ '__debugInfo' => 'array',
+ ],
+ 'SplHeap' => [
+ 'extract' => 'mixed',
+ 'insert' => 'bool',
+ 'top' => 'mixed',
+ 'count' => 'int',
+ 'isEmpty' => 'bool',
+ 'rewind' => 'void',
+ 'current' => 'mixed',
+ 'key' => 'int',
+ 'next' => 'void',
+ 'valid' => 'bool',
+ 'recoverFromCorruption' => 'bool',
+ 'compare' => 'int',
+ 'isCorrupted' => 'bool',
+ '__debugInfo' => 'array',
+ ],
+ 'SplMinHeap' => [
+ 'compare' => 'int',
+ ],
+ 'SplMaxHeap' => [
+ 'compare' => 'int',
+ ],
+ 'EmptyIterator' => [
+ 'current' => 'never',
+ 'next' => 'void',
+ 'key' => 'never',
+ 'valid' => 'false',
+ 'rewind' => 'void',
+ ],
+ 'CallbackFilterIterator' => [
+ 'accept' => 'bool',
+ ],
+ 'RecursiveCallbackFilterIterator' => [
+ 'hasChildren' => 'bool',
+ 'getChildren' => 'RecursiveCallbackFilterIterator',
+ ],
+ 'RecursiveIterator' => [
+ 'hasChildren' => 'bool',
+ 'getChildren' => '?RecursiveIterator',
+ ],
+ 'RecursiveIteratorIterator' => [
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'key' => 'mixed',
+ 'current' => 'mixed',
+ 'next' => 'void',
+ 'getDepth' => 'int',
+ 'getSubIterator' => '?RecursiveIterator',
+ 'getInnerIterator' => 'RecursiveIterator',
+ 'beginIteration' => 'void',
+ 'endIteration' => 'void',
+ 'callHasChildren' => 'bool',
+ 'callGetChildren' => '?RecursiveIterator',
+ 'beginChildren' => 'void',
+ 'endChildren' => 'void',
+ 'nextElement' => 'void',
+ 'setMaxDepth' => 'void',
+ 'getMaxDepth' => 'int|false',
+ ],
+ 'OuterIterator' => [
+ 'getInnerIterator' => '?Iterator',
+ ],
+ 'IteratorIterator' => [
+ 'getInnerIterator' => '?Iterator',
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'key' => 'mixed',
+ 'current' => 'mixed',
+ 'next' => 'void',
+ ],
+ 'FilterIterator' => [
+ 'accept' => 'bool',
+ 'rewind' => 'void',
+ 'next' => 'void',
+ ],
+ 'RecursiveFilterIterator' => [
+ 'hasChildren' => 'bool',
+ 'getChildren' => '?RecursiveFilterIterator',
+ ],
+ 'ParentIterator' => [
+ 'accept' => 'bool',
+ ],
+ 'SeekableIterator' => [
+ 'seek' => 'void',
+ ],
+ 'LimitIterator' => [
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'next' => 'void',
+ 'seek' => 'int',
+ 'getPosition' => 'int',
+ ],
+ 'CachingIterator' => [
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'next' => 'void',
+ 'hasNext' => 'bool',
+ 'getFlags' => 'int',
+ 'setFlags' => 'void',
+ 'offsetGet' => 'mixed',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ 'offsetExists' => 'bool',
+ 'getCache' => 'array',
+ 'count' => 'int',
+ ],
+ 'RecursiveCachingIterator' => [
+ 'hasChildren' => 'bool',
+ 'getChildren' => '?RecursiveCachingIterator',
+ ],
+ 'NoRewindIterator' => [
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'key' => 'mixed',
+ 'current' => 'mixed',
+ 'next' => 'void',
+ ],
+ 'AppendIterator' => [
+ 'append' => 'void',
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'current' => 'mixed',
+ 'next' => 'void',
+ 'getIteratorIndex' => '?int',
+ 'getArrayIterator' => 'ArrayIterator',
+ ],
+ 'InfiniteIterator' => [
+ 'next' => 'void',
+ ],
+ 'RegexIterator' => [
+ 'accept' => 'bool',
+ 'getMode' => 'int',
+ 'setMode' => 'void',
+ 'getFlags' => 'int',
+ 'setFlags' => 'void',
+ 'getRegex' => 'string',
+ 'getPregFlags' => 'int',
+ 'setPregFlags' => 'void',
+ ],
+ 'RecursiveRegexIterator' => [
+ 'accept' => 'bool',
+ 'hasChildren' => 'bool',
+ 'getChildren' => 'RecursiveRegexIterator',
+ ],
+ 'RecursiveTreeIterator' => [
+ 'key' => 'mixed',
+ 'current' => 'mixed',
+ 'getPrefix' => 'string',
+ 'setPostfix' => 'void',
+ 'setPrefixPart' => 'void',
+ 'getEntry' => 'string',
+ 'getPostfix' => 'string',
+ ],
+ 'SplObserver' => [
+ 'update' => 'void',
+ ],
+ 'SplSubject' => [
+ 'attach' => 'void',
+ 'detach' => 'void',
+ 'notify' => 'void',
+ ],
+ 'SplObjectStorage' => [
+ 'attach' => 'void',
+ 'detach' => 'void',
+ 'contains' => 'bool',
+ 'addAll' => 'int',
+ 'removeAll' => 'int',
+ 'removeAllExcept' => 'int',
+ 'getInfo' => 'mixed',
+ 'setInfo' => 'void',
+ 'count' => 'int',
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'key' => 'int',
+ 'current' => 'object',
+ 'next' => 'void',
+ 'unserialize' => 'void',
+ 'serialize' => 'string',
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'mixed',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ 'getHash' => 'string',
+ '__serialize' => 'array',
+ '__unserialize' => 'void',
+ '__debugInfo' => 'array',
+ ],
+ 'MultipleIterator' => [
+ 'getFlags' => 'int',
+ 'setFlags' => 'void',
+ 'attachIterator' => 'void',
+ 'detachIterator' => 'void',
+ 'containsIterator' => 'bool',
+ 'countIterators' => 'int',
+ 'rewind' => 'void',
+ 'valid' => 'bool',
+ 'key' => 'array',
+ 'current' => 'array',
+ 'next' => 'void',
+ '__debugInfo' => 'array',
+ ],
+ 'SQLite3' => [
+ 'open' => 'void',
+ 'version' => 'array',
+ 'lastInsertRowID' => 'int',
+ 'lastErrorCode' => 'int',
+ 'lastExtendedErrorCode' => 'int',
+ 'lastErrorMsg' => 'string',
+ 'changes' => 'int',
+ 'busyTimeout' => 'bool',
+ 'loadExtension' => 'bool',
+ 'backup' => 'bool',
+ 'escapeString' => 'string',
+ 'prepare' => 'SQLite3Stmt|false',
+ 'exec' => 'bool',
+ 'query' => 'SQLite3Result|false',
+ 'querySingle' => 'mixed',
+ 'createFunction' => 'bool',
+ 'createAggregate' => 'bool',
+ 'createCollation' => 'bool',
+ 'enableExceptions' => 'bool',
+ 'enableExtendedResultCodes' => 'bool',
+ 'setAuthorizer' => 'bool',
+ ],
+ 'SQLite3Stmt' => [
+ 'bindParam' => 'bool',
+ 'bindValue' => 'bool',
+ 'clear' => 'bool',
+ 'close' => 'bool',
+ 'execute' => 'SQLite3Result|false',
+ 'getSQL' => 'string|false',
+ 'paramCount' => 'int',
+ 'readOnly' => 'bool',
+ 'reset' => 'bool',
+ ],
+ 'SQLite3Result' => [
+ 'numColumns' => 'int',
+ 'columnName' => 'string|false',
+ 'columnType' => 'int|false',
+ 'fetchArray' => 'array|false',
+ 'reset' => 'bool',
+ ],
+ 'Directory' => [
+ 'close' => 'void',
+ 'rewind' => 'void',
+ 'read' => 'string|false',
+ ],
+ 'php_user_filter' => [
+ 'filter' => 'int',
+ 'onCreate' => 'bool',
+ 'onClose' => 'void',
+ ],
+ 'tidy' => [
+ 'getOpt' => 'string|int|bool',
+ 'cleanRepair' => 'bool',
+ 'parseFile' => 'bool',
+ 'parseString' => 'bool',
+ 'repairString' => 'string|false',
+ 'repairFile' => 'string|false',
+ 'diagnose' => 'bool',
+ 'getRelease' => 'string',
+ 'getConfig' => 'array',
+ 'getStatus' => 'int',
+ 'getHtmlVer' => 'int',
+ 'getOptDoc' => 'string|false',
+ 'isXhtml' => 'bool',
+ 'isXml' => 'bool',
+ 'root' => '?tidyNode',
+ 'head' => '?tidyNode',
+ 'html' => '?tidyNode',
+ 'body' => '?tidyNode',
+ ],
+ 'XMLReader' => [
+ 'getAttribute' => '?string',
+ 'getAttributeNo' => '?string',
+ 'getAttributeNs' => '?string',
+ 'getParserProperty' => 'bool',
+ 'isValid' => 'bool',
+ 'lookupNamespace' => '?string',
+ 'moveToAttribute' => 'bool',
+ 'moveToAttributeNo' => 'bool',
+ 'moveToAttributeNs' => 'bool',
+ 'moveToElement' => 'bool',
+ 'moveToFirstAttribute' => 'bool',
+ 'moveToNextAttribute' => 'bool',
+ 'read' => 'bool',
+ 'next' => 'bool',
+ 'readInnerXml' => 'string',
+ 'readOuterXml' => 'string',
+ 'readString' => 'string',
+ 'setSchema' => 'bool',
+ 'setParserProperty' => 'bool',
+ 'setRelaxNGSchema' => 'bool',
+ 'setRelaxNGSchemaSource' => 'bool',
+ 'expand' => 'DOMNode|false',
+ ],
+ 'XMLWriter' => [
+ 'openUri' => 'bool',
+ 'openMemory' => 'bool',
+ 'setIndent' => 'bool',
+ 'setIndentString' => 'bool',
+ 'startComment' => 'bool',
+ 'endComment' => 'bool',
+ 'startAttribute' => 'bool',
+ 'endAttribute' => 'bool',
+ 'writeAttribute' => 'bool',
+ 'startAttributeNs' => 'bool',
+ 'writeAttributeNs' => 'bool',
+ 'startElement' => 'bool',
+ 'endElement' => 'bool',
+ 'fullEndElement' => 'bool',
+ 'startElementNs' => 'bool',
+ 'writeElement' => 'bool',
+ 'writeElementNs' => 'bool',
+ 'startPi' => 'bool',
+ 'endPi' => 'bool',
+ 'writePi' => 'bool',
+ 'startCdata' => 'bool',
+ 'endCdata' => 'bool',
+ 'writeCdata' => 'bool',
+ 'text' => 'bool',
+ 'writeRaw' => 'bool',
+ 'startDocument' => 'bool',
+ 'endDocument' => 'bool',
+ 'writeComment' => 'bool',
+ 'startDtd' => 'bool',
+ 'endDtd' => 'bool',
+ 'writeDtd' => 'bool',
+ 'startDtdElement' => 'bool',
+ 'endDtdElement' => 'bool',
+ 'writeDtdElement' => 'bool',
+ 'startDtdAttlist' => 'bool',
+ 'endDtdAttlist' => 'bool',
+ 'writeDtdAttlist' => 'bool',
+ 'startDtdEntity' => 'bool',
+ 'endDtdEntity' => 'bool',
+ 'writeDtdEntity' => 'bool',
+ 'outputMemory' => 'string',
+ 'flush' => 'string|int',
+ ],
+ 'XSLTProcessor' => [
+ 'importStylesheet' => 'bool',
+ 'transformToDoc' => 'DOMDocument|false',
+ 'transformToUri' => 'int',
+ 'transformToXml' => 'string|null|false',
+ 'setParameter' => 'bool',
+ 'getParameter' => 'string|false',
+ 'removeParameter' => 'bool',
+ 'hasExsltSupport' => 'bool',
+ 'registerPHPFunctions' => 'void',
+ 'setSecurityPrefs' => 'int',
+ 'getSecurityPrefs' => 'int',
+ ],
+ 'ZipArchive' => [
+ 'open' => 'bool|int',
+ 'setPassword' => 'bool',
+ 'close' => 'bool',
+ 'count' => 'int',
+ 'getStatusString' => 'string',
+ 'addEmptyDir' => 'bool',
+ 'addFromString' => 'bool',
+ 'addFile' => 'bool',
+ 'replaceFile' => 'bool',
+ 'addGlob' => 'array|false',
+ 'addPattern' => 'array|false',
+ 'renameIndex' => 'bool',
+ 'renameName' => 'bool',
+ 'setArchiveComment' => 'bool',
+ 'getArchiveComment' => 'string|false',
+ 'setCommentIndex' => 'bool',
+ 'setCommentName' => 'bool',
+ 'setMtimeIndex' => 'bool',
+ 'setMtimeName' => 'bool',
+ 'getCommentIndex' => 'string|false',
+ 'getCommentName' => 'string|false',
+ 'deleteIndex' => 'bool',
+ 'deleteName' => 'bool',
+ 'statName' => 'array|false',
+ 'statIndex' => 'array|false',
+ 'locateName' => 'int|false',
+ 'getNameIndex' => 'string|false',
+ 'unchangeArchive' => 'bool',
+ 'unchangeAll' => 'bool',
+ 'unchangeIndex' => 'bool',
+ 'unchangeName' => 'bool',
+ 'extractTo' => 'bool',
+ 'getFromName' => 'string|false',
+ 'getFromIndex' => 'string|false',
+ 'setExternalAttributesName' => 'bool',
+ 'setExternalAttributesIndex' => 'bool',
+ 'getExternalAttributesName' => 'bool',
+ 'getExternalAttributesIndex' => 'bool',
+ 'setCompressionName' => 'bool',
+ 'setCompressionIndex' => 'bool',
+ 'setEncryptionName' => 'bool',
+ 'setEncryptionIndex' => 'bool',
+ 'registerProgressCallback' => 'bool',
+ 'registerCancelCallback' => 'bool',
+ ],
+ 'Exception' => [
+ '__wakeup' => 'void',
+ ],
+ 'Error' => [
+ '__wakeup' => 'void',
+ ],
+ 'IteratorAggregate' => [
+ 'getIterator' => 'Traversable',
+ ],
+ 'Iterator' => [
+ 'current' => 'mixed',
+ 'next' => 'void',
+ 'key' => 'mixed',
+ 'valid' => 'bool',
+ 'rewind' => 'void',
+ ],
+ 'ArrayAccess' => [
+ 'offsetExists' => 'bool',
+ 'offsetGet' => 'mixed',
+ 'offsetSet' => 'void',
+ 'offsetUnset' => 'void',
+ ],
+ 'Countable' => [
+ 'count' => 'int',
+ ],
+ ];
+}
diff --git a/lib/symfony/polyfill-php70/LICENSE b/lib/symfony/error-handler/LICENSE
similarity index 96%
rename from lib/symfony/polyfill-php70/LICENSE
rename to lib/symfony/error-handler/LICENSE
index 4cd8bdd30..9c907a46a 100644
--- a/lib/symfony/polyfill-php70/LICENSE
+++ b/lib/symfony/error-handler/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015-2019 Fabien Potencier
+Copyright (c) 2019-2022 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/symfony/error-handler/README.md b/lib/symfony/error-handler/README.md
new file mode 100644
index 000000000..12c0bfa6d
--- /dev/null
+++ b/lib/symfony/error-handler/README.md
@@ -0,0 +1,44 @@
+ErrorHandler Component
+======================
+
+The ErrorHandler component provides tools to manage errors and ease debugging PHP code.
+
+Getting Started
+---------------
+
+```
+$ composer require symfony/error-handler
+```
+
+```php
+use Symfony\Component\ErrorHandler\Debug;
+use Symfony\Component\ErrorHandler\ErrorHandler;
+use Symfony\Component\ErrorHandler\DebugClassLoader;
+
+Debug::enable();
+
+// or enable only one feature
+//ErrorHandler::register();
+//DebugClassLoader::enable();
+
+// If you want a custom generic template when debug is not enabled
+// HtmlErrorRenderer::setTemplate('/path/to/custom/error.html.php');
+
+$data = ErrorHandler::call(static function () use ($filename, $datetimeFormat) {
+ // if any code executed inside this anonymous function fails, a PHP exception
+ // will be thrown, even if the code uses the '@' PHP silence operator
+ $data = json_decode(file_get_contents($filename), true);
+ $data['read_at'] = date($datetimeFormat);
+ file_put_contents($filename, json_encode($data));
+
+ return $data;
+});
+```
+
+Resources
+---------
+
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/lib/symfony/error-handler/Resources/assets/css/error.css b/lib/symfony/error-handler/Resources/assets/css/error.css
new file mode 100644
index 000000000..332d81876
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/assets/css/error.css
@@ -0,0 +1,4 @@
+body { background-color: #fff; color: #222; font: 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; }
+.container { margin: 30px; max-width: 600px; }
+h1 { color: #dc3545; font-size: 24px; }
+h2 { font-size: 18px; }
diff --git a/lib/symfony/error-handler/Resources/assets/css/exception.css b/lib/symfony/error-handler/Resources/assets/css/exception.css
new file mode 100644
index 000000000..7cb3206da
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/assets/css/exception.css
@@ -0,0 +1,252 @@
+/* This file is based on WebProfilerBundle/Resources/views/Profiler/profiler.css.twig.
+ If you make any change in this file, verify the same change is needed in the other file. */
+:root {
+ --font-sans-serif: Helvetica, Arial, sans-serif;
+ --page-background: #f9f9f9;
+ --color-text: #222;
+ /* when updating any of these colors, do the same in toolbar.css.twig */
+ --color-success: #4f805d;
+ --color-warning: #a46a1f;
+ --color-error: #b0413e;
+ --color-muted: #999;
+ --tab-background: #fff;
+ --tab-color: #444;
+ --tab-active-background: #666;
+ --tab-active-color: #fafafa;
+ --tab-disabled-background: #f5f5f5;
+ --tab-disabled-color: #999;
+ --metric-value-background: #fff;
+ --metric-value-color: inherit;
+ --metric-unit-color: #999;
+ --metric-label-background: #e0e0e0;
+ --metric-label-color: inherit;
+ --table-border: #e0e0e0;
+ --table-background: #fff;
+ --table-header: #e0e0e0;
+ --trace-selected-background: #F7E5A1;
+ --tree-active-background: #F7E5A1;
+ --exception-title-color: var(--base-2);
+ --shadow: 0px 0px 1px rgba(128, 128, 128, .2);
+ --border: 1px solid #e0e0e0;
+ --background-error: var(--color-error);
+ --highlight-comment: #969896;
+ --highlight-default: #222222;
+ --highlight-keyword: #a71d5d;
+ --highlight-string: #183691;
+ --base-0: #fff;
+ --base-1: #f5f5f5;
+ --base-2: #e0e0e0;
+ --base-3: #ccc;
+ --base-4: #666;
+ --base-5: #444;
+ --base-6: #222;
+}
+
+.theme-dark {
+ --page-background: #36393e;
+ --color-text: #e0e0e0;
+ --color-muted: #777;
+ --color-error: #d43934;
+ --tab-background: #555;
+ --tab-color: #ccc;
+ --tab-active-background: #888;
+ --tab-active-color: #fafafa;
+ --tab-disabled-background: var(--page-background);
+ --tab-disabled-color: #777;
+ --metric-value-background: #555;
+ --metric-value-color: inherit;
+ --metric-unit-color: #999;
+ --metric-label-background: #777;
+ --metric-label-color: #e0e0e0;
+ --trace-selected-background: #71663acc;
+ --table-border: #444;
+ --table-background: #333;
+ --table-header: #555;
+ --info-background: rgba(79, 148, 195, 0.5);
+ --tree-active-background: var(--metric-label-background);
+ --exception-title-color: var(--base-2);
+ --shadow: 0px 0px 1px rgba(32, 32, 32, .2);
+ --border: 1px solid #666;
+ --background-error: #b0413e;
+ --highlight-comment: #dedede;
+ --highlight-default: var(--base-6);
+ --highlight-keyword: #ff413c;
+ --highlight-string: #70a6fd;
+ --base-0: #2e3136;
+ --base-1: #444;
+ --base-2: #666;
+ --base-3: #666;
+ --base-4: #666;
+ --base-5: #e0e0e0;
+ --base-6: #f5f5f5;
+ --card-label-background: var(--tab-active-background);
+ --card-label-color: var(--tab-active-color);
+}
+
+html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}
+
+html {
+ /* always display the vertical scrollbar to avoid jumps when toggling contents */
+ overflow-y: scroll;
+}
+body { background-color: var(--page-background); color: var(--base-6); font: 14px/1.4 Helvetica, Arial, sans-serif; padding-bottom: 45px; }
+
+a { cursor: pointer; text-decoration: none; }
+a:hover { text-decoration: underline; }
+abbr[title] { border-bottom: none; cursor: help; text-decoration: none; }
+
+code, pre { font: 13px/1.5 Consolas, Monaco, Menlo, "Ubuntu Mono", "Liberation Mono", monospace; }
+
+table, tr, th, td { background: var(--base-0); border-collapse: collapse; vertical-align: top; }
+table { background: var(--base-0); border: var(--border); box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); margin: 1em 0; width: 100%; }
+table th, table td { border: solid var(--base-2); border-width: 1px 0; padding: 8px 10px; }
+table th { background-color: var(--base-2); font-weight: bold; text-align: left; }
+
+.m-t-5 { margin-top: 5px; }
+.hidden-xs-down { display: none; }
+.block { display: block; }
+.full-width { width: 100%; }
+.hidden { display: none; }
+.prewrap { white-space: pre-wrap; }
+.nowrap { white-space: nowrap; }
+.newline { display: block; }
+.break-long-words { word-wrap: break-word; overflow-wrap: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; min-width: 0; }
+.text-small { font-size: 12px !important; }
+.text-muted { color: #999; }
+.text-bold { font-weight: bold; }
+.empty { border: 4px dashed var(--base-2); color: #999; margin: 1em 0; padding: .5em 2em; }
+
+.status-success { background: rgba(94, 151, 110, 0.3); }
+.status-warning { background: rgba(240, 181, 24, 0.3); }
+.status-error { background: rgba(176, 65, 62, 0.2); }
+.status-success td, .status-warning td, .status-error td { background: transparent; }
+tr.status-error td, tr.status-warning td { border-bottom: 1px solid var(--base-2); border-top: 1px solid var(--base-2); }
+.status-warning .colored { color: #A46A1F; }
+.status-error .colored { color: var(--color-error); }
+
+.sf-toggle { cursor: pointer; position: relative; }
+.sf-toggle-content { -moz-transition: display .25s ease; -webkit-transition: display .25s ease; transition: display .25s ease; }
+.sf-toggle-content.sf-toggle-hidden { display: none; }
+.sf-toggle-content.sf-toggle-visible { display: block; }
+thead.sf-toggle-content.sf-toggle-visible, tbody.sf-toggle-content.sf-toggle-visible { display: table-row-group; }
+.sf-toggle-off .icon-close, .sf-toggle-on .icon-open { display: none; }
+.sf-toggle-off .icon-open, .sf-toggle-on .icon-close { display: block; }
+
+.tab-navigation { margin: 0 0 1em 0; padding: 0; }
+.tab-navigation li { background: var(--tab-background); border: 1px solid var(--table-border); color: var(--tab-color); cursor: pointer; display: inline-block; font-size: 16px; margin: 0 0 0 -1px; padding: .5em .75em; z-index: 1; }
+.tab-navigation li .badge { background-color: var(--base-1); color: var(--base-4); display: inline-block; font-size: 14px; font-weight: bold; margin-left: 8px; min-width: 10px; padding: 1px 6px; text-align: center; white-space: nowrap; }
+.tab-navigation li.disabled { background: var(--tab-disabled-background); color: var(--tab-disabled-color); }
+.tab-navigation li.active { background: var(--tab-active-background); color: var(--tab-active-color); z-index: 1100; }
+.tab-navigation li.active .badge { background-color: var(--base-5); color: var(--base-2); }
+.tab-content > *:first-child { margin-top: 0; }
+.tab-navigation li .badge.status-warning { background: var(--color-warning); color: #FFF; }
+.tab-navigation li .badge.status-error { background: var(--background-error); color: #FFF; }
+.sf-tabs .tab:not(:first-child) { display: none; }
+
+[data-filters] { position: relative; }
+[data-filtered] { cursor: pointer; }
+[data-filtered]:after { content: '\00a0\25BE'; }
+[data-filtered]:hover .filter-list li { display: inline-flex; }
+[class*="filter-hidden-"] { display: none; }
+.filter-list { position: absolute; border: var(--border); box-shadow: var(--shadow); margin: 0; padding: 0; display: flex; flex-direction: column; }
+.filter-list :after { content: ''; }
+.filter-list li {
+ background: var(--tab-disabled-background);
+ border-bottom: var(--border);
+ color: var(--tab-disabled-color);
+ display: none;
+ list-style: none;
+ margin: 0;
+ padding: 5px 10px;
+ text-align: left;
+ font-weight: normal;
+}
+.filter-list li.active {
+ background: var(--tab-background);
+ color: var(--tab-color);
+}
+.filter-list li.last-active {
+ background: var(--tab-active-background);
+ color: var(--tab-active-color);
+}
+
+.filter-list-level li { cursor: s-resize; }
+.filter-list-level li.active { cursor: n-resize; }
+.filter-list-level li.last-active { cursor: default; }
+.filter-list-level li.last-active:before { content: '\2714\00a0'; }
+.filter-list-choice li:before { content: '\2714\00a0'; color: transparent; }
+.filter-list-choice li.active:before { color: unset; }
+
+.container { max-width: 1024px; margin: 0 auto; padding: 0 15px; }
+.container::after { content: ""; display: table; clear: both; }
+
+header { background-color: #222; color: rgba(255, 255, 255, 0.75); font-size: 13px; height: 33px; line-height: 33px; padding: 0; }
+header .container { display: flex; justify-content: space-between; }
+.logo { flex: 1; font-size: 13px; font-weight: normal; margin: 0; padding: 0; }
+.logo svg { height: 18px; width: 18px; opacity: .8; vertical-align: -5px; }
+
+.help-link { margin-left: 15px; }
+.help-link a { color: inherit; }
+.help-link .icon svg { height: 15px; width: 15px; opacity: .7; vertical-align: -2px; }
+.help-link a:hover { color: #EEE; text-decoration: none; }
+.help-link a:hover svg { opacity: .9; }
+
+.exception-summary { background: var(--background-error); border-bottom: 2px solid rgba(0, 0, 0, 0.1); border-top: 1px solid rgba(0, 0, 0, .3); flex: 0 0 auto; margin-bottom: 15px; }
+.exception-metadata { background: rgba(0, 0, 0, 0.1); padding: 7px 0; }
+.exception-metadata .container { display: flex; flex-direction: row; justify-content: space-between; }
+.exception-metadata h2, .exception-metadata h2 > a { color: rgba(255, 255, 255, 0.8); font-size: 13px; font-weight: 400; margin: 0; }
+.exception-http small { font-size: 13px; opacity: .7; }
+.exception-hierarchy { flex: 1; }
+.exception-hierarchy .icon { margin: 0 3px; opacity: .7; }
+.exception-hierarchy .icon svg { height: 13px; width: 13px; vertical-align: -2px; }
+
+.exception-without-message .exception-message-wrapper { display: none; }
+.exception-message-wrapper .container { display: flex; align-items: flex-start; min-height: 70px; padding: 10px 15px 8px; }
+.exception-message { flex-grow: 1; }
+.exception-message, .exception-message a { color: #FFF; font-size: 21px; font-weight: 400; margin: 0; }
+.exception-message.long { font-size: 18px; }
+.exception-message a { border-bottom: 1px solid rgba(255, 255, 255, 0.5); font-size: inherit; text-decoration: none; }
+.exception-message a:hover { border-bottom-color: #ffffff; }
+
+.exception-illustration { flex-basis: 111px; flex-shrink: 0; height: 66px; margin-left: 15px; opacity: .7; }
+
+.trace + .trace { margin-top: 30px; }
+.trace-head { background-color: var(--base-2); padding: 10px; position: relative; }
+.trace-head .trace-class { color: var(--base-6); font-size: 18px; font-weight: bold; line-height: 1.3; margin: 0; position: relative; }
+.trace-head .trace-namespace { color: #999; display: block; font-size: 13px; }
+.trace-head .icon { position: absolute; right: 0; top: 0; }
+.trace-head .icon svg { fill: var(--base-5); height: 24px; width: 24px; }
+
+.trace-details { background: var(--base-0); border: var(--border); box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); margin: 1em 0; table-layout: fixed; }
+
+.trace-message { font-size: 14px; font-weight: normal; margin: .5em 0 0; }
+
+.trace-line { position: relative; padding-top: 8px; padding-bottom: 8px; }
+.trace-line + .trace-line { border-top: var(--border); }
+.trace-line:hover { background: var(--base-1); }
+.trace-line a { color: var(--base-6); }
+.trace-line .icon { opacity: .4; position: absolute; left: 10px; }
+.trace-line .icon svg { fill: var(--base-5); height: 16px; width: 16px; }
+.trace-line .icon.icon-copy { left: auto; top: auto; padding-left: 5px; display: none }
+.trace-line:hover .icon.icon-copy:not(.hidden) { display: inline-block }
+.trace-line-header { padding-left: 36px; padding-right: 10px; }
+
+.trace-file-path, .trace-file-path a { color: var(--base-6); font-size: 13px; }
+.trace-class { color: var(--color-error); }
+.trace-type { padding: 0 2px; }
+.trace-method { color: var(--color-error); font-weight: bold; }
+.trace-arguments { color: #777; font-weight: normal; padding-left: 2px; }
+
+.trace-code { background: var(--base-0); font-size: 12px; margin: 10px 10px 2px 10px; padding: 10px; overflow-x: auto; white-space: nowrap; }
+.trace-code ol { margin: 0; float: left; }
+.trace-code li { color: #969896; margin: 0; padding-left: 10px; float: left; width: 100%; }
+.trace-code li + li { margin-top: 5px; }
+.trace-code li.selected { background: var(--trace-selected-background); margin-top: 2px; }
+.trace-code li code { color: var(--base-6); white-space: nowrap; }
+
+.trace-as-text .stacktrace { line-height: 1.8; margin: 0 0 15px; white-space: pre-wrap; }
+
+@media (min-width: 575px) {
+ .hidden-xs-down { display: initial; }
+ .help-link { margin-left: 30px; }
+}
diff --git a/lib/symfony/error-handler/Resources/assets/css/exception_full.css b/lib/symfony/error-handler/Resources/assets/css/exception_full.css
new file mode 100644
index 000000000..fa77cb324
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/assets/css/exception_full.css
@@ -0,0 +1,128 @@
+.sf-reset .traces {
+ padding-bottom: 14px;
+}
+.sf-reset .traces li {
+ font-size: 12px;
+ color: #868686;
+ padding: 5px 4px;
+ list-style-type: decimal;
+ margin-left: 20px;
+}
+.sf-reset #logs .traces li.error {
+ font-style: normal;
+ color: #AA3333;
+ background: #f9ecec;
+}
+.sf-reset #logs .traces li.warning {
+ font-style: normal;
+ background: #ffcc00;
+}
+/* fix for Opera not liking empty */
+.sf-reset .traces li:after {
+ content: "\00A0";
+}
+.sf-reset .trace {
+ border: 1px solid #D3D3D3;
+ padding: 10px;
+ overflow: auto;
+ margin: 10px 0 20px;
+}
+.sf-reset .block-exception {
+ -moz-border-radius: 16px;
+ -webkit-border-radius: 16px;
+ border-radius: 16px;
+ margin-bottom: 20px;
+ background-color: #f6f6f6;
+ border: 1px solid #dfdfdf;
+ padding: 30px 28px;
+ word-wrap: break-word;
+ overflow: hidden;
+}
+.sf-reset .block-exception div {
+ color: #313131;
+ font-size: 10px;
+}
+.sf-reset .block-exception-detected .illustration-exception,
+.sf-reset .block-exception-detected .text-exception {
+ float: left;
+}
+.sf-reset .block-exception-detected .illustration-exception {
+ width: 152px;
+}
+.sf-reset .block-exception-detected .text-exception {
+ width: 670px;
+ padding: 30px 44px 24px 46px;
+ position: relative;
+}
+.sf-reset .text-exception .open-quote,
+.sf-reset .text-exception .close-quote {
+ font-family: Arial, Helvetica, sans-serif;
+ position: absolute;
+ color: #C9C9C9;
+ font-size: 8em;
+}
+.sf-reset .open-quote {
+ top: 0;
+ left: 0;
+}
+.sf-reset .close-quote {
+ bottom: -0.5em;
+ right: 50px;
+}
+.sf-reset .block-exception p {
+ font-family: Arial, Helvetica, sans-serif;
+}
+.sf-reset .block-exception p a,
+.sf-reset .block-exception p a:hover {
+ color: #565656;
+}
+.sf-reset .logs h2 {
+ float: left;
+ width: 654px;
+}
+.sf-reset .error-count, .sf-reset .support {
+ float: right;
+ width: 170px;
+ text-align: right;
+}
+.sf-reset .error-count span {
+ display: inline-block;
+ background-color: #aacd4e;
+ -moz-border-radius: 6px;
+ -webkit-border-radius: 6px;
+ border-radius: 6px;
+ padding: 4px;
+ color: white;
+ margin-right: 2px;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.sf-reset .support a {
+ display: inline-block;
+ -moz-border-radius: 6px;
+ -webkit-border-radius: 6px;
+ border-radius: 6px;
+ padding: 4px;
+ color: #000000;
+ margin-right: 2px;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.sf-reset .toggle {
+ vertical-align: middle;
+}
+.sf-reset .linked ul,
+.sf-reset .linked li {
+ display: inline;
+}
+.sf-reset #output-content {
+ color: #000;
+ font-size: 12px;
+}
+.sf-reset #traces-text pre {
+ white-space: pre;
+ font-size: 12px;
+ font-family: monospace;
+}
diff --git a/lib/symfony/twig-bundle/Resources/views/images/chevron-right.svg b/lib/symfony/error-handler/Resources/assets/images/chevron-right.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/chevron-right.svg
rename to lib/symfony/error-handler/Resources/assets/images/chevron-right.svg
diff --git a/lib/symfony/twig-bundle/Resources/views/images/favicon.png.base64 b/lib/symfony/error-handler/Resources/assets/images/favicon.png.base64
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/favicon.png.base64
rename to lib/symfony/error-handler/Resources/assets/images/favicon.png.base64
diff --git a/lib/symfony/twig-bundle/Resources/views/images/icon-book.svg b/lib/symfony/error-handler/Resources/assets/images/icon-book.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/icon-book.svg
rename to lib/symfony/error-handler/Resources/assets/images/icon-book.svg
diff --git a/lib/symfony/error-handler/Resources/assets/images/icon-copy.svg b/lib/symfony/error-handler/Resources/assets/images/icon-copy.svg
new file mode 100644
index 000000000..844a4f99e
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/assets/images/icon-copy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/lib/symfony/twig-bundle/Resources/views/images/icon-minus-square-o.svg b/lib/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/icon-minus-square-o.svg
rename to lib/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg
diff --git a/lib/symfony/twig-bundle/Resources/views/images/icon-minus-square.svg b/lib/symfony/error-handler/Resources/assets/images/icon-minus-square.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/icon-minus-square.svg
rename to lib/symfony/error-handler/Resources/assets/images/icon-minus-square.svg
diff --git a/lib/symfony/twig-bundle/Resources/views/images/icon-plus-square-o.svg b/lib/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/icon-plus-square-o.svg
rename to lib/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg
diff --git a/lib/symfony/twig-bundle/Resources/views/images/icon-plus-square.svg b/lib/symfony/error-handler/Resources/assets/images/icon-plus-square.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/icon-plus-square.svg
rename to lib/symfony/error-handler/Resources/assets/images/icon-plus-square.svg
diff --git a/lib/symfony/twig-bundle/Resources/views/images/icon-support.svg b/lib/symfony/error-handler/Resources/assets/images/icon-support.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/icon-support.svg
rename to lib/symfony/error-handler/Resources/assets/images/icon-support.svg
diff --git a/lib/symfony/twig-bundle/Resources/views/images/symfony-ghost.svg b/lib/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php
similarity index 99%
rename from lib/symfony/twig-bundle/Resources/views/images/symfony-ghost.svg
rename to lib/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php
index 58266bcbf..4b2f9c1b9 100644
--- a/lib/symfony/twig-bundle/Resources/views/images/symfony-ghost.svg
+++ b/lib/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php
@@ -1 +1 @@
-
+ = $this->addElementToGhost(); ?>
diff --git a/lib/symfony/twig-bundle/Resources/views/images/symfony-logo.svg b/lib/symfony/error-handler/Resources/assets/images/symfony-logo.svg
similarity index 100%
rename from lib/symfony/twig-bundle/Resources/views/images/symfony-logo.svg
rename to lib/symfony/error-handler/Resources/assets/images/symfony-logo.svg
diff --git a/lib/symfony/twig-bundle/Resources/views/base_js.html.twig b/lib/symfony/error-handler/Resources/assets/js/exception.js
similarity index 55%
rename from lib/symfony/twig-bundle/Resources/views/base_js.html.twig
rename to lib/symfony/error-handler/Resources/assets/js/exception.js
index 1bc9ccf14..a85409da3 100644
--- a/lib/symfony/twig-bundle/Resources/views/base_js.html.twig
+++ b/lib/symfony/error-handler/Resources/assets/js/exception.js
@@ -1,10 +1,7 @@
-{# This file is based on WebProfilerBundle/Resources/views/Profiler/base_js.html.twig.
- If you make any change in this file, verify the same change is needed in the other file. #}
-
+}
+/*]]>*/
diff --git a/lib/symfony/error-handler/Resources/bin/extract-tentative-return-types.php b/lib/symfony/error-handler/Resources/bin/extract-tentative-return-types.php
new file mode 100644
index 000000000..cc98f58b5
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/bin/extract-tentative-return-types.php
@@ -0,0 +1,80 @@
+#!/usr/bin/env php
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+// Run from the root of the php-src repository, this script generates
+// a table with all the methods that have a tentative return type.
+//
+// Usage: find -name *.stub.php | sort | /path/to/extract-tentative-return-types.php > /path/to/TentativeTypes.php
+
+echo <<
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler\Internal;
+
+/**
+ * This class has been generated by extract-tentative-return-types.php.
+ *
+ * @internal
+ */
+class TentativeTypes
+{
+ public const RETURN_TYPES = [
+
+EOPHP;
+
+while (false !== $file = fgets(\STDIN)) {
+ $code = file_get_contents(substr($file, 0, -1));
+
+ if (!str_contains($code, '@tentative-return-type')) {
+ continue;
+ }
+
+ $code = preg_split('{^\s*(?:(?:abstract )?class|interface|trait) ([^\s]++)}m', $code, -1, \PREG_SPLIT_DELIM_CAPTURE);
+
+ if (1 === count($code)) {
+ continue;
+ }
+
+ for ($i = 1; null !== $class = $code[$i] ?? null; $i += 2) {
+ $methods = $code[1 + $i];
+
+ if (!str_contains($methods, '@tentative-return-type')) {
+ continue;
+ }
+
+ echo " '$class' => [\n";
+
+ preg_replace_callback('{@tentative-return-type.*?[\s]function ([^(]++)[^)]++\)\s*+:\s*+([^\n;\{]++)}s', function ($m) {
+ $m[2] = str_replace(' ', '', $m[2]);
+ echo " '$m[1]' => '$m[2]',\n";
+
+ return '';
+ }, $methods);
+
+ echo " ],\n";
+ }
+}
+
+echo <<
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+if (\in_array('-h', $argv) || \in_array('--help', $argv)) {
+ echo implode(PHP_EOL, [
+ ' Patches type declarations based on "@return" PHPDoc and triggers deprecations for',
+ ' incompatible method declarations.',
+ '',
+ ' This assists you to make your package compatible with Symfony 6, but it can be used',
+ ' for any class/package.',
+ '',
+ ' Available configuration via environment variables:',
+ ' SYMFONY_PATCH_TYPE_DECLARATIONS',
+ ' An url-encoded string to change the behavior of the script. Available parameters:',
+ ' - "force": any value enables deprecation notices - can be any of:',
+ ' - "phpdoc" to patch only docblock annotations',
+ ' - "2" to add all possible return types',
+ ' - "1" to add return types but only to tests/final/internal/private methods',
+ ' - "php": the target version of PHP - e.g. "7.1" doesn\'t generate "object" types',
+ ' - "deprecations": "1" to trigger a deprecation notice when a child class misses a',
+ ' return type while the parent declares an "@return" annotation',
+ '',
+ ' SYMFONY_PATCH_TYPE_EXCLUDE',
+ ' A regex matched against the full path to the class - any match will be excluded',
+ '',
+ ' Example: "SYMFONY_PATCH_TYPE_DECLARATIONS=php=7.4 ./patch-type-declarations"',
+ ]);
+ exit;
+}
+
+if (false === getenv('SYMFONY_PATCH_TYPE_DECLARATIONS')) {
+ putenv('SYMFONY_PATCH_TYPE_DECLARATIONS=force=2');
+ echo 'No SYMFONY_PATCH_TYPE_DECLARATIONS env var set, patching type declarations in all methods (run the command with "-h" for more information).'.PHP_EOL;
+}
+
+if (is_file($autoload = __DIR__.'/../../../../autoload.php')) {
+ // noop
+} elseif (is_file($autoload = __DIR__.'/../../../../../../../autoload.php')) {
+ // noop
+} else {
+ echo PHP_EOL.' /!\ Cannot find the Composer autoloader, did you forget to run "composer install"?'.PHP_EOL;
+ exit(1);
+}
+
+if (is_file($phpunitAutoload = dirname($autoload).'/bin/.phpunit/phpunit/vendor/autoload.php')) {
+ require $phpunitAutoload;
+}
+
+$loader = require $autoload;
+
+Symfony\Component\ErrorHandler\DebugClassLoader::enable();
+
+$deprecations = [];
+set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$deprecations) {
+ if (\E_USER_DEPRECATED !== $type) {
+ return;
+ }
+
+ [,,,,, $class,] = explode('"', $msg);
+ $deprecations[$class][] = $msg;
+});
+
+$exclude = getenv('SYMFONY_PATCH_TYPE_EXCLUDE') ?: null;
+foreach ($loader->getClassMap() as $class => $file) {
+ if (false !== strpos($file = realpath($file), \DIRECTORY_SEPARATOR.'vendor'.\DIRECTORY_SEPARATOR)) {
+ continue;
+ }
+
+ if ($exclude && preg_match($exclude, $file)) {
+ continue;
+ }
+
+ class_exists($class);
+}
+
+Symfony\Component\ErrorHandler\DebugClassLoader::checkClasses();
+
+foreach ($deprecations as $class => $classDeprecations) {
+ echo $class.' ('.\count($classDeprecations).')'.PHP_EOL;
+ echo implode(PHP_EOL, $classDeprecations).PHP_EOL.PHP_EOL;
+}
+
+if ($deprecations && false !== strpos(getenv('SYMFONY_PATCH_TYPE_DECLARATIONS') ?? '', 'force')) {
+ echo 'These deprecations might be fixed by the patch script, run this again to check for type deprecations.'.PHP_EOL;
+}
diff --git a/lib/symfony/error-handler/Resources/views/error.html.php b/lib/symfony/error-handler/Resources/views/error.html.php
new file mode 100644
index 000000000..5416d03c8
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/views/error.html.php
@@ -0,0 +1,20 @@
+
+
+
+
+
+ An Error Occurred: = $statusText; ?>
+
+
+
+
+
Oops! An Error Occurred
+
The server returned a "= $statusCode; ?> = $statusText; ?>".
+
+
+ Something is broken. Please let us know what you were doing when this error occurred.
+ We will fix it as soon as possible. Sorry for any inconvenience caused.
+
+
+
+
diff --git a/lib/symfony/error-handler/Resources/views/exception.html.php b/lib/symfony/error-handler/Resources/views/exception.html.php
new file mode 100644
index 000000000..c3e7a8674
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/views/exception.html.php
@@ -0,0 +1,116 @@
+
+
+
+
+
+
= $this->formatFileFromText(nl2br($exceptionMessage)); ?>
+
+
+ = $this->include('assets/images/symfony-ghost.svg.php'); ?>
+
+
+
+
+
+
+
+
+ toArray();
+ $exceptionWithUserCode = [];
+ $exceptionAsArrayCount = count($exceptionAsArray);
+ $last = $exceptionAsArrayCount - 1;
+ foreach ($exceptionAsArray as $i => $e) {
+ foreach ($e['trace'] as $trace) {
+ if ($trace['file'] && false === mb_strpos($trace['file'], '/vendor/') && false === mb_strpos($trace['file'], '/var/cache/') && $i < $last) {
+ $exceptionWithUserCode[] = $i;
+ }
+ }
+ }
+ ?>
+
+ 1) { ?>
+ Exceptions = $exceptionAsArrayCount; ?>
+
+ Exception
+
+
+
+
+ $e) {
+ echo $this->include('views/traces.html.php', [
+ 'exception' => $e,
+ 'index' => $i + 1,
+ 'expand' => in_array($i, $exceptionWithUserCode, true) || ([] === $exceptionWithUserCode && 0 === $i),
+ ]);
+ }
+ ?>
+
+
+
+
+
+
+ Logs
+ countErrors()) { ?>= $logger->countErrors(); ?>
+
+
+
+ getLogs()) { ?>
+ = $this->include('views/logs.html.php', ['logs' => $logger->getLogs()]); ?>
+
+
+
+
+
+
+
+
+
+ 1) { ?>
+ Stack Traces = $exceptionAsArrayCount; ?>
+
+ Stack Trace
+
+
+
+
+ $e) {
+ echo $this->include('views/traces_text.html.php', [
+ 'exception' => $e,
+ 'index' => $i + 1,
+ 'numExceptions' => $exceptionAsArrayCount,
+ ]);
+ }
+ ?>
+
+
+
+
+
+
Output content
+
+
+ = $currentContent; ?>
+
+
+
+
+
diff --git a/lib/symfony/error-handler/Resources/views/exception_full.html.php b/lib/symfony/error-handler/Resources/views/exception_full.html.php
new file mode 100644
index 000000000..04f0fd579
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/views/exception_full.html.php
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+ = $_message; ?>
+
+
+
+
+
+
+
+
+
+
+
= $this->include('assets/images/symfony-logo.svg'); ?> Symfony Exception
+
+
+
+
+
+
+ = $this->include('views/exception.html.php', $context); ?>
+
+
+
+
+
diff --git a/lib/symfony/error-handler/Resources/views/logs.html.php b/lib/symfony/error-handler/Resources/views/logs.html.php
new file mode 100644
index 000000000..ea6e727b8
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/views/logs.html.php
@@ -0,0 +1,45 @@
+
+
+
+
+ Level
+ Channel
+ Message
+
+
+
+
+ = 400) {
+ $status = 'error';
+ } elseif ($log['priority'] >= 300) {
+ $status = 'warning';
+ } else {
+ $severity = 0;
+ if (($exception = $log['context']['exception'] ?? null) instanceof \ErrorException || $exception instanceof \Symfony\Component\ErrorHandler\Exception\SilencedErrorContext) {
+ $severity = $exception->getSeverity();
+ }
+ $status = \E_DEPRECATED === $severity || \E_USER_DEPRECATED === $severity ? 'warning' : 'normal';
+ } ?>
+ data-filter-channel="= $this->escape($log['channel']); ?>">
+
+ = $this->escape($log['priorityName']); ?>
+ = date('H:i:s', $log['timestamp']); ?>
+
+
+
+ = $this->escape($log['channel']); ?>
+
+
+
+ = $this->formatLogMessage($log['message'], $log['context']); ?>
+
+ = $this->escape(json_encode($log['context'], \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)); ?>
+
+
+
+
+
+
diff --git a/lib/symfony/error-handler/Resources/views/trace.html.php b/lib/symfony/error-handler/Resources/views/trace.html.php
new file mode 100644
index 000000000..8dfdb4ec8
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/views/trace.html.php
@@ -0,0 +1,43 @@
+
+
+
+ = strtr($this->fileExcerpt($trace['file'], $trace['line'], 5), [
+ '#DD0000' => 'var(--highlight-string)',
+ '#007700' => 'var(--highlight-keyword)',
+ '#0000BB' => 'var(--highlight-default)',
+ '#FF8000' => 'var(--highlight-comment)',
+ ]); ?>
+
+
diff --git a/lib/symfony/error-handler/Resources/views/traces.html.php b/lib/symfony/error-handler/Resources/views/traces.html.php
new file mode 100644
index 000000000..f64d91713
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/views/traces.html.php
@@ -0,0 +1,51 @@
+
+
+
+
+
= $this->include('assets/images/icon-minus-square-o.svg'); ?>
+
= $this->include('assets/images/icon-plus-square-o.svg'); ?>
+
+
+
+
+
+
+ = $namespace; ?>
+
+ = $class; ?>
+
+
+ 1) { ?>
+
= $this->escape($exception['message']); ?>
+
+
+
+
+
+ $trace) {
+ $isVendorTrace = $trace['file'] && (false !== mb_strpos($trace['file'], '/vendor/') || false !== mb_strpos($trace['file'], '/var/cache/'));
+ $displayCodeSnippet = $isFirstUserCode && !$isVendorTrace;
+ if ($displayCodeSnippet) {
+ $isFirstUserCode = false;
+ } ?>
+
+ = $this->include('views/trace.html.php', [
+ 'prefix' => $index,
+ 'i' => $i,
+ 'trace' => $trace,
+ 'style' => $isVendorTrace ? 'compact' : ($displayCodeSnippet ? 'expanded' : ''),
+ ]); ?>
+
+
+
+
+
diff --git a/lib/symfony/error-handler/Resources/views/traces_text.html.php b/lib/symfony/error-handler/Resources/views/traces_text.html.php
new file mode 100644
index 000000000..6b478402c
--- /dev/null
+++ b/lib/symfony/error-handler/Resources/views/traces_text.html.php
@@ -0,0 +1,43 @@
+
+
+
+
+
+ 1) { ?>
+ [= $numExceptions - $index + 1; ?>/= $numExceptions; ?>]
+
+ = ($parts = explode('\\', $exception['class'])) ? end($parts) : ''; ?>
+ = $this->include('assets/images/icon-minus-square-o.svg'); ?>
+ = $this->include('assets/images/icon-plus-square-o.svg'); ?>
+
+
+
+
+
+
+
+
+
+
+escape($exception['class']).":\n";
+ if ($exception['message']) {
+ echo $this->escape($exception['message'])."\n";
+ }
+
+ foreach ($exception['trace'] as $trace) {
+ echo "\n ";
+ if ($trace['function']) {
+ echo $this->escape('at '.$trace['class'].$trace['type'].$trace['function']).'('.(isset($trace['args']) ? $this->formatArgsAsText($trace['args']) : '').')';
+ }
+ if ($trace['file'] && $trace['line']) {
+ echo($trace['function'] ? "\n (" : 'at ').strtr(strip_tags($this->formatFile($trace['file'], $trace['line'])), [' at line '.$trace['line'] => '']).':'.$trace['line'].($trace['function'] ? ')' : '');
+ }
+ }
+?>
+
+
+
+
+
+
diff --git a/lib/symfony/error-handler/ThrowableUtils.php b/lib/symfony/error-handler/ThrowableUtils.php
new file mode 100644
index 000000000..18d04988a
--- /dev/null
+++ b/lib/symfony/error-handler/ThrowableUtils.php
@@ -0,0 +1,40 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ErrorHandler;
+
+use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext;
+
+/**
+ * @internal
+ */
+class ThrowableUtils
+{
+ /**
+ * @param SilencedErrorContext|\Throwable
+ */
+ public static function getSeverity($throwable): int
+ {
+ if ($throwable instanceof \ErrorException || $throwable instanceof SilencedErrorContext) {
+ return $throwable->getSeverity();
+ }
+
+ if ($throwable instanceof \ParseError) {
+ return \E_PARSE;
+ }
+
+ if ($throwable instanceof \TypeError) {
+ return \E_RECOVERABLE_ERROR;
+ }
+
+ return \E_ERROR;
+ }
+}
diff --git a/lib/symfony/debug/composer.json b/lib/symfony/error-handler/composer.json
similarity index 51%
rename from lib/symfony/debug/composer.json
rename to lib/symfony/error-handler/composer.json
index 223d2bab3..bc0d88e9d 100644
--- a/lib/symfony/debug/composer.json
+++ b/lib/symfony/error-handler/composer.json
@@ -1,7 +1,7 @@
{
- "name": "symfony/debug",
+ "name": "symfony/error-handler",
"type": "library",
- "description": "Symfony Debug Component",
+ "description": "Provides tools to manage errors and ease debugging PHP code",
"keywords": [],
"homepage": "https://symfony.com",
"license": "MIT",
@@ -16,20 +16,23 @@
}
],
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/log": "~1.0"
- },
- "conflict": {
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ "php": ">=7.2.5",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"require-dev": {
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/serializer": "^4.4|^5.0|^6.0",
+ "symfony/deprecation-contracts": "^2.1|^3"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\Debug\\": "" },
+ "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" },
"exclude-from-classmap": [
"/Tests/"
]
},
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
"minimum-stability": "dev"
}
diff --git a/lib/symfony/console/.gitignore b/lib/symfony/event-dispatcher-contracts/.gitignore
similarity index 100%
rename from lib/symfony/console/.gitignore
rename to lib/symfony/event-dispatcher-contracts/.gitignore
diff --git a/lib/symfony/event-dispatcher-contracts/CHANGELOG.md b/lib/symfony/event-dispatcher-contracts/CHANGELOG.md
new file mode 100644
index 000000000..7932e2613
--- /dev/null
+++ b/lib/symfony/event-dispatcher-contracts/CHANGELOG.md
@@ -0,0 +1,5 @@
+CHANGELOG
+=========
+
+The changelog is maintained for all Symfony contracts at the following URL:
+https://github.com/symfony/contracts/blob/main/CHANGELOG.md
diff --git a/lib/symfony/event-dispatcher/Event.php b/lib/symfony/event-dispatcher-contracts/Event.php
similarity index 74%
rename from lib/symfony/event-dispatcher/Event.php
rename to lib/symfony/event-dispatcher-contracts/Event.php
index 9c56b2f55..46dcb2ba0 100644
--- a/lib/symfony/event-dispatcher/Event.php
+++ b/lib/symfony/event-dispatcher-contracts/Event.php
@@ -9,7 +9,9 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\EventDispatcher;
+namespace Symfony\Contracts\EventDispatcher;
+
+use Psr\EventDispatcher\StoppableEventInterface;
/**
* Event is the base class for classes containing event data.
@@ -24,22 +26,16 @@ namespace Symfony\Component\EventDispatcher;
* @author Jonathan Wage
* @author Roman Borschel
* @author Bernhard Schussek
+ * @author Nicolas Grekas
*/
-class Event
+class Event implements StoppableEventInterface
{
- /**
- * @var bool Whether no further event listeners should be triggered
- */
private $propagationStopped = false;
/**
- * Returns whether further event listeners should be triggered.
- *
- * @see Event::stopPropagation()
- *
- * @return bool Whether propagation was already stopped for this event
+ * {@inheritdoc}
*/
- public function isPropagationStopped()
+ public function isPropagationStopped(): bool
{
return $this->propagationStopped;
}
@@ -51,7 +47,7 @@ class Event
* further event listener will be triggered once any trigger calls
* stopPropagation().
*/
- public function stopPropagation()
+ public function stopPropagation(): void
{
$this->propagationStopped = true;
}
diff --git a/lib/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/lib/symfony/event-dispatcher-contracts/EventDispatcherInterface.php
new file mode 100644
index 000000000..351dc5131
--- /dev/null
+++ b/lib/symfony/event-dispatcher-contracts/EventDispatcherInterface.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\EventDispatcher;
+
+use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface;
+
+/**
+ * Allows providing hooks on domain-specific lifecycles by dispatching events.
+ */
+interface EventDispatcherInterface extends PsrEventDispatcherInterface
+{
+ /**
+ * Dispatches an event to all registered listeners.
+ *
+ * @param object $event The event to pass to the event handlers/listeners
+ * @param string|null $eventName The name of the event to dispatch. If not supplied,
+ * the class of $event should be used instead.
+ *
+ * @return object The passed $event MUST be returned
+ */
+ public function dispatch(object $event, string $eventName = null): object;
+}
diff --git a/lib/symfony/polyfill-php56/LICENSE b/lib/symfony/event-dispatcher-contracts/LICENSE
similarity index 96%
rename from lib/symfony/polyfill-php56/LICENSE
rename to lib/symfony/event-dispatcher-contracts/LICENSE
index 4cd8bdd30..74cdc2dbf 100644
--- a/lib/symfony/polyfill-php56/LICENSE
+++ b/lib/symfony/event-dispatcher-contracts/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015-2019 Fabien Potencier
+Copyright (c) 2018-2022 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/symfony/event-dispatcher-contracts/README.md b/lib/symfony/event-dispatcher-contracts/README.md
new file mode 100644
index 000000000..b1ab4c00c
--- /dev/null
+++ b/lib/symfony/event-dispatcher-contracts/README.md
@@ -0,0 +1,9 @@
+Symfony EventDispatcher Contracts
+=================================
+
+A set of abstractions extracted out of the Symfony components.
+
+Can be used to build on semantics that the Symfony components proved useful - and
+that already have battle tested implementations.
+
+See https://github.com/symfony/contracts/blob/main/README.md for more information.
diff --git a/lib/symfony/event-dispatcher-contracts/composer.json b/lib/symfony/event-dispatcher-contracts/composer.json
new file mode 100644
index 000000000..660df81a0
--- /dev/null
+++ b/lib/symfony/event-dispatcher-contracts/composer.json
@@ -0,0 +1,38 @@
+{
+ "name": "symfony/event-dispatcher-contracts",
+ "type": "library",
+ "description": "Generic abstractions related to dispatching event",
+ "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=7.2.5",
+ "psr/event-dispatcher": "^1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" }
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ }
+}
diff --git a/lib/symfony/event-dispatcher/.gitignore b/lib/symfony/event-dispatcher/.gitignore
deleted file mode 100644
index c49a5d8df..000000000
--- a/lib/symfony/event-dispatcher/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-vendor/
-composer.lock
-phpunit.xml
diff --git a/lib/symfony/event-dispatcher/Attribute/AsEventListener.php b/lib/symfony/event-dispatcher/Attribute/AsEventListener.php
new file mode 100644
index 000000000..bb931b82d
--- /dev/null
+++ b/lib/symfony/event-dispatcher/Attribute/AsEventListener.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher\Attribute;
+
+/**
+ * Service tag to autoconfigure event listeners.
+ *
+ * @author Alexander M. Turek
+ */
+#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
+class AsEventListener
+{
+ public function __construct(
+ public ?string $event = null,
+ public ?string $method = null,
+ public int $priority = 0,
+ public ?string $dispatcher = null,
+ ) {
+ }
+}
diff --git a/lib/symfony/event-dispatcher/CHANGELOG.md b/lib/symfony/event-dispatcher/CHANGELOG.md
index c6aa5389a..0f9859895 100644
--- a/lib/symfony/event-dispatcher/CHANGELOG.md
+++ b/lib/symfony/event-dispatcher/CHANGELOG.md
@@ -1,24 +1,73 @@
CHANGELOG
=========
+5.4
+---
+
+ * Allow `#[AsEventListener]` attribute on methods
+
+5.3
+---
+
+ * Add `#[AsEventListener]` attribute for declaring listeners on PHP 8
+
+5.1.0
+-----
+
+ * The `LegacyEventDispatcherProxy` class has been deprecated.
+ * Added an optional `dispatcher` attribute to the listener and subscriber tags in `RegisterListenerPass`.
+
+5.0.0
+-----
+
+ * The signature of the `EventDispatcherInterface::dispatch()` method has been changed to `dispatch($event, string $eventName = null): object`.
+ * The `Event` class has been removed in favor of `Symfony\Contracts\EventDispatcher\Event`.
+ * The `TraceableEventDispatcherInterface` has been removed.
+ * The `WrappedListener` class is now final.
+
+4.4.0
+-----
+
+ * `AddEventAliasesPass` has been added, allowing applications and bundles to extend the event alias mapping used by `RegisterListenersPass`.
+ * Made the `event` attribute of the `kernel.event_listener` tag optional for FQCN events.
+
+4.3.0
+-----
+
+ * The signature of the `EventDispatcherInterface::dispatch()` method should be updated to `dispatch($event, string $eventName = null)`, not doing so is deprecated
+ * deprecated the `Event` class, use `Symfony\Contracts\EventDispatcher\Event` instead
+
+4.1.0
+-----
+
+ * added support for invokable event listeners tagged with `kernel.event_listener` by default
+ * The `TraceableEventDispatcher::getOrphanedEvents()` method has been added.
+ * The `TraceableEventDispatcherInterface` has been deprecated.
+
+4.0.0
+-----
+
+ * removed the `ContainerAwareEventDispatcher` class
+ * added the `reset()` method to the `TraceableEventDispatcherInterface`
+
3.4.0
-----
- * Implementing `TraceableEventDispatcherInterface` without the `reset()` method has been deprecated.
+ * Implementing `TraceableEventDispatcherInterface` without the `reset()` method has been deprecated.
3.3.0
-----
- * The ContainerAwareEventDispatcher class has been deprecated. Use EventDispatcher with closure factories instead.
+ * The ContainerAwareEventDispatcher class has been deprecated. Use EventDispatcher with closure factories instead.
3.0.0
-----
- * The method `getListenerPriority($eventName, $listener)` has been added to the
- `EventDispatcherInterface`.
- * The methods `Event::setDispatcher()`, `Event::getDispatcher()`, `Event::setName()`
- and `Event::getName()` have been removed.
- The event dispatcher and the event name are passed to the listener call.
+ * The method `getListenerPriority($eventName, $listener)` has been added to the
+ `EventDispatcherInterface`.
+ * The methods `Event::setDispatcher()`, `Event::getDispatcher()`, `Event::setName()`
+ and `Event::getName()` have been removed.
+ The event dispatcher and the event name are passed to the listener call.
2.5.0
-----
diff --git a/lib/symfony/event-dispatcher/ContainerAwareEventDispatcher.php b/lib/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
deleted file mode 100644
index cbb9b12a6..000000000
--- a/lib/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
+++ /dev/null
@@ -1,198 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\EventDispatcher;
-
-use PHPUnit\Framework\MockObject\MockObject;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Lazily loads listeners and subscribers from the dependency injection
- * container.
- *
- * @author Fabien Potencier
- * @author Bernhard Schussek
- * @author Jordan Alliot
- *
- * @deprecated since 3.3, to be removed in 4.0. Use EventDispatcher with closure factories instead.
- */
-class ContainerAwareEventDispatcher extends EventDispatcher
-{
- private $container;
-
- /**
- * The service IDs of the event listeners and subscribers.
- */
- private $listenerIds = [];
-
- /**
- * The services registered as listeners.
- */
- private $listeners = [];
-
- public function __construct(ContainerInterface $container)
- {
- $this->container = $container;
-
- $class = static::class;
- if ($this instanceof \PHPUnit_Framework_MockObject_MockObject || $this instanceof MockObject || $this instanceof \Prophecy\Doubler\DoubleInterface) {
- $class = get_parent_class($class);
- }
- if (__CLASS__ !== $class) {
- @trigger_error(sprintf('The %s class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead.', __CLASS__), \E_USER_DEPRECATED);
- }
- }
-
- /**
- * Adds a service as event listener.
- *
- * @param string $eventName Event for which the listener is added
- * @param array $callback The service ID of the listener service & the method
- * name that has to be called
- * @param int $priority The higher this value, the earlier an event listener
- * will be triggered in the chain.
- * Defaults to 0.
- *
- * @throws \InvalidArgumentException
- */
- public function addListenerService($eventName, $callback, $priority = 0)
- {
- @trigger_error(sprintf('The %s class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead.', __CLASS__), \E_USER_DEPRECATED);
-
- if (!\is_array($callback) || 2 !== \count($callback)) {
- throw new \InvalidArgumentException('Expected an ["service", "method"] argument.');
- }
-
- $this->listenerIds[$eventName][] = [$callback[0], $callback[1], $priority];
- }
-
- public function removeListener($eventName, $listener)
- {
- $this->lazyLoad($eventName);
-
- if (isset($this->listenerIds[$eventName])) {
- foreach ($this->listenerIds[$eventName] as $i => list($serviceId, $method)) {
- $key = $serviceId.'.'.$method;
- if (isset($this->listeners[$eventName][$key]) && $listener === [$this->listeners[$eventName][$key], $method]) {
- unset($this->listeners[$eventName][$key]);
- if (empty($this->listeners[$eventName])) {
- unset($this->listeners[$eventName]);
- }
- unset($this->listenerIds[$eventName][$i]);
- if (empty($this->listenerIds[$eventName])) {
- unset($this->listenerIds[$eventName]);
- }
- }
- }
- }
-
- parent::removeListener($eventName, $listener);
- }
-
- /**
- * {@inheritdoc}
- */
- public function hasListeners($eventName = null)
- {
- if (null === $eventName) {
- return $this->listenerIds || $this->listeners || parent::hasListeners();
- }
-
- if (isset($this->listenerIds[$eventName])) {
- return true;
- }
-
- return parent::hasListeners($eventName);
- }
-
- /**
- * {@inheritdoc}
- */
- public function getListeners($eventName = null)
- {
- if (null === $eventName) {
- foreach ($this->listenerIds as $serviceEventName => $args) {
- $this->lazyLoad($serviceEventName);
- }
- } else {
- $this->lazyLoad($eventName);
- }
-
- return parent::getListeners($eventName);
- }
-
- /**
- * {@inheritdoc}
- */
- public function getListenerPriority($eventName, $listener)
- {
- $this->lazyLoad($eventName);
-
- return parent::getListenerPriority($eventName, $listener);
- }
-
- /**
- * Adds a service as event subscriber.
- *
- * @param string $serviceId The service ID of the subscriber service
- * @param string $class The service's class name (which must implement EventSubscriberInterface)
- */
- public function addSubscriberService($serviceId, $class)
- {
- @trigger_error(sprintf('The %s class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead.', __CLASS__), \E_USER_DEPRECATED);
-
- foreach ($class::getSubscribedEvents() as $eventName => $params) {
- if (\is_string($params)) {
- $this->listenerIds[$eventName][] = [$serviceId, $params, 0];
- } elseif (\is_string($params[0])) {
- $this->listenerIds[$eventName][] = [$serviceId, $params[0], isset($params[1]) ? $params[1] : 0];
- } else {
- foreach ($params as $listener) {
- $this->listenerIds[$eventName][] = [$serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0];
- }
- }
- }
- }
-
- public function getContainer()
- {
- @trigger_error('The '.__METHOD__.'() method is deprecated since Symfony 3.3 as its class will be removed in 4.0. Inject the container or the services you need in your listeners/subscribers instead.', \E_USER_DEPRECATED);
-
- return $this->container;
- }
-
- /**
- * Lazily loads listeners for this event from the dependency injection
- * container.
- *
- * @param string $eventName The name of the event to dispatch. The name of
- * the event is the name of the method that is
- * invoked on listeners.
- */
- protected function lazyLoad($eventName)
- {
- if (isset($this->listenerIds[$eventName])) {
- foreach ($this->listenerIds[$eventName] as list($serviceId, $method, $priority)) {
- $listener = $this->container->get($serviceId);
-
- $key = $serviceId.'.'.$method;
- if (!isset($this->listeners[$eventName][$key])) {
- $this->addListener($eventName, [$listener, $method], $priority);
- } elseif ($this->listeners[$eventName][$key] !== $listener) {
- parent::removeListener($eventName, [$this->listeners[$eventName][$key], $method]);
- $this->addListener($eventName, [$listener, $method], $priority);
- }
-
- $this->listeners[$eventName][$key] = $listener;
- }
- }
- }
-}
diff --git a/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
index 017459723..acfbf619c 100644
--- a/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
+++ b/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
@@ -11,11 +11,14 @@
namespace Symfony\Component\EventDispatcher\Debug;
+use Psr\EventDispatcher\StoppableEventInterface;
use Psr\Log\LoggerInterface;
-use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Contracts\Service\ResetInterface;
/**
* Collects some data about event listeners.
@@ -24,27 +27,35 @@ use Symfony\Component\Stopwatch\Stopwatch;
*
* @author Fabien Potencier
*/
-class TraceableEventDispatcher implements TraceableEventDispatcherInterface
+class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterface
{
protected $logger;
protected $stopwatch;
+ /**
+ * @var \SplObjectStorage
+ */
private $callStack;
private $dispatcher;
private $wrappedListeners;
+ private $orphanedEvents;
+ private $requestStack;
+ private $currentRequestHash = '';
- public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null)
+ public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null, RequestStack $requestStack = null)
{
$this->dispatcher = $dispatcher;
$this->stopwatch = $stopwatch;
$this->logger = $logger;
$this->wrappedListeners = [];
+ $this->orphanedEvents = [];
+ $this->requestStack = $requestStack;
}
/**
* {@inheritdoc}
*/
- public function addListener($eventName, $listener, $priority = 0)
+ public function addListener(string $eventName, $listener, int $priority = 0)
{
$this->dispatcher->addListener($eventName, $listener, $priority);
}
@@ -60,11 +71,11 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function removeListener($eventName, $listener)
+ public function removeListener(string $eventName, $listener)
{
if (isset($this->wrappedListeners[$eventName])) {
foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) {
- if ($wrappedListener->getWrappedListener() === $listener) {
+ if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) {
$listener = $wrappedListener;
unset($this->wrappedListeners[$eventName][$index]);
break;
@@ -86,7 +97,7 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function getListeners($eventName = null)
+ public function getListeners(string $eventName = null)
{
return $this->dispatcher->getListeners($eventName);
}
@@ -94,13 +105,13 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function getListenerPriority($eventName, $listener)
+ public function getListenerPriority(string $eventName, $listener)
{
// we might have wrapped listeners for the event (if called while dispatching)
// in that case get the priority by wrapper
if (isset($this->wrappedListeners[$eventName])) {
- foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) {
- if ($wrappedListener->getWrappedListener() === $listener) {
+ foreach ($this->wrappedListeners[$eventName] as $wrappedListener) {
+ if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) {
return $this->dispatcher->getListenerPriority($eventName, $wrappedListener);
}
}
@@ -112,7 +123,7 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function hasListeners($eventName = null)
+ public function hasListeners(string $eventName = null)
{
return $this->dispatcher->hasListeners($eventName);
}
@@ -120,36 +131,37 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function dispatch($eventName, Event $event = null)
+ public function dispatch(object $event, string $eventName = null): object
{
+ $eventName = $eventName ?? \get_class($event);
+
if (null === $this->callStack) {
$this->callStack = new \SplObjectStorage();
}
- if (null === $event) {
- $event = new Event();
- }
+ $currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? spl_object_hash($request) : '';
- if (null !== $this->logger && $event->isPropagationStopped()) {
+ if (null !== $this->logger && $event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
$this->logger->debug(sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName));
}
$this->preProcess($eventName);
try {
- $this->preDispatch($eventName, $event);
+ $this->beforeDispatch($eventName, $event);
try {
$e = $this->stopwatch->start($eventName, 'section');
try {
- $this->dispatcher->dispatch($eventName, $event);
+ $this->dispatcher->dispatch($event, $eventName);
} finally {
if ($e->isStarted()) {
$e->stop();
}
}
} finally {
- $this->postDispatch($eventName, $event);
+ $this->afterDispatch($eventName, $event);
}
} finally {
+ $this->currentRequestHash = $currentRequestHash;
$this->postProcess($eventName);
}
@@ -157,28 +169,30 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
}
/**
- * {@inheritdoc}
+ * @return array
*/
- public function getCalledListeners()
+ public function getCalledListeners(Request $request = null)
{
if (null === $this->callStack) {
return [];
}
+ $hash = $request ? spl_object_hash($request) : null;
$called = [];
foreach ($this->callStack as $listener) {
- list($eventName) = $this->callStack->getInfo();
-
- $called[] = $listener->getInfo($eventName);
+ [$eventName, $requestHash] = $this->callStack->getInfo();
+ if (null === $hash || $hash === $requestHash) {
+ $called[] = $listener->getInfo($eventName);
+ }
}
return $called;
}
/**
- * {@inheritdoc}
+ * @return array
*/
- public function getNotCalledListeners()
+ public function getNotCalledListeners(Request $request = null)
{
try {
$allListeners = $this->getListeners();
@@ -191,11 +205,16 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
return [];
}
+ $hash = $request ? spl_object_hash($request) : null;
$calledListeners = [];
if (null !== $this->callStack) {
foreach ($this->callStack as $calledListener) {
- $calledListeners[] = $calledListener->getWrappedListener();
+ [, $requestHash] = $this->callStack->getInfo();
+
+ if (null === $hash || $hash === $requestHash) {
+ $calledListeners[] = $calledListener->getWrappedListener();
+ }
}
}
@@ -216,9 +235,24 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
return $notCalled;
}
+ public function getOrphanedEvents(Request $request = null): array
+ {
+ if ($request) {
+ return $this->orphanedEvents[spl_object_hash($request)] ?? [];
+ }
+
+ if (!$this->orphanedEvents) {
+ return [];
+ }
+
+ return array_merge(...array_values($this->orphanedEvents));
+ }
+
public function reset()
{
$this->callStack = null;
+ $this->orphanedEvents = [];
+ $this->currentRequestHash = '';
}
/**
@@ -229,44 +263,44 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
*
* @return mixed
*/
- public function __call($method, $arguments)
+ public function __call(string $method, array $arguments)
{
- return \call_user_func_array([$this->dispatcher, $method], $arguments);
+ return $this->dispatcher->{$method}(...$arguments);
}
/**
* Called before dispatching the event.
- *
- * @param string $eventName The event name
- * @param Event $event The event
*/
- protected function preDispatch($eventName, Event $event)
+ protected function beforeDispatch(string $eventName, object $event)
{
}
/**
* Called after dispatching the event.
- *
- * @param string $eventName The event name
- * @param Event $event The event
*/
- protected function postDispatch($eventName, Event $event)
+ protected function afterDispatch(string $eventName, object $event)
{
}
- private function preProcess($eventName)
+ private function preProcess(string $eventName): void
{
+ if (!$this->dispatcher->hasListeners($eventName)) {
+ $this->orphanedEvents[$this->currentRequestHash][] = $eventName;
+
+ return;
+ }
+
foreach ($this->dispatcher->getListeners($eventName) as $listener) {
$priority = $this->getListenerPriority($eventName, $listener);
$wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this);
$this->wrappedListeners[$eventName][] = $wrappedListener;
$this->dispatcher->removeListener($eventName, $listener);
$this->dispatcher->addListener($eventName, $wrappedListener, $priority);
- $this->callStack->attach($wrappedListener, [$eventName]);
+ $this->callStack->attach($wrappedListener, [$eventName, $this->currentRequestHash]);
}
}
- private function postProcess($eventName)
+ private function postProcess(string $eventName): void
{
unset($this->wrappedListeners[$eventName]);
$skipped = false;
diff --git a/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php b/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php
deleted file mode 100644
index f0212753b..000000000
--- a/lib/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php
+++ /dev/null
@@ -1,36 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\EventDispatcher\Debug;
-
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
-
-/**
- * @author Fabien Potencier
- *
- * @method reset() Resets the trace.
- */
-interface TraceableEventDispatcherInterface extends EventDispatcherInterface
-{
- /**
- * Gets the called listeners.
- *
- * @return array An array of called listeners
- */
- public function getCalledListeners();
-
- /**
- * Gets the not called listeners.
- *
- * @return array An array of not called listeners
- */
- public function getNotCalledListeners();
-}
diff --git a/lib/symfony/event-dispatcher/Debug/WrappedListener.php b/lib/symfony/event-dispatcher/Debug/WrappedListener.php
index de2b85095..3916716ec 100644
--- a/lib/symfony/event-dispatcher/Debug/WrappedListener.php
+++ b/lib/symfony/event-dispatcher/Debug/WrappedListener.php
@@ -11,7 +11,7 @@
namespace Symfony\Component\EventDispatcher\Debug;
-use Symfony\Component\EventDispatcher\Event;
+use Psr\EventDispatcher\StoppableEventInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\VarDumper\Caster\ClassStub;
@@ -19,9 +19,10 @@ use Symfony\Component\VarDumper\Caster\ClassStub;
/**
* @author Fabien Potencier
*/
-class WrappedListener
+final class WrappedListener
{
private $listener;
+ private $optimizedListener;
private $name;
private $called;
private $stoppedPropagation;
@@ -32,20 +33,21 @@ class WrappedListener
private $priority;
private static $hasClassStub;
- public function __construct($listener, $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null)
+ public function __construct($listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null)
{
$this->listener = $listener;
+ $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null);
$this->stopwatch = $stopwatch;
$this->dispatcher = $dispatcher;
$this->called = false;
$this->stoppedPropagation = false;
if (\is_array($listener)) {
- $this->name = \is_object($listener[0]) ? \get_class($listener[0]) : $listener[0];
+ $this->name = \is_object($listener[0]) ? get_debug_type($listener[0]) : $listener[0];
$this->pretty = $this->name.'::'.$listener[1];
} elseif ($listener instanceof \Closure) {
$r = new \ReflectionFunction($listener);
- if (false !== strpos($r->name, '{closure}')) {
+ if (str_contains($r->name, '{closure}')) {
$this->pretty = $this->name = 'closure';
} elseif ($class = $r->getClosureScopeClass()) {
$this->name = $class->name;
@@ -56,7 +58,7 @@ class WrappedListener
} elseif (\is_string($listener)) {
$this->pretty = $this->name = $listener;
} else {
- $this->name = \get_class($listener);
+ $this->name = get_debug_type($listener);
$this->pretty = $this->name.'::__invoke';
}
@@ -74,22 +76,22 @@ class WrappedListener
return $this->listener;
}
- public function wasCalled()
+ public function wasCalled(): bool
{
return $this->called;
}
- public function stoppedPropagation()
+ public function stoppedPropagation(): bool
{
return $this->stoppedPropagation;
}
- public function getPretty()
+ public function getPretty(): string
{
return $this->pretty;
}
- public function getInfo($eventName)
+ public function getInfo(string $eventName): array
{
if (null === $this->stub) {
$this->stub = self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->listener) : $this->pretty.'()';
@@ -103,7 +105,7 @@ class WrappedListener
];
}
- public function __invoke(Event $event, $eventName, EventDispatcherInterface $dispatcher)
+ public function __invoke(object $event, string $eventName, EventDispatcherInterface $dispatcher): void
{
$dispatcher = $this->dispatcher ?: $dispatcher;
@@ -112,13 +114,13 @@ class WrappedListener
$e = $this->stopwatch->start($this->name, 'event_listener');
- \call_user_func($this->listener, $event, $eventName, $dispatcher);
+ ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher);
if ($e->isStarted()) {
$e->stop();
}
- if ($event->isPropagationStopped()) {
+ if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
$this->stoppedPropagation = true;
}
}
diff --git a/lib/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php b/lib/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php
new file mode 100644
index 000000000..6e7292b4a
--- /dev/null
+++ b/lib/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php
@@ -0,0 +1,46 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * This pass allows bundles to extend the list of event aliases.
+ *
+ * @author Alexander M. Turek
+ */
+class AddEventAliasesPass implements CompilerPassInterface
+{
+ private $eventAliases;
+ private $eventAliasesParameter;
+
+ public function __construct(array $eventAliases, string $eventAliasesParameter = 'event_dispatcher.event_aliases')
+ {
+ if (1 < \func_num_args()) {
+ trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
+ }
+
+ $this->eventAliases = $eventAliases;
+ $this->eventAliasesParameter = $eventAliasesParameter;
+ }
+
+ public function process(ContainerBuilder $container): void
+ {
+ $eventAliases = $container->hasParameter($this->eventAliasesParameter) ? $container->getParameter($this->eventAliasesParameter) : [];
+
+ $container->setParameter(
+ $this->eventAliasesParameter,
+ array_merge($eventAliases, $this->eventAliases)
+ );
+ }
+}
diff --git a/lib/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/lib/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php
index 2951c1ee4..8eabe7d74 100644
--- a/lib/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php
+++ b/lib/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php
@@ -18,6 +18,7 @@ use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Contracts\EventDispatcher\Event;
/**
* Compiler pass to register tagged services for an event dispatcher.
@@ -27,26 +28,51 @@ class RegisterListenersPass implements CompilerPassInterface
protected $dispatcherService;
protected $listenerTag;
protected $subscriberTag;
+ protected $eventAliasesParameter;
private $hotPathEvents = [];
- private $hotPathTagName;
+ private $hotPathTagName = 'container.hot_path';
+ private $noPreloadEvents = [];
+ private $noPreloadTagName = 'container.no_preload';
- /**
- * @param string $dispatcherService Service name of the event dispatcher in processed container
- * @param string $listenerTag Tag name used for listener
- * @param string $subscriberTag Tag name used for subscribers
- */
- public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber')
+ public function __construct(string $dispatcherService = 'event_dispatcher', string $listenerTag = 'kernel.event_listener', string $subscriberTag = 'kernel.event_subscriber', string $eventAliasesParameter = 'event_dispatcher.event_aliases')
{
+ if (0 < \func_num_args()) {
+ trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__);
+ }
+
$this->dispatcherService = $dispatcherService;
$this->listenerTag = $listenerTag;
$this->subscriberTag = $subscriberTag;
+ $this->eventAliasesParameter = $eventAliasesParameter;
}
- public function setHotPathEvents(array $hotPathEvents, $tagName = 'container.hot_path')
+ /**
+ * @return $this
+ */
+ public function setHotPathEvents(array $hotPathEvents)
{
$this->hotPathEvents = array_flip($hotPathEvents);
- $this->hotPathTagName = $tagName;
+
+ if (1 < \func_num_args()) {
+ trigger_deprecation('symfony/event-dispatcher', '5.4', 'Configuring "$tagName" in "%s" is deprecated.', __METHOD__);
+ $this->hotPathTagName = func_get_arg(1);
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function setNoPreloadEvents(array $noPreloadEvents): self
+ {
+ $this->noPreloadEvents = array_flip($noPreloadEvents);
+
+ if (1 < \func_num_args()) {
+ trigger_deprecation('symfony/event-dispatcher', '5.4', 'Configuring "$tagName" in "%s" is deprecated.', __METHOD__);
+ $this->noPreloadTagName = func_get_arg(1);
+ }
return $this;
}
@@ -57,35 +83,65 @@ class RegisterListenersPass implements CompilerPassInterface
return;
}
- $definition = $container->findDefinition($this->dispatcherService);
+ $aliases = [];
+
+ if ($container->hasParameter($this->eventAliasesParameter)) {
+ $aliases = $container->getParameter($this->eventAliasesParameter);
+ }
+
+ $globalDispatcherDefinition = $container->findDefinition($this->dispatcherService);
foreach ($container->findTaggedServiceIds($this->listenerTag, true) as $id => $events) {
+ $noPreload = 0;
+
foreach ($events as $event) {
- $priority = isset($event['priority']) ? $event['priority'] : 0;
+ $priority = $event['priority'] ?? 0;
if (!isset($event['event'])) {
- throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag));
+ if ($container->getDefinition($id)->hasTag($this->subscriberTag)) {
+ continue;
+ }
+
+ $event['method'] = $event['method'] ?? '__invoke';
+ $event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']);
}
+ $event['event'] = $aliases[$event['event']] ?? $event['event'];
+
if (!isset($event['method'])) {
$event['method'] = 'on'.preg_replace_callback([
- '/(?<=\b)[a-z]/i',
+ '/(?<=\b|_)[a-z]/i',
'/[^a-z0-9]/i',
], function ($matches) { return strtoupper($matches[0]); }, $event['event']);
$event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);
+
+ if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method']) && $r->hasMethod('__invoke')) {
+ $event['method'] = '__invoke';
+ }
}
- $definition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]);
+ $dispatcherDefinition = $globalDispatcherDefinition;
+ if (isset($event['dispatcher'])) {
+ $dispatcherDefinition = $container->getDefinition($event['dispatcher']);
+ }
+
+ $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]);
if (isset($this->hotPathEvents[$event['event']])) {
$container->getDefinition($id)->addTag($this->hotPathTagName);
+ } elseif (isset($this->noPreloadEvents[$event['event']])) {
+ ++$noPreload;
}
}
+
+ if ($noPreload && \count($events) === $noPreload) {
+ $container->getDefinition($id)->addTag($this->noPreloadTagName);
+ }
}
$extractingDispatcher = new ExtractingEventDispatcher();
- foreach ($container->findTaggedServiceIds($this->subscriberTag, true) as $id => $attributes) {
+ foreach ($container->findTaggedServiceIds($this->subscriberTag, true) as $id => $tags) {
$def = $container->getDefinition($id);
// We must assume that the class value has been correctly filled, even if the service is created by a factory
@@ -99,19 +155,59 @@ class RegisterListenersPass implements CompilerPassInterface
}
$class = $r->name;
+ $dispatcherDefinitions = [];
+ foreach ($tags as $attributes) {
+ if (!isset($attributes['dispatcher']) || isset($dispatcherDefinitions[$attributes['dispatcher']])) {
+ continue;
+ }
+
+ $dispatcherDefinitions[$attributes['dispatcher']] = $container->getDefinition($attributes['dispatcher']);
+ }
+
+ if (!$dispatcherDefinitions) {
+ $dispatcherDefinitions = [$globalDispatcherDefinition];
+ }
+
+ $noPreload = 0;
+ ExtractingEventDispatcher::$aliases = $aliases;
ExtractingEventDispatcher::$subscriber = $class;
$extractingDispatcher->addSubscriber($extractingDispatcher);
foreach ($extractingDispatcher->listeners as $args) {
$args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]];
- $definition->addMethodCall('addListener', $args);
+ foreach ($dispatcherDefinitions as $dispatcherDefinition) {
+ $dispatcherDefinition->addMethodCall('addListener', $args);
+ }
if (isset($this->hotPathEvents[$args[0]])) {
$container->getDefinition($id)->addTag($this->hotPathTagName);
+ } elseif (isset($this->noPreloadEvents[$args[0]])) {
+ ++$noPreload;
}
}
+ if ($noPreload && \count($extractingDispatcher->listeners) === $noPreload) {
+ $container->getDefinition($id)->addTag($this->noPreloadTagName);
+ }
$extractingDispatcher->listeners = [];
+ ExtractingEventDispatcher::$aliases = [];
}
}
+
+ private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method): string
+ {
+ if (
+ null === ($class = $container->getDefinition($id)->getClass())
+ || !($r = $container->getReflectionClass($class, false))
+ || !$r->hasMethod($method)
+ || 1 > ($m = $r->getMethod($method))->getNumberOfParameters()
+ || !($type = $m->getParameters()[0]->getType()) instanceof \ReflectionNamedType
+ || $type->isBuiltin()
+ || Event::class === ($name = $type->getName())
+ ) {
+ throw new InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag));
+ }
+
+ return $name;
+ }
}
/**
@@ -121,17 +217,22 @@ class ExtractingEventDispatcher extends EventDispatcher implements EventSubscrib
{
public $listeners = [];
+ public static $aliases = [];
public static $subscriber;
- public function addListener($eventName, $listener, $priority = 0)
+ public function addListener(string $eventName, $listener, int $priority = 0)
{
$this->listeners[] = [$eventName, $listener[1], $priority];
}
- public static function getSubscribedEvents()
+ public static function getSubscribedEvents(): array
{
- $callback = [self::$subscriber, 'getSubscribedEvents'];
+ $events = [];
- return $callback();
+ foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) {
+ $events[self::$aliases[$eventName] ?? $eventName] = $params;
+ }
+
+ return $events;
}
}
diff --git a/lib/symfony/event-dispatcher/EventDispatcher.php b/lib/symfony/event-dispatcher/EventDispatcher.php
index 207790f06..8fe8fb5c2 100644
--- a/lib/symfony/event-dispatcher/EventDispatcher.php
+++ b/lib/symfony/event-dispatcher/EventDispatcher.php
@@ -11,6 +11,9 @@
namespace Symfony\Component\EventDispatcher;
+use Psr\EventDispatcher\StoppableEventInterface;
+use Symfony\Component\EventDispatcher\Debug\WrappedListener;
+
/**
* The EventDispatcherInterface is the central point of Symfony's event listener system.
*
@@ -30,18 +33,30 @@ class EventDispatcher implements EventDispatcherInterface
{
private $listeners = [];
private $sorted = [];
+ private $optimized;
+
+ public function __construct()
+ {
+ if (__CLASS__ === static::class) {
+ $this->optimized = [];
+ }
+ }
/**
* {@inheritdoc}
*/
- public function dispatch($eventName, Event $event = null)
+ public function dispatch(object $event, string $eventName = null): object
{
- if (null === $event) {
- $event = new Event();
+ $eventName = $eventName ?? \get_class($event);
+
+ if (null !== $this->optimized) {
+ $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName));
+ } else {
+ $listeners = $this->getListeners($eventName);
}
- if ($listeners = $this->getListeners($eventName)) {
- $this->doDispatch($listeners, $eventName, $event);
+ if ($listeners) {
+ $this->callListeners($listeners, $eventName, $event);
}
return $event;
@@ -50,7 +65,7 @@ class EventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function getListeners($eventName = null)
+ public function getListeners(string $eventName = null)
{
if (null !== $eventName) {
if (empty($this->listeners[$eventName])) {
@@ -76,23 +91,24 @@ class EventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function getListenerPriority($eventName, $listener)
+ public function getListenerPriority(string $eventName, $listener)
{
if (empty($this->listeners[$eventName])) {
return null;
}
- if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
+ if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
$listener[0] = $listener[0]();
+ $listener[1] = $listener[1] ?? '__invoke';
}
- foreach ($this->listeners[$eventName] as $priority => $listeners) {
- foreach ($listeners as $k => $v) {
- if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
+ foreach ($this->listeners[$eventName] as $priority => &$listeners) {
+ foreach ($listeners as &$v) {
+ if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) {
$v[0] = $v[0]();
- $this->listeners[$eventName][$priority][$k] = $v;
+ $v[1] = $v[1] ?? '__invoke';
}
- if ($v === $listener) {
+ if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) {
return $priority;
}
}
@@ -104,7 +120,7 @@ class EventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function hasListeners($eventName = null)
+ public function hasListeners(string $eventName = null)
{
if (null !== $eventName) {
return !empty($this->listeners[$eventName]);
@@ -122,40 +138,38 @@ class EventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function addListener($eventName, $listener, $priority = 0)
+ public function addListener(string $eventName, $listener, int $priority = 0)
{
$this->listeners[$eventName][$priority][] = $listener;
- unset($this->sorted[$eventName]);
+ unset($this->sorted[$eventName], $this->optimized[$eventName]);
}
/**
* {@inheritdoc}
*/
- public function removeListener($eventName, $listener)
+ public function removeListener(string $eventName, $listener)
{
if (empty($this->listeners[$eventName])) {
return;
}
- if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
+ if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
$listener[0] = $listener[0]();
+ $listener[1] = $listener[1] ?? '__invoke';
}
- foreach ($this->listeners[$eventName] as $priority => $listeners) {
- foreach ($listeners as $k => $v) {
- if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
+ foreach ($this->listeners[$eventName] as $priority => &$listeners) {
+ foreach ($listeners as $k => &$v) {
+ if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) {
$v[0] = $v[0]();
+ $v[1] = $v[1] ?? '__invoke';
}
- if ($v === $listener) {
- unset($listeners[$k], $this->sorted[$eventName]);
- } else {
- $listeners[$k] = $v;
+ if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) {
+ unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]);
}
}
- if ($listeners) {
- $this->listeners[$eventName][$priority] = $listeners;
- } else {
+ if (!$listeners) {
unset($this->listeners[$eventName][$priority]);
}
}
@@ -170,10 +184,10 @@ class EventDispatcher implements EventDispatcherInterface
if (\is_string($params)) {
$this->addListener($eventName, [$subscriber, $params]);
} elseif (\is_string($params[0])) {
- $this->addListener($eventName, [$subscriber, $params[0]], isset($params[1]) ? $params[1] : 0);
+ $this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0);
} else {
foreach ($params as $listener) {
- $this->addListener($eventName, [$subscriber, $listener[0]], isset($listener[1]) ? $listener[1] : 0);
+ $this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0);
}
}
}
@@ -203,36 +217,64 @@ class EventDispatcher implements EventDispatcherInterface
*
* @param callable[] $listeners The event listeners
* @param string $eventName The name of the event to dispatch
- * @param Event $event The event object to pass to the event handlers/listeners
+ * @param object $event The event object to pass to the event handlers/listeners
*/
- protected function doDispatch($listeners, $eventName, Event $event)
+ protected function callListeners(iterable $listeners, string $eventName, object $event)
{
+ $stoppable = $event instanceof StoppableEventInterface;
+
foreach ($listeners as $listener) {
- if ($event->isPropagationStopped()) {
+ if ($stoppable && $event->isPropagationStopped()) {
break;
}
- \call_user_func($listener, $event, $eventName, $this);
+ $listener($event, $eventName, $this);
}
}
/**
* Sorts the internal list of listeners for the given event by priority.
- *
- * @param string $eventName The name of the event
*/
- private function sortListeners($eventName)
+ private function sortListeners(string $eventName)
{
krsort($this->listeners[$eventName]);
$this->sorted[$eventName] = [];
- foreach ($this->listeners[$eventName] as $priority => $listeners) {
- foreach ($listeners as $k => $listener) {
- if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
+ foreach ($this->listeners[$eventName] as &$listeners) {
+ foreach ($listeners as $k => &$listener) {
+ if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
$listener[0] = $listener[0]();
- $this->listeners[$eventName][$priority][$k] = $listener;
+ $listener[1] = $listener[1] ?? '__invoke';
}
$this->sorted[$eventName][] = $listener;
}
}
}
+
+ /**
+ * Optimizes the internal list of listeners for the given event by priority.
+ */
+ private function optimizeListeners(string $eventName): array
+ {
+ krsort($this->listeners[$eventName]);
+ $this->optimized[$eventName] = [];
+
+ foreach ($this->listeners[$eventName] as &$listeners) {
+ foreach ($listeners as &$listener) {
+ $closure = &$this->optimized[$eventName][];
+ if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
+ $closure = static function (...$args) use (&$listener, &$closure) {
+ if ($listener[0] instanceof \Closure) {
+ $listener[0] = $listener[0]();
+ $listener[1] = $listener[1] ?? '__invoke';
+ }
+ ($closure = \Closure::fromCallable($listener))(...$args);
+ };
+ } else {
+ $closure = $listener instanceof \Closure || $listener instanceof WrappedListener ? $listener : \Closure::fromCallable($listener);
+ }
+ }
+ }
+
+ return $this->optimized[$eventName];
+ }
}
diff --git a/lib/symfony/event-dispatcher/EventDispatcherInterface.php b/lib/symfony/event-dispatcher/EventDispatcherInterface.php
index bde753a12..cc324e1c6 100644
--- a/lib/symfony/event-dispatcher/EventDispatcherInterface.php
+++ b/lib/symfony/event-dispatcher/EventDispatcherInterface.php
@@ -11,6 +11,8 @@
namespace Symfony\Component\EventDispatcher;
+use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface;
+
/**
* The EventDispatcherInterface is the central point of Symfony's event listener system.
* Listeners are registered on the manager and events are dispatched through the
@@ -18,30 +20,15 @@ namespace Symfony\Component\EventDispatcher;
*
* @author Bernhard Schussek
*/
-interface EventDispatcherInterface
+interface EventDispatcherInterface extends ContractsEventDispatcherInterface
{
- /**
- * Dispatches an event to all registered listeners.
- *
- * @param string $eventName The name of the event to dispatch. The name of
- * the event is the name of the method that is
- * invoked on listeners.
- * @param Event|null $event The event to pass to the event handlers/listeners
- * If not supplied, an empty Event instance is created
- *
- * @return Event
- */
- public function dispatch($eventName, Event $event = null);
-
/**
* Adds an event listener that listens on the specified events.
*
- * @param string $eventName The event to listen on
- * @param callable $listener The listener
- * @param int $priority The higher this value, the earlier an event
- * listener will be triggered in the chain (defaults to 0)
+ * @param int $priority The higher this value, the earlier an event
+ * listener will be triggered in the chain (defaults to 0)
*/
- public function addListener($eventName, $listener, $priority = 0);
+ public function addListener(string $eventName, callable $listener, int $priority = 0);
/**
* Adds an event subscriber.
@@ -53,41 +40,31 @@ interface EventDispatcherInterface
/**
* Removes an event listener from the specified events.
- *
- * @param string $eventName The event to remove a listener from
- * @param callable $listener The listener to remove
*/
- public function removeListener($eventName, $listener);
+ public function removeListener(string $eventName, callable $listener);
public function removeSubscriber(EventSubscriberInterface $subscriber);
/**
* Gets the listeners of a specific event or all listeners sorted by descending priority.
*
- * @param string|null $eventName The name of the event
- *
- * @return array The event listeners for the specified event, or all event listeners by event name
+ * @return array
*/
- public function getListeners($eventName = null);
+ public function getListeners(string $eventName = null);
/**
* Gets the listener priority for a specific event.
*
* Returns null if the event or the listener does not exist.
*
- * @param string $eventName The name of the event
- * @param callable $listener The listener
- *
- * @return int|null The event listener priority
+ * @return int|null
*/
- public function getListenerPriority($eventName, $listener);
+ public function getListenerPriority(string $eventName, callable $listener);
/**
* Checks whether an event has any registered listeners.
*
- * @param string|null $eventName The name of the event
- *
- * @return bool true if the specified event has any listeners, false otherwise
+ * @return bool
*/
- public function hasListeners($eventName = null);
+ public function hasListeners(string $eventName = null);
}
diff --git a/lib/symfony/event-dispatcher/EventSubscriberInterface.php b/lib/symfony/event-dispatcher/EventSubscriberInterface.php
index 741590b1b..2085e428e 100644
--- a/lib/symfony/event-dispatcher/EventSubscriberInterface.php
+++ b/lib/symfony/event-dispatcher/EventSubscriberInterface.php
@@ -43,7 +43,7 @@ interface EventSubscriberInterface
* The code must not depend on runtime state as it will only be called at compile time.
* All logic depending on runtime state must be put into the individual methods handling the events.
*
- * @return array The event names to listen to
+ * @return array>
*/
public static function getSubscribedEvents();
}
diff --git a/lib/symfony/event-dispatcher/GenericEvent.php b/lib/symfony/event-dispatcher/GenericEvent.php
index f005e3a3d..b32a301ae 100644
--- a/lib/symfony/event-dispatcher/GenericEvent.php
+++ b/lib/symfony/event-dispatcher/GenericEvent.php
@@ -11,12 +11,17 @@
namespace Symfony\Component\EventDispatcher;
+use Symfony\Contracts\EventDispatcher\Event;
+
/**
* Event encapsulation class.
*
* Encapsulates events thus decoupling the observer from the subject they encapsulate.
*
* @author Drak
+ *
+ * @implements \ArrayAccess
+ * @implements \IteratorAggregate
*/
class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
{
@@ -38,7 +43,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
/**
* Getter for subject property.
*
- * @return mixed The observer subject
+ * @return mixed
*/
public function getSubject()
{
@@ -48,13 +53,11 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
/**
* Get argument by key.
*
- * @param string $key Key
- *
- * @return mixed Contents of array key
+ * @return mixed
*
* @throws \InvalidArgumentException if key is not found
*/
- public function getArgument($key)
+ public function getArgument(string $key)
{
if ($this->hasArgument($key)) {
return $this->arguments[$key];
@@ -66,12 +69,11 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
/**
* Add argument to event.
*
- * @param string $key Argument name
- * @param mixed $value Value
+ * @param mixed $value Value
*
* @return $this
*/
- public function setArgument($key, $value)
+ public function setArgument(string $key, $value)
{
$this->arguments[$key] = $value;
@@ -91,8 +93,6 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
/**
* Set args property.
*
- * @param array $args Arguments
- *
* @return $this
*/
public function setArguments(array $args = [])
@@ -105,11 +105,9 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
/**
* Has argument.
*
- * @param string $key Key of arguments array
- *
* @return bool
*/
- public function hasArgument($key)
+ public function hasArgument(string $key)
{
return \array_key_exists($key, $this->arguments);
}
@@ -123,6 +121,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
*
* @throws \InvalidArgumentException if key does not exist in $this->args
*/
+ #[\ReturnTypeWillChange]
public function offsetGet($key)
{
return $this->getArgument($key);
@@ -133,7 +132,10 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
*
* @param string $key Array key to set
* @param mixed $value Value
+ *
+ * @return void
*/
+ #[\ReturnTypeWillChange]
public function offsetSet($key, $value)
{
$this->setArgument($key, $value);
@@ -143,7 +145,10 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
* ArrayAccess for unset argument.
*
* @param string $key Array key
+ *
+ * @return void
*/
+ #[\ReturnTypeWillChange]
public function offsetUnset($key)
{
if ($this->hasArgument($key)) {
@@ -158,6 +163,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
*
* @return bool
*/
+ #[\ReturnTypeWillChange]
public function offsetExists($key)
{
return $this->hasArgument($key);
@@ -166,8 +172,9 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
/**
* IteratorAggregate for iterating over the object like an array.
*
- * @return \ArrayIterator
+ * @return \ArrayIterator
*/
+ #[\ReturnTypeWillChange]
public function getIterator()
{
return new \ArrayIterator($this->arguments);
diff --git a/lib/symfony/event-dispatcher/ImmutableEventDispatcher.php b/lib/symfony/event-dispatcher/ImmutableEventDispatcher.php
index b3cf56c50..568d79c3a 100644
--- a/lib/symfony/event-dispatcher/ImmutableEventDispatcher.php
+++ b/lib/symfony/event-dispatcher/ImmutableEventDispatcher.php
@@ -28,15 +28,15 @@ class ImmutableEventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function dispatch($eventName, Event $event = null)
+ public function dispatch(object $event, string $eventName = null): object
{
- return $this->dispatcher->dispatch($eventName, $event);
+ return $this->dispatcher->dispatch($event, $eventName);
}
/**
* {@inheritdoc}
*/
- public function addListener($eventName, $listener, $priority = 0)
+ public function addListener(string $eventName, $listener, int $priority = 0)
{
throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
}
@@ -52,7 +52,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function removeListener($eventName, $listener)
+ public function removeListener(string $eventName, $listener)
{
throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
}
@@ -68,7 +68,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function getListeners($eventName = null)
+ public function getListeners(string $eventName = null)
{
return $this->dispatcher->getListeners($eventName);
}
@@ -76,7 +76,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function getListenerPriority($eventName, $listener)
+ public function getListenerPriority(string $eventName, $listener)
{
return $this->dispatcher->getListenerPriority($eventName, $listener);
}
@@ -84,7 +84,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface
/**
* {@inheritdoc}
*/
- public function hasListeners($eventName = null)
+ public function hasListeners(string $eventName = null)
{
return $this->dispatcher->hasListeners($eventName);
}
diff --git a/lib/symfony/event-dispatcher/LICENSE b/lib/symfony/event-dispatcher/LICENSE
index 9e936ec04..88bf75bb4 100644
--- a/lib/symfony/event-dispatcher/LICENSE
+++ b/lib/symfony/event-dispatcher/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2020 Fabien Potencier
+Copyright (c) 2004-2022 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/symfony/event-dispatcher/LegacyEventDispatcherProxy.php b/lib/symfony/event-dispatcher/LegacyEventDispatcherProxy.php
new file mode 100644
index 000000000..6e17c8fcc
--- /dev/null
+++ b/lib/symfony/event-dispatcher/LegacyEventDispatcherProxy.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
+
+trigger_deprecation('symfony/event-dispatcher', '5.1', '%s is deprecated, use the event dispatcher without the proxy.', LegacyEventDispatcherProxy::class);
+
+/**
+ * A helper class to provide BC/FC with the legacy signature of EventDispatcherInterface::dispatch().
+ *
+ * @author Nicolas Grekas
+ *
+ * @deprecated since Symfony 5.1
+ */
+final class LegacyEventDispatcherProxy
+{
+ public static function decorate(?EventDispatcherInterface $dispatcher): ?EventDispatcherInterface
+ {
+ return $dispatcher;
+ }
+}
diff --git a/lib/symfony/event-dispatcher/README.md b/lib/symfony/event-dispatcher/README.md
index e0d38eed0..dcdb68d21 100644
--- a/lib/symfony/event-dispatcher/README.md
+++ b/lib/symfony/event-dispatcher/README.md
@@ -8,8 +8,8 @@ them.
Resources
---------
- * [Documentation](https://symfony.com/doc/current/components/event_dispatcher.html)
- * [Contributing](https://symfony.com/doc/current/contributing/index.html)
- * [Report issues](https://github.com/symfony/symfony/issues) and
- [send Pull Requests](https://github.com/symfony/symfony/pulls)
- in the [main Symfony repository](https://github.com/symfony/symfony)
+ * [Documentation](https://symfony.com/doc/current/components/event_dispatcher.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/lib/symfony/event-dispatcher/composer.json b/lib/symfony/event-dispatcher/composer.json
index 408022f6b..32b42e408 100644
--- a/lib/symfony/event-dispatcher/composer.json
+++ b/lib/symfony/event-dispatcher/composer.json
@@ -1,7 +1,7 @@
{
"name": "symfony/event-dispatcher",
"type": "library",
- "description": "Symfony EventDispatcher Component",
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"keywords": [],
"homepage": "https://symfony.com",
"license": "MIT",
@@ -16,18 +16,27 @@
}
],
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/event-dispatcher-contracts": "^2|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"require-dev": {
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/config": "~2.8|~3.0|~4.0",
- "symfony/debug": "~3.4|~4.4",
- "symfony/stopwatch": "~2.8|~3.0|~4.0",
- "psr/log": "~1.0"
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
+ "psr/log": "^1|^2|^3"
},
"conflict": {
- "symfony/dependency-injection": "<3.3"
+ "symfony/dependency-injection": "<4.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0"
},
"suggest": {
"symfony/dependency-injection": "",
diff --git a/lib/symfony/event-dispatcher/phpunit.xml.dist b/lib/symfony/event-dispatcher/phpunit.xml.dist
deleted file mode 100644
index f2eb1692c..000000000
--- a/lib/symfony/event-dispatcher/phpunit.xml.dist
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
- ./Tests/
-
-
-
-
-
- ./
-
- ./Resources
- ./Tests
- ./vendor
-
-
-
-
diff --git a/lib/symfony/filesystem/.gitignore b/lib/symfony/filesystem/.gitignore
deleted file mode 100644
index c49a5d8df..000000000
--- a/lib/symfony/filesystem/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-vendor/
-composer.lock
-phpunit.xml
diff --git a/lib/symfony/filesystem/CHANGELOG.md b/lib/symfony/filesystem/CHANGELOG.md
index d01f5f45e..fcb7170ca 100644
--- a/lib/symfony/filesystem/CHANGELOG.md
+++ b/lib/symfony/filesystem/CHANGELOG.md
@@ -1,6 +1,35 @@
CHANGELOG
=========
+5.4
+---
+
+ * Add `Path` class
+ * Add `$lock` argument to `Filesystem::appendToFile()`
+
+5.0.0
+-----
+
+ * `Filesystem::dumpFile()` and `appendToFile()` don't accept arrays anymore
+
+4.4.0
+-----
+
+ * support for passing a `null` value to `Filesystem::isAbsolutePath()` is deprecated and will be removed in 5.0
+ * `tempnam()` now accepts a third argument `$suffix`.
+
+4.3.0
+-----
+
+ * support for passing arrays to `Filesystem::dumpFile()` is deprecated and will be removed in 5.0
+ * support for passing arrays to `Filesystem::appendToFile()` is deprecated and will be removed in 5.0
+
+4.0.0
+-----
+
+ * removed `LockHandler`
+ * Support for passing relative paths to `Filesystem::makePathRelative()` has been removed.
+
3.4.0
-----
diff --git a/lib/symfony/filesystem/Exception/ExceptionInterface.php b/lib/symfony/filesystem/Exception/ExceptionInterface.php
index 8f4f10aac..fc438d9f3 100644
--- a/lib/symfony/filesystem/Exception/ExceptionInterface.php
+++ b/lib/symfony/filesystem/Exception/ExceptionInterface.php
@@ -16,6 +16,6 @@ namespace Symfony\Component\Filesystem\Exception;
*
* @author Romain Neutron
*/
-interface ExceptionInterface
+interface ExceptionInterface extends \Throwable
{
}
diff --git a/lib/symfony/filesystem/Exception/FileNotFoundException.php b/lib/symfony/filesystem/Exception/FileNotFoundException.php
index bcc8fe81f..48b640809 100644
--- a/lib/symfony/filesystem/Exception/FileNotFoundException.php
+++ b/lib/symfony/filesystem/Exception/FileNotFoundException.php
@@ -19,7 +19,7 @@ namespace Symfony\Component\Filesystem\Exception;
*/
class FileNotFoundException extends IOException
{
- public function __construct($message = null, $code = 0, \Exception $previous = null, $path = null)
+ public function __construct(string $message = null, int $code = 0, \Throwable $previous = null, string $path = null)
{
if (null === $message) {
if (null === $path) {
diff --git a/lib/symfony/filesystem/Exception/IOException.php b/lib/symfony/filesystem/Exception/IOException.php
index 144e0e602..fea26e4dd 100644
--- a/lib/symfony/filesystem/Exception/IOException.php
+++ b/lib/symfony/filesystem/Exception/IOException.php
@@ -22,7 +22,7 @@ class IOException extends \RuntimeException implements IOExceptionInterface
{
private $path;
- public function __construct($message, $code = 0, \Exception $previous = null, $path = null)
+ public function __construct(string $message, int $code = 0, \Throwable $previous = null, string $path = null)
{
$this->path = $path;
diff --git a/lib/symfony/filesystem/Exception/IOExceptionInterface.php b/lib/symfony/filesystem/Exception/IOExceptionInterface.php
index f9d4644a8..42829ab6c 100644
--- a/lib/symfony/filesystem/Exception/IOExceptionInterface.php
+++ b/lib/symfony/filesystem/Exception/IOExceptionInterface.php
@@ -21,7 +21,7 @@ interface IOExceptionInterface extends ExceptionInterface
/**
* Returns the associated path for the exception.
*
- * @return string|null The path
+ * @return string|null
*/
public function getPath();
}
diff --git a/lib/symfony/filesystem/Exception/InvalidArgumentException.php b/lib/symfony/filesystem/Exception/InvalidArgumentException.php
new file mode 100644
index 000000000..abadc2002
--- /dev/null
+++ b/lib/symfony/filesystem/Exception/InvalidArgumentException.php
@@ -0,0 +1,19 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem\Exception;
+
+/**
+ * @author Christian Flothmann
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/lib/symfony/filesystem/Exception/RuntimeException.php b/lib/symfony/filesystem/Exception/RuntimeException.php
new file mode 100644
index 000000000..a7512dca7
--- /dev/null
+++ b/lib/symfony/filesystem/Exception/RuntimeException.php
@@ -0,0 +1,19 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem\Exception;
+
+/**
+ * @author ThƩo Fidry
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
diff --git a/lib/symfony/filesystem/Filesystem.php b/lib/symfony/filesystem/Filesystem.php
index 96b2e9600..785e71636 100644
--- a/lib/symfony/filesystem/Filesystem.php
+++ b/lib/symfony/filesystem/Filesystem.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Filesystem;
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
+use Symfony\Component\Filesystem\Exception\InvalidArgumentException;
use Symfony\Component\Filesystem\Exception\IOException;
/**
@@ -30,14 +31,10 @@ class Filesystem
* If the target file is newer, it is overwritten only when the
* $overwriteNewerFiles option is set to true.
*
- * @param string $originFile The original filename
- * @param string $targetFile The target filename
- * @param bool $overwriteNewerFiles If true, target files newer than origin files are overwritten
- *
* @throws FileNotFoundException When originFile doesn't exist
* @throws IOException When copy fails
*/
- public function copy($originFile, $targetFile, $overwriteNewerFiles = false)
+ public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = false)
{
$originIsLocal = stream_is_local($originFile) || 0 === stripos($originFile, 'file://');
if ($originIsLocal && !is_file($originFile)) {
@@ -53,13 +50,13 @@ class Filesystem
if ($doCopy) {
// https://bugs.php.net/64634
- if (false === $source = @fopen($originFile, 'r')) {
- throw new IOException(sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading.', $originFile, $targetFile), 0, null, $originFile);
+ if (!$source = self::box('fopen', $originFile, 'r')) {
+ throw new IOException(sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile);
}
// Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default
- if (false === $target = @fopen($targetFile, 'w', null, stream_context_create(['ftp' => ['overwrite' => true]]))) {
- throw new IOException(sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing.', $originFile, $targetFile), 0, null, $originFile);
+ if (!$target = self::box('fopen', $targetFile, 'w', false, stream_context_create(['ftp' => ['overwrite' => true]]))) {
+ throw new IOException(sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile);
}
$bytesCopied = stream_copy_to_stream($source, $target);
@@ -73,7 +70,7 @@ class Filesystem
if ($originIsLocal) {
// Like `cp`, preserve executable permission bits
- @chmod($targetFile, fileperms($targetFile) | (fileperms($originFile) & 0111));
+ self::box('chmod', $targetFile, fileperms($targetFile) | (fileperms($originFile) & 0111));
if ($bytesCopied !== $bytesOrigin = filesize($originFile)) {
throw new IOException(sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile);
@@ -86,25 +83,18 @@ class Filesystem
* Creates a directory recursively.
*
* @param string|iterable $dirs The directory path
- * @param int $mode The directory mode
*
* @throws IOException On any directory creation failure
*/
- public function mkdir($dirs, $mode = 0777)
+ public function mkdir($dirs, int $mode = 0777)
{
foreach ($this->toIterable($dirs) as $dir) {
if (is_dir($dir)) {
continue;
}
- if (!self::box('mkdir', $dir, $mode, true)) {
- if (!is_dir($dir)) {
- // The directory was not created by a concurrent process. Let's throw an exception with a developer friendly error message if we have one
- if (self::$lastError) {
- throw new IOException(sprintf('Failed to create "%s": ', $dir).self::$lastError, 0, null, $dir);
- }
- throw new IOException(sprintf('Failed to create "%s".', $dir), 0, null, $dir);
- }
+ if (!self::box('mkdir', $dir, $mode, true) && !is_dir($dir)) {
+ throw new IOException(sprintf('Failed to create "%s": ', $dir).self::$lastError, 0, null, $dir);
}
}
}
@@ -114,7 +104,7 @@ class Filesystem
*
* @param string|iterable $files A filename, an array of files, or a \Traversable instance to check
*
- * @return bool true if the file exists, false otherwise
+ * @return bool
*/
public function exists($files)
{
@@ -142,12 +132,11 @@ class Filesystem
*
* @throws IOException When touch fails
*/
- public function touch($files, $time = null, $atime = null)
+ public function touch($files, int $time = null, int $atime = null)
{
foreach ($this->toIterable($files) as $file) {
- $touch = $time ? @touch($file, $time, $atime) : @touch($file);
- if (true !== $touch) {
- throw new IOException(sprintf('Failed to touch "%s".', $file), 0, null, $file);
+ if (!($time ? self::box('touch', $file, $time, $atime) : self::box('touch', $file))) {
+ throw new IOException(sprintf('Failed to touch "%s": ', $file).self::$lastError, 0, null, $file);
}
}
}
@@ -166,6 +155,12 @@ class Filesystem
} elseif (!\is_array($files)) {
$files = [$files];
}
+
+ self::doRemove($files, false);
+ }
+
+ private static function doRemove(array $files, bool $isRecursive): void
+ {
$files = array_reverse($files);
foreach ($files as $file) {
if (is_link($file)) {
@@ -174,12 +169,37 @@ class Filesystem
throw new IOException(sprintf('Failed to remove symlink "%s": ', $file).self::$lastError);
}
} elseif (is_dir($file)) {
- $this->remove(new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS));
+ if (!$isRecursive) {
+ $tmpName = \dirname(realpath($file)).'/.'.strrev(strtr(base64_encode(random_bytes(2)), '/=', '-.'));
- if (!self::box('rmdir', $file) && file_exists($file)) {
- throw new IOException(sprintf('Failed to remove directory "%s": ', $file).self::$lastError);
+ if (file_exists($tmpName)) {
+ try {
+ self::doRemove([$tmpName], true);
+ } catch (IOException $e) {
+ }
+ }
+
+ if (!file_exists($tmpName) && self::box('rename', $file, $tmpName)) {
+ $origFile = $file;
+ $file = $tmpName;
+ } else {
+ $origFile = null;
+ }
}
- } elseif (!self::box('unlink', $file) && (false !== strpos(self::$lastError, 'Permission denied') || file_exists($file))) {
+
+ $files = new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS);
+ self::doRemove(iterator_to_array($files, true), true);
+
+ if (!self::box('rmdir', $file) && file_exists($file) && !$isRecursive) {
+ $lastError = self::$lastError;
+
+ if (null !== $origFile && self::box('rename', $file, $origFile)) {
+ $file = $origFile;
+ }
+
+ throw new IOException(sprintf('Failed to remove directory "%s": ', $file).$lastError);
+ }
+ } elseif (!self::box('unlink', $file) && (str_contains(self::$lastError, 'Permission denied') || file_exists($file))) {
throw new IOException(sprintf('Failed to remove file "%s": ', $file).self::$lastError);
}
}
@@ -195,11 +215,11 @@ class Filesystem
*
* @throws IOException When the change fails
*/
- public function chmod($files, $mode, $umask = 0000, $recursive = false)
+ public function chmod($files, int $mode, int $umask = 0000, bool $recursive = false)
{
foreach ($this->toIterable($files) as $file) {
- if ((\PHP_VERSION_ID < 80000 || \is_int($mode)) && true !== @chmod($file, $mode & ~$umask)) {
- throw new IOException(sprintf('Failed to chmod file "%s".', $file), 0, null, $file);
+ if ((\PHP_VERSION_ID < 80000 || \is_int($mode)) && !self::box('chmod', $file, $mode & ~$umask)) {
+ throw new IOException(sprintf('Failed to chmod file "%s": ', $file).self::$lastError, 0, null, $file);
}
if ($recursive && is_dir($file) && !is_link($file)) {
$this->chmod(new \FilesystemIterator($file), $mode, $umask, true);
@@ -216,19 +236,19 @@ class Filesystem
*
* @throws IOException When the change fails
*/
- public function chown($files, $user, $recursive = false)
+ public function chown($files, $user, bool $recursive = false)
{
foreach ($this->toIterable($files) as $file) {
if ($recursive && is_dir($file) && !is_link($file)) {
$this->chown(new \FilesystemIterator($file), $user, true);
}
if (is_link($file) && \function_exists('lchown')) {
- if (true !== @lchown($file, $user)) {
- throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file);
+ if (!self::box('lchown', $file, $user)) {
+ throw new IOException(sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file);
}
} else {
- if (true !== @chown($file, $user)) {
- throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file);
+ if (!self::box('chown', $file, $user)) {
+ throw new IOException(sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file);
}
}
}
@@ -243,19 +263,19 @@ class Filesystem
*
* @throws IOException When the change fails
*/
- public function chgrp($files, $group, $recursive = false)
+ public function chgrp($files, $group, bool $recursive = false)
{
foreach ($this->toIterable($files) as $file) {
if ($recursive && is_dir($file) && !is_link($file)) {
$this->chgrp(new \FilesystemIterator($file), $group, true);
}
if (is_link($file) && \function_exists('lchgrp')) {
- if (true !== @lchgrp($file, $group) || (\defined('HHVM_VERSION') && !posix_getgrnam($group))) {
- throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file);
+ if (!self::box('lchgrp', $file, $group)) {
+ throw new IOException(sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file);
}
} else {
- if (true !== @chgrp($file, $group)) {
- throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file);
+ if (!self::box('chgrp', $file, $group)) {
+ throw new IOException(sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file);
}
}
}
@@ -264,21 +284,17 @@ class Filesystem
/**
* Renames a file or a directory.
*
- * @param string $origin The origin filename or directory
- * @param string $target The new filename or directory
- * @param bool $overwrite Whether to overwrite the target if it already exists
- *
* @throws IOException When target file or directory already exists
* @throws IOException When origin cannot be renamed
*/
- public function rename($origin, $target, $overwrite = false)
+ public function rename(string $origin, string $target, bool $overwrite = false)
{
// we check that target does not exist
if (!$overwrite && $this->isReadable($target)) {
throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
}
- if (true !== @rename($origin, $target)) {
+ if (!self::box('rename', $origin, $target)) {
if (is_dir($origin)) {
// See https://bugs.php.net/54097 & https://php.net/rename#113943
$this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]);
@@ -286,20 +302,16 @@ class Filesystem
return;
}
- throw new IOException(sprintf('Cannot rename "%s" to "%s".', $origin, $target), 0, null, $target);
+ throw new IOException(sprintf('Cannot rename "%s" to "%s": ', $origin, $target).self::$lastError, 0, null, $target);
}
}
/**
* Tells whether a file exists and is readable.
*
- * @param string $filename Path to the file
- *
- * @return bool
- *
* @throws IOException When windows path is longer than 258 characters
*/
- private function isReadable($filename)
+ private function isReadable(string $filename): bool
{
$maxPathLength = \PHP_MAXPATHLEN - 2;
@@ -313,14 +325,12 @@ class Filesystem
/**
* Creates a symbolic link or copy a directory.
*
- * @param string $originDir The origin directory path
- * @param string $targetDir The symbolic link name
- * @param bool $copyOnWindows Whether to copy files if on Windows
- *
* @throws IOException When symlink fails
*/
- public function symlink($originDir, $targetDir, $copyOnWindows = false)
+ public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false)
{
+ self::assertFunctionExists('symlink');
+
if ('\\' === \DIRECTORY_SEPARATOR) {
$originDir = strtr($originDir, '/', '\\');
$targetDir = strtr($targetDir, '/', '\\');
@@ -349,14 +359,15 @@ class Filesystem
/**
* Creates a hard link, or several hard links to a file.
*
- * @param string $originFile The original file
* @param string|string[] $targetFiles The target file(s)
*
* @throws FileNotFoundException When original file is missing or not a file
* @throws IOException When link fails, including if link already exists
*/
- public function hardlink($originFile, $targetFiles)
+ public function hardlink(string $originFile, $targetFiles)
{
+ self::assertFunctionExists('link');
+
if (!$this->exists($originFile)) {
throw new FileNotFoundException(null, 0, null, $originFile);
}
@@ -380,18 +391,16 @@ class Filesystem
}
/**
- * @param string $origin
- * @param string $target
* @param string $linkType Name of the link type, typically 'symbolic' or 'hard'
*/
- private function linkException($origin, $target, $linkType)
+ private function linkException(string $origin, string $target, string $linkType)
{
if (self::$lastError) {
- if ('\\' === \DIRECTORY_SEPARATOR && false !== strpos(self::$lastError, 'error code(1314)')) {
+ if ('\\' === \DIRECTORY_SEPARATOR && str_contains(self::$lastError, 'error code(1314)')) {
throw new IOException(sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target);
}
}
- throw new IOException(sprintf('Failed to create "%s" link from "%s" to "%s".', $linkType, $origin, $target), 0, null, $target);
+ throw new IOException(sprintf('Failed to create "%s" link from "%s" to "%s": ', $linkType, $origin, $target).self::$lastError, 0, null, $target);
}
/**
@@ -405,12 +414,9 @@ class Filesystem
* - if $path does not exist, returns null
* - if $path exists, returns its absolute fully resolved final version
*
- * @param string $path A filesystem path
- * @param bool $canonicalize Whether or not to return a canonicalized path
- *
* @return string|null
*/
- public function readlink($path, $canonicalize = false)
+ public function readlink(string $path, bool $canonicalize = false)
{
if (!$canonicalize && !is_link($path)) {
return null;
@@ -421,14 +427,14 @@ class Filesystem
return null;
}
- if ('\\' === \DIRECTORY_SEPARATOR) {
+ if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70410) {
$path = readlink($path);
}
return realpath($path);
}
- if ('\\' === \DIRECTORY_SEPARATOR) {
+ if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70400) {
return realpath($path);
}
@@ -438,15 +444,16 @@ class Filesystem
/**
* Given an existing path, convert it to a path relative to a given starting path.
*
- * @param string $endPath Absolute path of target
- * @param string $startPath Absolute path where traversal begins
- *
- * @return string Path of target relative to starting path
+ * @return string
*/
- public function makePathRelative($endPath, $startPath)
+ public function makePathRelative(string $endPath, string $startPath)
{
- if (!$this->isAbsolutePath($endPath) || !$this->isAbsolutePath($startPath)) {
- @trigger_error(sprintf('Support for passing relative paths to %s() is deprecated since Symfony 3.4 and will be removed in 4.0.', __METHOD__), \E_USER_DEPRECATED);
+ if (!$this->isAbsolutePath($startPath)) {
+ throw new InvalidArgumentException(sprintf('The start path "%s" is not absolute.', $startPath));
+ }
+
+ if (!$this->isAbsolutePath($endPath)) {
+ throw new InvalidArgumentException(sprintf('The end path "%s" is not absolute.', $endPath));
}
// Normalize separators on Windows
@@ -461,11 +468,11 @@ class Filesystem
: [$path, null];
};
- $splitPath = function ($path, $absolute) {
+ $splitPath = function ($path) {
$result = [];
foreach (explode('/', trim($path, '/')) as $segment) {
- if ('..' === $segment && ($absolute || \count($result))) {
+ if ('..' === $segment) {
array_pop($result);
} elseif ('.' !== $segment && '' !== $segment) {
$result[] = $segment;
@@ -475,11 +482,11 @@ class Filesystem
return $result;
};
- list($endPath, $endDriveLetter) = $splitDriveLetter($endPath);
- list($startPath, $startDriveLetter) = $splitDriveLetter($startPath);
+ [$endPath, $endDriveLetter] = $splitDriveLetter($endPath);
+ [$startPath, $startDriveLetter] = $splitDriveLetter($startPath);
- $startPathArr = $splitPath($startPath, static::isAbsolutePath($startPath));
- $endPathArr = $splitPath($endPath, static::isAbsolutePath($endPath));
+ $startPathArr = $splitPath($startPath);
+ $endPathArr = $splitPath($endPath);
if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) {
// End path is on another drive, so no relative path exists
@@ -518,23 +525,25 @@ class Filesystem
* - existing files in the target directory will be overwritten, except if they are newer (see the `override` option)
* - files in the target directory that do not exist in the source directory will not be deleted (see the `delete` option)
*
- * @param string $originDir The origin directory
- * @param string $targetDir The target directory
- * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created
- * @param array $options An array of boolean options
- * Valid options are:
- * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false)
- * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false)
- * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
+ * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created
+ * @param array $options An array of boolean options
+ * Valid options are:
+ * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false)
+ * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false)
+ * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
*
* @throws IOException When file type is unknown
*/
- public function mirror($originDir, $targetDir, \Traversable $iterator = null, $options = [])
+ public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = [])
{
$targetDir = rtrim($targetDir, '/\\');
$originDir = rtrim($originDir, '/\\');
$originDirLen = \strlen($originDir);
+ if (!$this->exists($originDir)) {
+ throw new IOException(sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir);
+ }
+
// Iterate in destination folder to remove obsolete entries
if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) {
$deleteIterator = $iterator;
@@ -551,41 +560,32 @@ class Filesystem
}
}
- $copyOnWindows = false;
- if (isset($options['copy_on_windows'])) {
- $copyOnWindows = $options['copy_on_windows'];
- }
+ $copyOnWindows = $options['copy_on_windows'] ?? false;
if (null === $iterator) {
$flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS;
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST);
}
- if ($this->exists($originDir)) {
- $this->mkdir($targetDir);
- }
+ $this->mkdir($targetDir);
+ $filesCreatedWhileMirroring = [];
foreach ($iterator as $file) {
- $target = $targetDir.substr($file->getPathname(), $originDirLen);
+ if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) {
+ continue;
+ }
- if ($copyOnWindows) {
- if (is_file($file)) {
- $this->copy($file, $target, isset($options['override']) ? $options['override'] : false);
- } elseif (is_dir($file)) {
- $this->mkdir($target);
- } else {
- throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
- }
+ $target = $targetDir.substr($file->getPathname(), $originDirLen);
+ $filesCreatedWhileMirroring[$target] = true;
+
+ if (!$copyOnWindows && is_link($file)) {
+ $this->symlink($file->getLinkTarget(), $target);
+ } elseif (is_dir($file)) {
+ $this->mkdir($target);
+ } elseif (is_file($file)) {
+ $this->copy($file, $target, $options['override'] ?? false);
} else {
- if (is_link($file)) {
- $this->symlink($file->getLinkTarget(), $target);
- } elseif (is_dir($file)) {
- $this->mkdir($target);
- } elseif (is_file($file)) {
- $this->copy($file, $target, isset($options['override']) ? $options['override'] : false);
- } else {
- throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
- }
+ throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
}
}
}
@@ -593,13 +593,11 @@ class Filesystem
/**
* Returns whether the file path is an absolute path.
*
- * @param string $file A file path
- *
* @return bool
*/
- public function isAbsolutePath($file)
+ public function isAbsolutePath(string $file)
{
- return '' !== (string) $file && (strspn($file, '/\\', 0, 1)
+ return '' !== $file && (strspn($file, '/\\', 0, 1)
|| (\strlen($file) > 3 && ctype_alpha($file[0])
&& ':' === $file[1]
&& strspn($file, '/\\', 2, 1)
@@ -611,22 +609,21 @@ class Filesystem
/**
* Creates a temporary file with support for custom stream wrappers.
*
- * @param string $dir The directory where the temporary filename will be created
* @param string $prefix The prefix of the generated temporary filename
* Note: Windows uses only the first three characters of prefix
+ * @param string $suffix The suffix of the generated temporary filename
*
* @return string The new temporary filename (with path), or throw an exception on failure
*/
- public function tempnam($dir, $prefix)
+ public function tempnam(string $dir, string $prefix/*, string $suffix = ''*/)
{
- list($scheme, $hierarchy) = $this->getSchemeAndHierarchy($dir);
+ $suffix = \func_num_args() > 2 ? func_get_arg(2) : '';
+ [$scheme, $hierarchy] = $this->getSchemeAndHierarchy($dir);
// If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem
- if (null === $scheme || 'file' === $scheme || 'gs' === $scheme) {
- $tmpFile = @tempnam($hierarchy, $prefix);
-
+ if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) {
// If tempnam failed or no scheme return the filename otherwise prepend the scheme
- if (false !== $tmpFile) {
+ if ($tmpFile = self::box('tempnam', $hierarchy, $prefix)) {
if (null !== $scheme && 'gs' !== $scheme) {
return $scheme.'://'.$tmpFile;
}
@@ -634,140 +631,138 @@ class Filesystem
return $tmpFile;
}
- throw new IOException('A temporary file could not be created.');
+ throw new IOException('A temporary file could not be created: '.self::$lastError);
}
// Loop until we create a valid temp file or have reached 10 attempts
for ($i = 0; $i < 10; ++$i) {
// Create a unique filename
- $tmpFile = $dir.'/'.$prefix.uniqid(mt_rand(), true);
+ $tmpFile = $dir.'/'.$prefix.uniqid(mt_rand(), true).$suffix;
// Use fopen instead of file_exists as some streams do not support stat
// Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability
- $handle = @fopen($tmpFile, 'x+');
-
- // If unsuccessful restart the loop
- if (false === $handle) {
+ if (!$handle = self::box('fopen', $tmpFile, 'x+')) {
continue;
}
// Close the file if it was successfully opened
- @fclose($handle);
+ self::box('fclose', $handle);
return $tmpFile;
}
- throw new IOException('A temporary file could not be created.');
+ throw new IOException('A temporary file could not be created: '.self::$lastError);
}
/**
* Atomically dumps content into a file.
*
- * @param string $filename The file to be written to
- * @param string $content The data to write into the file
+ * @param string|resource $content The data to write into the file
*
* @throws IOException if the file cannot be written to
*/
- public function dumpFile($filename, $content)
+ public function dumpFile(string $filename, $content)
{
+ if (\is_array($content)) {
+ throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__));
+ }
+
$dir = \dirname($filename);
if (!is_dir($dir)) {
$this->mkdir($dir);
}
- if (!is_writable($dir)) {
- throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir);
- }
-
// Will create a temp file with 0600 access rights
// when the filesystem supports chmod.
$tmpFile = $this->tempnam($dir, basename($filename));
- if (false === @file_put_contents($tmpFile, $content)) {
- throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename);
+ try {
+ if (false === self::box('file_put_contents', $tmpFile, $content)) {
+ throw new IOException(sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename);
+ }
+
+ self::box('chmod', $tmpFile, file_exists($filename) ? fileperms($filename) : 0666 & ~umask());
+
+ $this->rename($tmpFile, $filename, true);
+ } finally {
+ if (file_exists($tmpFile)) {
+ self::box('unlink', $tmpFile);
+ }
}
-
- @chmod($tmpFile, file_exists($filename) ? fileperms($filename) : 0666 & ~umask());
-
- $this->rename($tmpFile, $filename, true);
}
/**
* Appends content to an existing file.
*
- * @param string $filename The file to which to append content
- * @param string $content The content to append
+ * @param string|resource $content The content to append
+ * @param bool $lock Whether the file should be locked when writing to it
*
* @throws IOException If the file is not writable
*/
- public function appendToFile($filename, $content)
+ public function appendToFile(string $filename, $content/*, bool $lock = false*/)
{
+ if (\is_array($content)) {
+ throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__));
+ }
+
$dir = \dirname($filename);
if (!is_dir($dir)) {
$this->mkdir($dir);
}
- if (!is_writable($dir)) {
- throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir);
- }
+ $lock = \func_num_args() > 2 && func_get_arg(2);
- if (false === @file_put_contents($filename, $content, \FILE_APPEND)) {
- throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename);
+ if (false === self::box('file_put_contents', $filename, $content, \FILE_APPEND | ($lock ? \LOCK_EX : 0))) {
+ throw new IOException(sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename);
}
}
- /**
- * @param mixed $files
- *
- * @return array|\Traversable
- */
- private function toIterable($files)
+ private function toIterable($files): iterable
{
- return \is_array($files) || $files instanceof \Traversable ? $files : [$files];
+ return is_iterable($files) ? $files : [$files];
}
/**
* Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> [file, tmp]).
- *
- * @param string $filename The filename to be parsed
- *
- * @return array The filename scheme and hierarchical part
*/
- private function getSchemeAndHierarchy($filename)
+ private function getSchemeAndHierarchy(string $filename): array
{
$components = explode('://', $filename, 2);
return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]];
}
+ private static function assertFunctionExists(string $func): void
+ {
+ if (!\function_exists($func)) {
+ throw new IOException(sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func));
+ }
+ }
+
/**
- * @param callable $func
+ * @param mixed ...$args
*
* @return mixed
*/
- private static function box($func)
+ private static function box(string $func, ...$args)
{
+ self::assertFunctionExists($func);
+
self::$lastError = null;
set_error_handler(__CLASS__.'::handleError');
try {
- $result = \call_user_func_array($func, \array_slice(\func_get_args(), 1));
+ return $func(...$args);
+ } finally {
restore_error_handler();
-
- return $result;
- } catch (\Throwable $e) {
- } catch (\Exception $e) {
}
- restore_error_handler();
-
- throw $e;
}
/**
* @internal
*/
- public static function handleError($type, $msg)
+ public static function handleError(int $type, string $msg)
{
self::$lastError = $msg;
}
diff --git a/lib/symfony/filesystem/LICENSE b/lib/symfony/filesystem/LICENSE
index 9e936ec04..88bf75bb4 100644
--- a/lib/symfony/filesystem/LICENSE
+++ b/lib/symfony/filesystem/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2020 Fabien Potencier
+Copyright (c) 2004-2022 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/symfony/filesystem/LockHandler.php b/lib/symfony/filesystem/LockHandler.php
deleted file mode 100644
index 2aacfa719..000000000
--- a/lib/symfony/filesystem/LockHandler.php
+++ /dev/null
@@ -1,121 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Filesystem;
-
-use Symfony\Component\Filesystem\Exception\IOException;
-use Symfony\Component\Lock\Store\FlockStore;
-use Symfony\Component\Lock\Store\SemaphoreStore;
-
-@trigger_error(sprintf('The %s class is deprecated since Symfony 3.4 and will be removed in 4.0. Use %s or %s instead.', LockHandler::class, SemaphoreStore::class, FlockStore::class), \E_USER_DEPRECATED);
-
-/**
- * LockHandler class provides a simple abstraction to lock anything by means of
- * a file lock.
- *
- * A locked file is created based on the lock name when calling lock(). Other
- * lock handlers will not be able to lock the same name until it is released
- * (explicitly by calling release() or implicitly when the instance holding the
- * lock is destroyed).
- *
- * @author GrƩgoire Pineau
- * @author Romain Neutron
- * @author Nicolas Grekas
- *
- * @deprecated since version 3.4, to be removed in 4.0. Use Symfony\Component\Lock\Store\SemaphoreStore or Symfony\Component\Lock\Store\FlockStore instead.
- */
-class LockHandler
-{
- private $file;
- private $handle;
-
- /**
- * @param string $name The lock name
- * @param string|null $lockPath The directory to store the lock. Default values will use temporary directory
- *
- * @throws IOException If the lock directory could not be created or is not writable
- */
- public function __construct($name, $lockPath = null)
- {
- $lockPath = $lockPath ?: sys_get_temp_dir();
-
- if (!is_dir($lockPath)) {
- $fs = new Filesystem();
- $fs->mkdir($lockPath);
- }
-
- if (!is_writable($lockPath)) {
- throw new IOException(sprintf('The directory "%s" is not writable.', $lockPath), 0, null, $lockPath);
- }
-
- $this->file = sprintf('%s/sf.%s.%s.lock', $lockPath, preg_replace('/[^a-z0-9\._-]+/i', '-', $name), hash('sha256', $name));
- }
-
- /**
- * Lock the resource.
- *
- * @param bool $blocking Wait until the lock is released
- *
- * @return bool Returns true if the lock was acquired, false otherwise
- *
- * @throws IOException If the lock file could not be created or opened
- */
- public function lock($blocking = false)
- {
- if ($this->handle) {
- return true;
- }
-
- $error = null;
-
- // Silence error reporting
- set_error_handler(function ($errno, $msg) use (&$error) {
- $error = $msg;
- });
-
- if (!$this->handle = fopen($this->file, 'r+') ?: fopen($this->file, 'r')) {
- if ($this->handle = fopen($this->file, 'x')) {
- chmod($this->file, 0666);
- } elseif (!$this->handle = fopen($this->file, 'r+') ?: fopen($this->file, 'r')) {
- usleep(100); // Give some time for chmod() to complete
- $this->handle = fopen($this->file, 'r+') ?: fopen($this->file, 'r');
- }
- }
- restore_error_handler();
-
- if (!$this->handle) {
- throw new IOException($error, 0, null, $this->file);
- }
-
- // On Windows, even if PHP doc says the contrary, LOCK_NB works, see
- // https://bugs.php.net/54129
- if (!flock($this->handle, \LOCK_EX | ($blocking ? 0 : \LOCK_NB))) {
- fclose($this->handle);
- $this->handle = null;
-
- return false;
- }
-
- return true;
- }
-
- /**
- * Release the resource.
- */
- public function release()
- {
- if ($this->handle) {
- flock($this->handle, \LOCK_UN | \LOCK_NB);
- fclose($this->handle);
- $this->handle = null;
- }
- }
-}
diff --git a/lib/symfony/filesystem/Path.php b/lib/symfony/filesystem/Path.php
new file mode 100644
index 000000000..0bbd5b477
--- /dev/null
+++ b/lib/symfony/filesystem/Path.php
@@ -0,0 +1,819 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem;
+
+use Symfony\Component\Filesystem\Exception\InvalidArgumentException;
+use Symfony\Component\Filesystem\Exception\RuntimeException;
+
+/**
+ * Contains utility methods for handling path strings.
+ *
+ * The methods in this class are able to deal with both UNIX and Windows paths
+ * with both forward and backward slashes. All methods return normalized parts
+ * containing only forward slashes and no excess "." and ".." segments.
+ *
+ * @author Bernhard Schussek
+ * @author Thomas Schulz
+ * @author ThƩo Fidry
+ */
+final class Path
+{
+ /**
+ * The number of buffer entries that triggers a cleanup operation.
+ */
+ private const CLEANUP_THRESHOLD = 1250;
+
+ /**
+ * The buffer size after the cleanup operation.
+ */
+ private const CLEANUP_SIZE = 1000;
+
+ /**
+ * Buffers input/output of {@link canonicalize()}.
+ *
+ * @var array
+ */
+ private static $buffer = [];
+
+ /**
+ * @var int
+ */
+ private static $bufferSize = 0;
+
+ /**
+ * Canonicalizes the given path.
+ *
+ * During normalization, all slashes are replaced by forward slashes ("/").
+ * Furthermore, all "." and ".." segments are removed as far as possible.
+ * ".." segments at the beginning of relative paths are not removed.
+ *
+ * ```php
+ * echo Path::canonicalize("\symfony\puli\..\css\style.css");
+ * // => /symfony/css/style.css
+ *
+ * echo Path::canonicalize("../css/./style.css");
+ * // => ../css/style.css
+ * ```
+ *
+ * This method is able to deal with both UNIX and Windows paths.
+ */
+ public static function canonicalize(string $path): string
+ {
+ if ('' === $path) {
+ return '';
+ }
+
+ // This method is called by many other methods in this class. Buffer
+ // the canonicalized paths to make up for the severe performance
+ // decrease.
+ if (isset(self::$buffer[$path])) {
+ return self::$buffer[$path];
+ }
+
+ // Replace "~" with user's home directory.
+ if ('~' === $path[0]) {
+ $path = self::getHomeDirectory().mb_substr($path, 1);
+ }
+
+ $path = self::normalize($path);
+
+ [$root, $pathWithoutRoot] = self::split($path);
+
+ $canonicalParts = self::findCanonicalParts($root, $pathWithoutRoot);
+
+ // Add the root directory again
+ self::$buffer[$path] = $canonicalPath = $root.implode('/', $canonicalParts);
+ ++self::$bufferSize;
+
+ // Clean up regularly to prevent memory leaks
+ if (self::$bufferSize > self::CLEANUP_THRESHOLD) {
+ self::$buffer = \array_slice(self::$buffer, -self::CLEANUP_SIZE, null, true);
+ self::$bufferSize = self::CLEANUP_SIZE;
+ }
+
+ return $canonicalPath;
+ }
+
+ /**
+ * Normalizes the given path.
+ *
+ * During normalization, all slashes are replaced by forward slashes ("/").
+ * Contrary to {@link canonicalize()}, this method does not remove invalid
+ * or dot path segments. Consequently, it is much more efficient and should
+ * be used whenever the given path is known to be a valid, absolute system
+ * path.
+ *
+ * This method is able to deal with both UNIX and Windows paths.
+ */
+ public static function normalize(string $path): string
+ {
+ return str_replace('\\', '/', $path);
+ }
+
+ /**
+ * Returns the directory part of the path.
+ *
+ * This method is similar to PHP's dirname(), but handles various cases
+ * where dirname() returns a weird result:
+ *
+ * - dirname() does not accept backslashes on UNIX
+ * - dirname("C:/symfony") returns "C:", not "C:/"
+ * - dirname("C:/") returns ".", not "C:/"
+ * - dirname("C:") returns ".", not "C:/"
+ * - dirname("symfony") returns ".", not ""
+ * - dirname() does not canonicalize the result
+ *
+ * This method fixes these shortcomings and behaves like dirname()
+ * otherwise.
+ *
+ * The result is a canonical path.
+ *
+ * @return string The canonical directory part. Returns the root directory
+ * if the root directory is passed. Returns an empty string
+ * if a relative path is passed that contains no slashes.
+ * Returns an empty string if an empty string is passed.
+ */
+ public static function getDirectory(string $path): string
+ {
+ if ('' === $path) {
+ return '';
+ }
+
+ $path = self::canonicalize($path);
+
+ // Maintain scheme
+ if (false !== ($schemeSeparatorPosition = mb_strpos($path, '://'))) {
+ $scheme = mb_substr($path, 0, $schemeSeparatorPosition + 3);
+ $path = mb_substr($path, $schemeSeparatorPosition + 3);
+ } else {
+ $scheme = '';
+ }
+
+ if (false === ($dirSeparatorPosition = strrpos($path, '/'))) {
+ return '';
+ }
+
+ // Directory equals root directory "/"
+ if (0 === $dirSeparatorPosition) {
+ return $scheme.'/';
+ }
+
+ // Directory equals Windows root "C:/"
+ if (2 === $dirSeparatorPosition && ctype_alpha($path[0]) && ':' === $path[1]) {
+ return $scheme.mb_substr($path, 0, 3);
+ }
+
+ return $scheme.mb_substr($path, 0, $dirSeparatorPosition);
+ }
+
+ /**
+ * Returns canonical path of the user's home directory.
+ *
+ * Supported operating systems:
+ *
+ * - UNIX
+ * - Windows8 and upper
+ *
+ * If your operating system or environment isn't supported, an exception is thrown.
+ *
+ * The result is a canonical path.
+ *
+ * @throws RuntimeException If your operating system or environment isn't supported
+ */
+ public static function getHomeDirectory(): string
+ {
+ // For UNIX support
+ if (getenv('HOME')) {
+ return self::canonicalize(getenv('HOME'));
+ }
+
+ // For >= Windows8 support
+ if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) {
+ return self::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH'));
+ }
+
+ throw new RuntimeException("Cannot find the home directory path: Your environment or operating system isn't supported.");
+ }
+
+ /**
+ * Returns the root directory of a path.
+ *
+ * The result is a canonical path.
+ *
+ * @return string The canonical root directory. Returns an empty string if
+ * the given path is relative or empty.
+ */
+ public static function getRoot(string $path): string
+ {
+ if ('' === $path) {
+ return '';
+ }
+
+ // Maintain scheme
+ if (false !== ($schemeSeparatorPosition = strpos($path, '://'))) {
+ $scheme = substr($path, 0, $schemeSeparatorPosition + 3);
+ $path = substr($path, $schemeSeparatorPosition + 3);
+ } else {
+ $scheme = '';
+ }
+
+ $firstCharacter = $path[0];
+
+ // UNIX root "/" or "\" (Windows style)
+ if ('/' === $firstCharacter || '\\' === $firstCharacter) {
+ return $scheme.'/';
+ }
+
+ $length = mb_strlen($path);
+
+ // Windows root
+ if ($length > 1 && ':' === $path[1] && ctype_alpha($firstCharacter)) {
+ // Special case: "C:"
+ if (2 === $length) {
+ return $scheme.$path.'/';
+ }
+
+ // Normal case: "C:/ or "C:\"
+ if ('/' === $path[2] || '\\' === $path[2]) {
+ return $scheme.$firstCharacter.$path[1].'/';
+ }
+ }
+
+ return '';
+ }
+
+ /**
+ * Returns the file name without the extension from a file path.
+ *
+ * @param string|null $extension if specified, only that extension is cut
+ * off (may contain leading dot)
+ */
+ public static function getFilenameWithoutExtension(string $path, string $extension = null): string
+ {
+ if ('' === $path) {
+ return '';
+ }
+
+ if (null !== $extension) {
+ // remove extension and trailing dot
+ return rtrim(basename($path, $extension), '.');
+ }
+
+ return pathinfo($path, \PATHINFO_FILENAME);
+ }
+
+ /**
+ * Returns the extension from a file path (without leading dot).
+ *
+ * @param bool $forceLowerCase forces the extension to be lower-case
+ */
+ public static function getExtension(string $path, bool $forceLowerCase = false): string
+ {
+ if ('' === $path) {
+ return '';
+ }
+
+ $extension = pathinfo($path, \PATHINFO_EXTENSION);
+
+ if ($forceLowerCase) {
+ $extension = self::toLower($extension);
+ }
+
+ return $extension;
+ }
+
+ /**
+ * Returns whether the path has an (or the specified) extension.
+ *
+ * @param string $path the path string
+ * @param string|string[]|null $extensions if null or not provided, checks if
+ * an extension exists, otherwise
+ * checks for the specified extension
+ * or array of extensions (with or
+ * without leading dot)
+ * @param bool $ignoreCase whether to ignore case-sensitivity
+ */
+ public static function hasExtension(string $path, $extensions = null, bool $ignoreCase = false): bool
+ {
+ if ('' === $path) {
+ return false;
+ }
+
+ $actualExtension = self::getExtension($path, $ignoreCase);
+
+ // Only check if path has any extension
+ if ([] === $extensions || null === $extensions) {
+ return '' !== $actualExtension;
+ }
+
+ if (\is_string($extensions)) {
+ $extensions = [$extensions];
+ }
+
+ foreach ($extensions as $key => $extension) {
+ if ($ignoreCase) {
+ $extension = self::toLower($extension);
+ }
+
+ // remove leading '.' in extensions array
+ $extensions[$key] = ltrim($extension, '.');
+ }
+
+ return \in_array($actualExtension, $extensions, true);
+ }
+
+ /**
+ * Changes the extension of a path string.
+ *
+ * @param string $path The path string with filename.ext to change.
+ * @param string $extension new extension (with or without leading dot)
+ *
+ * @return string the path string with new file extension
+ */
+ public static function changeExtension(string $path, string $extension): string
+ {
+ if ('' === $path) {
+ return '';
+ }
+
+ $actualExtension = self::getExtension($path);
+ $extension = ltrim($extension, '.');
+
+ // No extension for paths
+ if ('/' === mb_substr($path, -1)) {
+ return $path;
+ }
+
+ // No actual extension in path
+ if (empty($actualExtension)) {
+ return $path.('.' === mb_substr($path, -1) ? '' : '.').$extension;
+ }
+
+ return mb_substr($path, 0, -mb_strlen($actualExtension)).$extension;
+ }
+
+ public static function isAbsolute(string $path): bool
+ {
+ if ('' === $path) {
+ return false;
+ }
+
+ // Strip scheme
+ if (false !== ($schemeSeparatorPosition = mb_strpos($path, '://'))) {
+ $path = mb_substr($path, $schemeSeparatorPosition + 3);
+ }
+
+ $firstCharacter = $path[0];
+
+ // UNIX root "/" or "\" (Windows style)
+ if ('/' === $firstCharacter || '\\' === $firstCharacter) {
+ return true;
+ }
+
+ // Windows root
+ if (mb_strlen($path) > 1 && ctype_alpha($firstCharacter) && ':' === $path[1]) {
+ // Special case: "C:"
+ if (2 === mb_strlen($path)) {
+ return true;
+ }
+
+ // Normal case: "C:/ or "C:\"
+ if ('/' === $path[2] || '\\' === $path[2]) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public static function isRelative(string $path): bool
+ {
+ return !self::isAbsolute($path);
+ }
+
+ /**
+ * Turns a relative path into an absolute path in canonical form.
+ *
+ * Usually, the relative path is appended to the given base path. Dot
+ * segments ("." and "..") are removed/collapsed and all slashes turned
+ * into forward slashes.
+ *
+ * ```php
+ * echo Path::makeAbsolute("../style.css", "/symfony/puli/css");
+ * // => /symfony/puli/style.css
+ * ```
+ *
+ * If an absolute path is passed, that path is returned unless its root
+ * directory is different than the one of the base path. In that case, an
+ * exception is thrown.
+ *
+ * ```php
+ * Path::makeAbsolute("/style.css", "/symfony/puli/css");
+ * // => /style.css
+ *
+ * Path::makeAbsolute("C:/style.css", "C:/symfony/puli/css");
+ * // => C:/style.css
+ *
+ * Path::makeAbsolute("C:/style.css", "/symfony/puli/css");
+ * // InvalidArgumentException
+ * ```
+ *
+ * If the base path is not an absolute path, an exception is thrown.
+ *
+ * The result is a canonical path.
+ *
+ * @param string $basePath an absolute base path
+ *
+ * @throws InvalidArgumentException if the base path is not absolute or if
+ * the given path is an absolute path with
+ * a different root than the base path
+ */
+ public static function makeAbsolute(string $path, string $basePath): string
+ {
+ if ('' === $basePath) {
+ throw new InvalidArgumentException(sprintf('The base path must be a non-empty string. Got: "%s".', $basePath));
+ }
+
+ if (!self::isAbsolute($basePath)) {
+ throw new InvalidArgumentException(sprintf('The base path "%s" is not an absolute path.', $basePath));
+ }
+
+ if (self::isAbsolute($path)) {
+ return self::canonicalize($path);
+ }
+
+ if (false !== ($schemeSeparatorPosition = mb_strpos($basePath, '://'))) {
+ $scheme = mb_substr($basePath, 0, $schemeSeparatorPosition + 3);
+ $basePath = mb_substr($basePath, $schemeSeparatorPosition + 3);
+ } else {
+ $scheme = '';
+ }
+
+ return $scheme.self::canonicalize(rtrim($basePath, '/\\').'/'.$path);
+ }
+
+ /**
+ * Turns a path into a relative path.
+ *
+ * The relative path is created relative to the given base path:
+ *
+ * ```php
+ * echo Path::makeRelative("/symfony/style.css", "/symfony/puli");
+ * // => ../style.css
+ * ```
+ *
+ * If a relative path is passed and the base path is absolute, the relative
+ * path is returned unchanged:
+ *
+ * ```php
+ * Path::makeRelative("style.css", "/symfony/puli/css");
+ * // => style.css
+ * ```
+ *
+ * If both paths are relative, the relative path is created with the
+ * assumption that both paths are relative to the same directory:
+ *
+ * ```php
+ * Path::makeRelative("style.css", "symfony/puli/css");
+ * // => ../../../style.css
+ * ```
+ *
+ * If both paths are absolute, their root directory must be the same,
+ * otherwise an exception is thrown:
+ *
+ * ```php
+ * Path::makeRelative("C:/symfony/style.css", "/symfony/puli");
+ * // InvalidArgumentException
+ * ```
+ *
+ * If the passed path is absolute, but the base path is not, an exception
+ * is thrown as well:
+ *
+ * ```php
+ * Path::makeRelative("/symfony/style.css", "symfony/puli");
+ * // InvalidArgumentException
+ * ```
+ *
+ * If the base path is not an absolute path, an exception is thrown.
+ *
+ * The result is a canonical path.
+ *
+ * @throws InvalidArgumentException if the base path is not absolute or if
+ * the given path has a different root
+ * than the base path
+ */
+ public static function makeRelative(string $path, string $basePath): string
+ {
+ $path = self::canonicalize($path);
+ $basePath = self::canonicalize($basePath);
+
+ [$root, $relativePath] = self::split($path);
+ [$baseRoot, $relativeBasePath] = self::split($basePath);
+
+ // If the base path is given as absolute path and the path is already
+ // relative, consider it to be relative to the given absolute path
+ // already
+ if ('' === $root && '' !== $baseRoot) {
+ // If base path is already in its root
+ if ('' === $relativeBasePath) {
+ $relativePath = ltrim($relativePath, './\\');
+ }
+
+ return $relativePath;
+ }
+
+ // If the passed path is absolute, but the base path is not, we
+ // cannot generate a relative path
+ if ('' !== $root && '' === $baseRoot) {
+ throw new InvalidArgumentException(sprintf('The absolute path "%s" cannot be made relative to the relative path "%s". You should provide an absolute base path instead.', $path, $basePath));
+ }
+
+ // Fail if the roots of the two paths are different
+ if ($baseRoot && $root !== $baseRoot) {
+ throw new InvalidArgumentException(sprintf('The path "%s" cannot be made relative to "%s", because they have different roots ("%s" and "%s").', $path, $basePath, $root, $baseRoot));
+ }
+
+ if ('' === $relativeBasePath) {
+ return $relativePath;
+ }
+
+ // Build a "../../" prefix with as many "../" parts as necessary
+ $parts = explode('/', $relativePath);
+ $baseParts = explode('/', $relativeBasePath);
+ $dotDotPrefix = '';
+
+ // Once we found a non-matching part in the prefix, we need to add
+ // "../" parts for all remaining parts
+ $match = true;
+
+ foreach ($baseParts as $index => $basePart) {
+ if ($match && isset($parts[$index]) && $basePart === $parts[$index]) {
+ unset($parts[$index]);
+
+ continue;
+ }
+
+ $match = false;
+ $dotDotPrefix .= '../';
+ }
+
+ return rtrim($dotDotPrefix.implode('/', $parts), '/');
+ }
+
+ /**
+ * Returns whether the given path is on the local filesystem.
+ */
+ public static function isLocal(string $path): bool
+ {
+ return '' !== $path && false === mb_strpos($path, '://');
+ }
+
+ /**
+ * Returns the longest common base path in canonical form of a set of paths or
+ * `null` if the paths are on different Windows partitions.
+ *
+ * Dot segments ("." and "..") are removed/collapsed and all slashes turned
+ * into forward slashes.
+ *
+ * ```php
+ * $basePath = Path::getLongestCommonBasePath(
+ * '/symfony/css/style.css',
+ * '/symfony/css/..'
+ * );
+ * // => /symfony
+ * ```
+ *
+ * The root is returned if no common base path can be found:
+ *
+ * ```php
+ * $basePath = Path::getLongestCommonBasePath(
+ * '/symfony/css/style.css',
+ * '/puli/css/..'
+ * );
+ * // => /
+ * ```
+ *
+ * If the paths are located on different Windows partitions, `null` is
+ * returned.
+ *
+ * ```php
+ * $basePath = Path::getLongestCommonBasePath(
+ * 'C:/symfony/css/style.css',
+ * 'D:/symfony/css/..'
+ * );
+ * // => null
+ * ```
+ */
+ public static function getLongestCommonBasePath(string ...$paths): ?string
+ {
+ [$bpRoot, $basePath] = self::split(self::canonicalize(reset($paths)));
+
+ for (next($paths); null !== key($paths) && '' !== $basePath; next($paths)) {
+ [$root, $path] = self::split(self::canonicalize(current($paths)));
+
+ // If we deal with different roots (e.g. C:/ vs. D:/), it's time
+ // to quit
+ if ($root !== $bpRoot) {
+ return null;
+ }
+
+ // Make the base path shorter until it fits into path
+ while (true) {
+ if ('.' === $basePath) {
+ // No more base paths
+ $basePath = '';
+
+ // next path
+ continue 2;
+ }
+
+ // Prevent false positives for common prefixes
+ // see isBasePath()
+ if (0 === mb_strpos($path.'/', $basePath.'/')) {
+ // next path
+ continue 2;
+ }
+
+ $basePath = \dirname($basePath);
+ }
+ }
+
+ return $bpRoot.$basePath;
+ }
+
+ /**
+ * Joins two or more path strings into a canonical path.
+ */
+ public static function join(string ...$paths): string
+ {
+ $finalPath = null;
+ $wasScheme = false;
+
+ foreach ($paths as $path) {
+ if ('' === $path) {
+ continue;
+ }
+
+ if (null === $finalPath) {
+ // For first part we keep slashes, like '/top', 'C:\' or 'phar://'
+ $finalPath = $path;
+ $wasScheme = (false !== mb_strpos($path, '://'));
+ continue;
+ }
+
+ // Only add slash if previous part didn't end with '/' or '\'
+ if (!\in_array(mb_substr($finalPath, -1), ['/', '\\'])) {
+ $finalPath .= '/';
+ }
+
+ // If first part included a scheme like 'phar://' we allow \current part to start with '/', otherwise trim
+ $finalPath .= $wasScheme ? $path : ltrim($path, '/');
+ $wasScheme = false;
+ }
+
+ if (null === $finalPath) {
+ return '';
+ }
+
+ return self::canonicalize($finalPath);
+ }
+
+ /**
+ * Returns whether a path is a base path of another path.
+ *
+ * Dot segments ("." and "..") are removed/collapsed and all slashes turned
+ * into forward slashes.
+ *
+ * ```php
+ * Path::isBasePath('/symfony', '/symfony/css');
+ * // => true
+ *
+ * Path::isBasePath('/symfony', '/symfony');
+ * // => true
+ *
+ * Path::isBasePath('/symfony', '/symfony/..');
+ * // => false
+ *
+ * Path::isBasePath('/symfony', '/puli');
+ * // => false
+ * ```
+ */
+ public static function isBasePath(string $basePath, string $ofPath): bool
+ {
+ $basePath = self::canonicalize($basePath);
+ $ofPath = self::canonicalize($ofPath);
+
+ // Append slashes to prevent false positives when two paths have
+ // a common prefix, for example /base/foo and /base/foobar.
+ // Don't append a slash for the root "/", because then that root
+ // won't be discovered as common prefix ("//" is not a prefix of
+ // "/foobar/").
+ return 0 === mb_strpos($ofPath.'/', rtrim($basePath, '/').'/');
+ }
+
+ /**
+ * @return non-empty-string[]
+ */
+ private static function findCanonicalParts(string $root, string $pathWithoutRoot): array
+ {
+ $parts = explode('/', $pathWithoutRoot);
+
+ $canonicalParts = [];
+
+ // Collapse "." and "..", if possible
+ foreach ($parts as $part) {
+ if ('.' === $part || '' === $part) {
+ continue;
+ }
+
+ // Collapse ".." with the previous part, if one exists
+ // Don't collapse ".." if the previous part is also ".."
+ if ('..' === $part && \count($canonicalParts) > 0 && '..' !== $canonicalParts[\count($canonicalParts) - 1]) {
+ array_pop($canonicalParts);
+
+ continue;
+ }
+
+ // Only add ".." prefixes for relative paths
+ if ('..' !== $part || '' === $root) {
+ $canonicalParts[] = $part;
+ }
+ }
+
+ return $canonicalParts;
+ }
+
+ /**
+ * Splits a canonical path into its root directory and the remainder.
+ *
+ * If the path has no root directory, an empty root directory will be
+ * returned.
+ *
+ * If the root directory is a Windows style partition, the resulting root
+ * will always contain a trailing slash.
+ *
+ * list ($root, $path) = Path::split("C:/symfony")
+ * // => ["C:/", "symfony"]
+ *
+ * list ($root, $path) = Path::split("C:")
+ * // => ["C:/", ""]
+ *
+ * @return array{string, string} an array with the root directory and the remaining relative path
+ */
+ private static function split(string $path): array
+ {
+ if ('' === $path) {
+ return ['', ''];
+ }
+
+ // Remember scheme as part of the root, if any
+ if (false !== ($schemeSeparatorPosition = mb_strpos($path, '://'))) {
+ $root = mb_substr($path, 0, $schemeSeparatorPosition + 3);
+ $path = mb_substr($path, $schemeSeparatorPosition + 3);
+ } else {
+ $root = '';
+ }
+
+ $length = mb_strlen($path);
+
+ // Remove and remember root directory
+ if (0 === mb_strpos($path, '/')) {
+ $root .= '/';
+ $path = $length > 1 ? mb_substr($path, 1) : '';
+ } elseif ($length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) {
+ if (2 === $length) {
+ // Windows special case: "C:"
+ $root .= $path.'/';
+ $path = '';
+ } elseif ('/' === $path[2]) {
+ // Windows normal case: "C:/"..
+ $root .= mb_substr($path, 0, 3);
+ $path = $length > 3 ? mb_substr($path, 3) : '';
+ }
+ }
+
+ return [$root, $path];
+ }
+
+ private static function toLower(string $string): string
+ {
+ if (false !== $encoding = mb_detect_encoding($string)) {
+ return mb_strtolower($string, $encoding);
+ }
+
+ return strtolower($string, $encoding);
+ }
+
+ private function __construct()
+ {
+ }
+}
diff --git a/lib/symfony/filesystem/README.md b/lib/symfony/filesystem/README.md
index cb03d43c1..f2f6d45f7 100644
--- a/lib/symfony/filesystem/README.md
+++ b/lib/symfony/filesystem/README.md
@@ -6,8 +6,8 @@ The Filesystem component provides basic utilities for the filesystem.
Resources
---------
- * [Documentation](https://symfony.com/doc/current/components/filesystem.html)
- * [Contributing](https://symfony.com/doc/current/contributing/index.html)
- * [Report issues](https://github.com/symfony/symfony/issues) and
- [send Pull Requests](https://github.com/symfony/symfony/pulls)
- in the [main Symfony repository](https://github.com/symfony/symfony)
+ * [Documentation](https://symfony.com/doc/current/components/filesystem.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/lib/symfony/filesystem/composer.json b/lib/symfony/filesystem/composer.json
index ee48b0b23..e756104cd 100644
--- a/lib/symfony/filesystem/composer.json
+++ b/lib/symfony/filesystem/composer.json
@@ -1,7 +1,7 @@
{
"name": "symfony/filesystem",
"type": "library",
- "description": "Symfony Filesystem Component",
+ "description": "Provides basic utilities for the filesystem",
"keywords": [],
"homepage": "https://symfony.com",
"license": "MIT",
@@ -16,8 +16,10 @@
}
],
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8",
+ "symfony/polyfill-php80": "^1.16"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Filesystem\\": "" },
diff --git a/lib/symfony/filesystem/phpunit.xml.dist b/lib/symfony/filesystem/phpunit.xml.dist
deleted file mode 100644
index 5515fff1a..000000000
--- a/lib/symfony/filesystem/phpunit.xml.dist
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
- ./Tests/
-
-
-
-
-
- ./
-
- ./Tests
- ./vendor
-
-
-
-
diff --git a/lib/symfony/finder/.gitignore b/lib/symfony/finder/.gitignore
deleted file mode 100644
index c49a5d8df..000000000
--- a/lib/symfony/finder/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-vendor/
-composer.lock
-phpunit.xml
diff --git a/lib/symfony/finder/CHANGELOG.md b/lib/symfony/finder/CHANGELOG.md
index 53c34be86..6a44e87c2 100644
--- a/lib/symfony/finder/CHANGELOG.md
+++ b/lib/symfony/finder/CHANGELOG.md
@@ -1,6 +1,38 @@
CHANGELOG
=========
+5.4.0
+-----
+
+ * Deprecate `Comparator::setTarget()` and `Comparator::setOperator()`
+ * Add a constructor to `Comparator` that allows setting target and operator
+ * Finder's iterator has now `Symfony\Component\Finder\SplFileInfo` inner type specified
+ * Add recursive .gitignore files support
+
+5.0.0
+-----
+
+ * added `$useNaturalSort` argument to `Finder::sortByName()`
+
+4.3.0
+-----
+
+ * added Finder::ignoreVCSIgnored() to ignore files based on rules listed in .gitignore
+
+4.2.0
+-----
+
+ * added $useNaturalSort option to Finder::sortByName() method
+ * the `Finder::sortByName()` method will have a new `$useNaturalSort`
+ argument in version 5.0, not defining it is deprecated
+ * added `Finder::reverseSorting()` to reverse the sorting
+
+4.0.0
+-----
+
+ * removed `ExceptionInterface`
+ * removed `Symfony\Component\Finder\Iterator\FilterIterator`
+
3.4.0
-----
diff --git a/lib/symfony/finder/Comparator/Comparator.php b/lib/symfony/finder/Comparator/Comparator.php
index 6aee21cf0..3af551f4c 100644
--- a/lib/symfony/finder/Comparator/Comparator.php
+++ b/lib/symfony/finder/Comparator/Comparator.php
@@ -12,8 +12,6 @@
namespace Symfony\Component\Finder\Comparator;
/**
- * Comparator.
- *
* @author Fabien Potencier
*/
class Comparator
@@ -21,30 +19,44 @@ class Comparator
private $target;
private $operator = '==';
+ public function __construct(string $target = null, string $operator = '==')
+ {
+ if (null === $target) {
+ trigger_deprecation('symfony/finder', '5.4', 'Constructing a "%s" without setting "$target" is deprecated.', __CLASS__);
+ }
+
+ $this->target = $target;
+ $this->doSetOperator($operator);
+ }
+
/**
* Gets the target value.
*
- * @return string The target value
+ * @return string
*/
public function getTarget()
{
+ if (null === $this->target) {
+ trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__);
+ }
+
return $this->target;
}
/**
- * Sets the target value.
- *
- * @param string $target The target value
+ * @deprecated set the target via the constructor instead
*/
- public function setTarget($target)
+ public function setTarget(string $target)
{
+ trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the target via the constructor instead.', __METHOD__);
+
$this->target = $target;
}
/**
* Gets the comparison operator.
*
- * @return string The operator
+ * @return string
*/
public function getOperator()
{
@@ -54,21 +66,15 @@ class Comparator
/**
* Sets the comparison operator.
*
- * @param string $operator A valid operator
- *
* @throws \InvalidArgumentException
+ *
+ * @deprecated set the operator via the constructor instead
*/
- public function setOperator($operator)
+ public function setOperator(string $operator)
{
- if (!$operator) {
- $operator = '==';
- }
+ trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the operator via the constructor instead.', __METHOD__);
- if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) {
- throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator));
- }
-
- $this->operator = $operator;
+ $this->doSetOperator('' === $operator ? '==' : $operator);
}
/**
@@ -80,6 +86,10 @@ class Comparator
*/
public function test($test)
{
+ if (null === $this->target) {
+ trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__);
+ }
+
switch ($this->operator) {
case '>':
return $test > $this->target;
@@ -95,4 +105,13 @@ class Comparator
return $test == $this->target;
}
+
+ private function doSetOperator(string $operator): void
+ {
+ if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) {
+ throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator));
+ }
+
+ $this->operator = $operator;
+ }
}
diff --git a/lib/symfony/finder/Comparator/DateComparator.php b/lib/symfony/finder/Comparator/DateComparator.php
index 3de43ef4b..8f651e148 100644
--- a/lib/symfony/finder/Comparator/DateComparator.php
+++ b/lib/symfony/finder/Comparator/DateComparator.php
@@ -23,7 +23,7 @@ class DateComparator extends Comparator
*
* @throws \InvalidArgumentException If the test is not understood
*/
- public function __construct($test)
+ public function __construct(string $test)
{
if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) {
throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test));
@@ -36,7 +36,7 @@ class DateComparator extends Comparator
throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2]));
}
- $operator = isset($matches[1]) ? $matches[1] : '==';
+ $operator = $matches[1] ?? '==';
if ('since' === $operator || 'after' === $operator) {
$operator = '>';
}
@@ -45,7 +45,6 @@ class DateComparator extends Comparator
$operator = '<';
}
- $this->setOperator($operator);
- $this->setTarget($target);
+ parent::__construct($target, $operator);
}
}
diff --git a/lib/symfony/finder/Comparator/NumberComparator.php b/lib/symfony/finder/Comparator/NumberComparator.php
index f62c0e574..ff85d9677 100644
--- a/lib/symfony/finder/Comparator/NumberComparator.php
+++ b/lib/symfony/finder/Comparator/NumberComparator.php
@@ -39,10 +39,10 @@ class NumberComparator extends Comparator
*
* @throws \InvalidArgumentException If the test is not understood
*/
- public function __construct($test)
+ public function __construct(?string $test)
{
- if (!preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) {
- throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test));
+ if (null === $test || !preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) {
+ throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test ?? 'null'));
}
$target = $matches[2];
@@ -73,7 +73,6 @@ class NumberComparator extends Comparator
}
}
- $this->setTarget($target);
- $this->setOperator(isset($matches[1]) ? $matches[1] : '==');
+ parent::__construct($target, $matches[1] ?: '==');
}
}
diff --git a/lib/symfony/finder/Exception/ExceptionInterface.php b/lib/symfony/finder/Exception/DirectoryNotFoundException.php
similarity index 54%
rename from lib/symfony/finder/Exception/ExceptionInterface.php
rename to lib/symfony/finder/Exception/DirectoryNotFoundException.php
index 161e9686d..c6cc0f273 100644
--- a/lib/symfony/finder/Exception/ExceptionInterface.php
+++ b/lib/symfony/finder/Exception/DirectoryNotFoundException.php
@@ -12,14 +12,8 @@
namespace Symfony\Component\Finder\Exception;
/**
- * @author Jean-FranƧois Simon
- *
- * @deprecated since 3.3, to be removed in 4.0.
+ * @author Andreas Erhard
*/
-interface ExceptionInterface
+class DirectoryNotFoundException extends \InvalidArgumentException
{
- /**
- * @return \Symfony\Component\Finder\Adapter\AdapterInterface
- */
- public function getAdapter();
}
diff --git a/lib/symfony/finder/Finder.php b/lib/symfony/finder/Finder.php
index 186cb3229..8cc564cd6 100644
--- a/lib/symfony/finder/Finder.php
+++ b/lib/symfony/finder/Finder.php
@@ -13,12 +13,14 @@ namespace Symfony\Component\Finder;
use Symfony\Component\Finder\Comparator\DateComparator;
use Symfony\Component\Finder\Comparator\NumberComparator;
+use Symfony\Component\Finder\Exception\DirectoryNotFoundException;
use Symfony\Component\Finder\Iterator\CustomFilterIterator;
use Symfony\Component\Finder\Iterator\DateRangeFilterIterator;
use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator;
use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator;
use Symfony\Component\Finder\Iterator\FilecontentFilterIterator;
use Symfony\Component\Finder\Iterator\FilenameFilterIterator;
+use Symfony\Component\Finder\Iterator\LazyIterator;
use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator;
use Symfony\Component\Finder\Iterator\SortableIterator;
@@ -34,11 +36,14 @@ use Symfony\Component\Finder\Iterator\SortableIterator;
* $finder = Finder::create()->files()->name('*.php')->in(__DIR__);
*
* @author Fabien Potencier
+ *
+ * @implements \IteratorAggregate
*/
class Finder implements \IteratorAggregate, \Countable
{
- const IGNORE_VCS_FILES = 1;
- const IGNORE_DOT_FILES = 2;
+ public const IGNORE_VCS_FILES = 1;
+ public const IGNORE_DOT_FILES = 2;
+ public const IGNORE_VCS_IGNORED_FILES = 4;
private $mode = 0;
private $names = [];
@@ -48,6 +53,7 @@ class Finder implements \IteratorAggregate, \Countable
private $depths = [];
private $sizes = [];
private $followLinks = false;
+ private $reverseSorting = false;
private $sort = false;
private $ignore = 0;
private $dirs = [];
@@ -107,17 +113,20 @@ class Finder implements \IteratorAggregate, \Countable
*
* $finder->depth('> 1') // the Finder will start matching at level 1.
* $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point.
+ * $finder->depth(['>= 1', '< 3'])
*
- * @param string|int $level The depth level expression
+ * @param string|int|string[]|int[] $levels The depth level expression or an array of depth levels
*
* @return $this
*
* @see DepthRangeFilterIterator
* @see NumberComparator
*/
- public function depth($level)
+ public function depth($levels)
{
- $this->depths[] = new Comparator\NumberComparator($level);
+ foreach ((array) $levels as $level) {
+ $this->depths[] = new Comparator\NumberComparator($level);
+ }
return $this;
}
@@ -131,8 +140,9 @@ class Finder implements \IteratorAggregate, \Countable
* $finder->date('until 2 days ago');
* $finder->date('> now - 2 hours');
* $finder->date('>= 2005-10-15');
+ * $finder->date(['>= 2005-10-15', '<= 2006-05-27']);
*
- * @param string $date A date range string
+ * @param string|string[] $dates A date range string or an array of date ranges
*
* @return $this
*
@@ -140,9 +150,11 @@ class Finder implements \IteratorAggregate, \Countable
* @see DateRangeFilterIterator
* @see DateComparator
*/
- public function date($date)
+ public function date($dates)
{
- $this->dates[] = new Comparator\DateComparator($date);
+ foreach ((array) $dates as $date) {
+ $this->dates[] = new Comparator\DateComparator($date);
+ }
return $this;
}
@@ -155,16 +167,17 @@ class Finder implements \IteratorAggregate, \Countable
* $finder->name('*.php')
* $finder->name('/\.php$/') // same as above
* $finder->name('test.php')
+ * $finder->name(['test.py', 'test.php'])
*
- * @param string $pattern A pattern (a regexp, a glob, or a string)
+ * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns
*
* @return $this
*
* @see FilenameFilterIterator
*/
- public function name($pattern)
+ public function name($patterns)
{
- $this->names[] = $pattern;
+ $this->names = array_merge($this->names, (array) $patterns);
return $this;
}
@@ -172,15 +185,15 @@ class Finder implements \IteratorAggregate, \Countable
/**
* Adds rules that files must not match.
*
- * @param string $pattern A pattern (a regexp, a glob, or a string)
+ * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns
*
* @return $this
*
* @see FilenameFilterIterator
*/
- public function notName($pattern)
+ public function notName($patterns)
{
- $this->notNames[] = $pattern;
+ $this->notNames = array_merge($this->notNames, (array) $patterns);
return $this;
}
@@ -192,16 +205,17 @@ class Finder implements \IteratorAggregate, \Countable
*
* $finder->contains('Lorem ipsum')
* $finder->contains('/Lorem ipsum/i')
+ * $finder->contains(['dolor', '/ipsum/i'])
*
- * @param string $pattern A pattern (string or regexp)
+ * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns
*
* @return $this
*
* @see FilecontentFilterIterator
*/
- public function contains($pattern)
+ public function contains($patterns)
{
- $this->contains[] = $pattern;
+ $this->contains = array_merge($this->contains, (array) $patterns);
return $this;
}
@@ -213,16 +227,17 @@ class Finder implements \IteratorAggregate, \Countable
*
* $finder->notContains('Lorem ipsum')
* $finder->notContains('/Lorem ipsum/i')
+ * $finder->notContains(['lorem', '/dolor/i'])
*
- * @param string $pattern A pattern (string or regexp)
+ * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns
*
* @return $this
*
* @see FilecontentFilterIterator
*/
- public function notContains($pattern)
+ public function notContains($patterns)
{
- $this->notContains[] = $pattern;
+ $this->notContains = array_merge($this->notContains, (array) $patterns);
return $this;
}
@@ -234,18 +249,19 @@ class Finder implements \IteratorAggregate, \Countable
*
* $finder->path('some/special/dir')
* $finder->path('/some\/special\/dir/') // same as above
+ * $finder->path(['some dir', 'another/dir'])
*
* Use only / as dirname separator.
*
- * @param string $pattern A pattern (a regexp or a string)
+ * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns
*
* @return $this
*
* @see FilenameFilterIterator
*/
- public function path($pattern)
+ public function path($patterns)
{
- $this->paths[] = $pattern;
+ $this->paths = array_merge($this->paths, (array) $patterns);
return $this;
}
@@ -257,18 +273,19 @@ class Finder implements \IteratorAggregate, \Countable
*
* $finder->notPath('some/special/dir')
* $finder->notPath('/some\/special\/dir/') // same as above
+ * $finder->notPath(['some/file.txt', 'another/file.log'])
*
* Use only / as dirname separator.
*
- * @param string $pattern A pattern (a regexp or a string)
+ * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns
*
* @return $this
*
* @see FilenameFilterIterator
*/
- public function notPath($pattern)
+ public function notPath($patterns)
{
- $this->notPaths[] = $pattern;
+ $this->notPaths = array_merge($this->notPaths, (array) $patterns);
return $this;
}
@@ -279,17 +296,20 @@ class Finder implements \IteratorAggregate, \Countable
* $finder->size('> 10K');
* $finder->size('<= 1Ki');
* $finder->size(4);
+ * $finder->size(['> 10K', '< 20K'])
*
- * @param string|int $size A size range string or an integer
+ * @param string|int|string[]|int[] $sizes A size range string or an integer or an array of size ranges
*
* @return $this
*
* @see SizeRangeFilterIterator
* @see NumberComparator
*/
- public function size($size)
+ public function size($sizes)
{
- $this->sizes[] = new Comparator\NumberComparator($size);
+ foreach ((array) $sizes as $size) {
+ $this->sizes[] = new Comparator\NumberComparator($size);
+ }
return $this;
}
@@ -319,13 +339,11 @@ class Finder implements \IteratorAggregate, \Countable
*
* This option is enabled by default.
*
- * @param bool $ignoreDotFiles Whether to exclude "hidden" files or not
- *
* @return $this
*
* @see ExcludeDirectoryFilterIterator
*/
- public function ignoreDotFiles($ignoreDotFiles)
+ public function ignoreDotFiles(bool $ignoreDotFiles)
{
if ($ignoreDotFiles) {
$this->ignore |= static::IGNORE_DOT_FILES;
@@ -341,13 +359,11 @@ class Finder implements \IteratorAggregate, \Countable
*
* This option is enabled by default.
*
- * @param bool $ignoreVCS Whether to exclude VCS files or not
- *
* @return $this
*
* @see ExcludeDirectoryFilterIterator
*/
- public function ignoreVCS($ignoreVCS)
+ public function ignoreVCS(bool $ignoreVCS)
{
if ($ignoreVCS) {
$this->ignore |= static::IGNORE_VCS_FILES;
@@ -358,6 +374,24 @@ class Finder implements \IteratorAggregate, \Countable
return $this;
}
+ /**
+ * Forces Finder to obey .gitignore and ignore files based on rules listed there.
+ *
+ * This option is disabled by default.
+ *
+ * @return $this
+ */
+ public function ignoreVCSIgnored(bool $ignoreVCSIgnored)
+ {
+ if ($ignoreVCSIgnored) {
+ $this->ignore |= static::IGNORE_VCS_IGNORED_FILES;
+ } else {
+ $this->ignore &= ~static::IGNORE_VCS_IGNORED_FILES;
+ }
+
+ return $this;
+ }
+
/**
* Adds VCS patterns.
*
@@ -401,9 +435,9 @@ class Finder implements \IteratorAggregate, \Countable
*
* @see SortableIterator
*/
- public function sortByName()
+ public function sortByName(bool $useNaturalSort = false)
{
- $this->sort = Iterator\SortableIterator::SORT_BY_NAME;
+ $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME;
return $this;
}
@@ -442,6 +476,18 @@ class Finder implements \IteratorAggregate, \Countable
return $this;
}
+ /**
+ * Reverses the sorting.
+ *
+ * @return $this
+ */
+ public function reverseSorting()
+ {
+ $this->reverseSorting = true;
+
+ return $this;
+ }
+
/**
* Sorts files and directories by the last inode changed time.
*
@@ -514,13 +560,11 @@ class Finder implements \IteratorAggregate, \Countable
*
* By default, scanning unreadable directories content throws an AccessDeniedException.
*
- * @param bool $ignore
- *
* @return $this
*/
- public function ignoreUnreadableDirs($ignore = true)
+ public function ignoreUnreadableDirs(bool $ignore = true)
{
- $this->ignoreUnreadableDirs = (bool) $ignore;
+ $this->ignoreUnreadableDirs = $ignore;
return $this;
}
@@ -532,7 +576,7 @@ class Finder implements \IteratorAggregate, \Countable
*
* @return $this
*
- * @throws \InvalidArgumentException if one of the directories does not exist
+ * @throws DirectoryNotFoundException if one of the directories does not exist
*/
public function in($dirs)
{
@@ -540,16 +584,16 @@ class Finder implements \IteratorAggregate, \Countable
foreach ((array) $dirs as $dir) {
if (is_dir($dir)) {
- $resolvedDirs[] = $this->normalizeDir($dir);
+ $resolvedDirs[] = [$this->normalizeDir($dir)];
} elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) {
sort($glob);
- $resolvedDirs = array_merge($resolvedDirs, array_map([$this, 'normalizeDir'], $glob));
+ $resolvedDirs[] = array_map([$this, 'normalizeDir'], $glob);
} else {
- throw new \InvalidArgumentException(sprintf('The "%s" directory does not exist.', $dir));
+ throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir));
}
}
- $this->dirs = array_merge($this->dirs, $resolvedDirs);
+ $this->dirs = array_merge($this->dirs, ...$resolvedDirs);
return $this;
}
@@ -559,10 +603,11 @@ class Finder implements \IteratorAggregate, \Countable
*
* This method implements the IteratorAggregate interface.
*
- * @return \Iterator|SplFileInfo[] An iterator
+ * @return \Iterator
*
* @throws \LogicException if the in() method has not been called
*/
+ #[\ReturnTypeWillChange]
public function getIterator()
{
if (0 === \count($this->dirs) && 0 === \count($this->iterators)) {
@@ -570,18 +615,30 @@ class Finder implements \IteratorAggregate, \Countable
}
if (1 === \count($this->dirs) && 0 === \count($this->iterators)) {
- return $this->searchInDirectory($this->dirs[0]);
+ $iterator = $this->searchInDirectory($this->dirs[0]);
+
+ if ($this->sort || $this->reverseSorting) {
+ $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator();
+ }
+
+ return $iterator;
}
$iterator = new \AppendIterator();
foreach ($this->dirs as $dir) {
- $iterator->append($this->searchInDirectory($dir));
+ $iterator->append(new \IteratorIterator(new LazyIterator(function () use ($dir) {
+ return $this->searchInDirectory($dir);
+ })));
}
foreach ($this->iterators as $it) {
$iterator->append($it);
}
+ if ($this->sort || $this->reverseSorting) {
+ $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator();
+ }
+
return $iterator;
}
@@ -590,22 +647,21 @@ class Finder implements \IteratorAggregate, \Countable
*
* The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array.
*
- * @param iterable $iterator
- *
* @return $this
*
* @throws \InvalidArgumentException when the given argument is not iterable
*/
- public function append($iterator)
+ public function append(iterable $iterator)
{
if ($iterator instanceof \IteratorAggregate) {
$this->iterators[] = $iterator->getIterator();
} elseif ($iterator instanceof \Iterator) {
$this->iterators[] = $iterator;
- } elseif ($iterator instanceof \Traversable || \is_array($iterator)) {
+ } elseif (is_iterable($iterator)) {
$it = new \ArrayIterator();
foreach ($iterator as $file) {
- $it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file));
+ $file = $file instanceof \SplFileInfo ? $file : new \SplFileInfo($file);
+ $it[$file->getPathname()] = $file;
}
$this->iterators[] = $it;
} else {
@@ -634,17 +690,13 @@ class Finder implements \IteratorAggregate, \Countable
*
* @return int
*/
+ #[\ReturnTypeWillChange]
public function count()
{
return iterator_count($this->getIterator());
}
- /**
- * @param string $dir
- *
- * @return \Iterator
- */
- private function searchInDirectory($dir)
+ private function searchInDirectory(string $dir): \Iterator
{
$exclude = $this->exclude;
$notPaths = $this->notPaths;
@@ -725,9 +777,8 @@ class Finder implements \IteratorAggregate, \Countable
$iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths);
}
- if ($this->sort) {
- $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
- $iterator = $iteratorAggregate->getIterator();
+ if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) {
+ $iterator = new Iterator\VcsIgnoredFilterIterator($iterator, $dir);
}
return $iterator;
@@ -737,12 +788,8 @@ class Finder implements \IteratorAggregate, \Countable
* Normalizes given directory names by removing trailing slashes.
*
* Excluding: (s)ftp:// or ssh2.(s)ftp:// wrapper
- *
- * @param string $dir
- *
- * @return string
*/
- private function normalizeDir($dir)
+ private function normalizeDir(string $dir): string
{
if ('/' === $dir) {
return $dir;
diff --git a/lib/symfony/finder/Gitignore.php b/lib/symfony/finder/Gitignore.php
new file mode 100644
index 000000000..d42cca1dc
--- /dev/null
+++ b/lib/symfony/finder/Gitignore.php
@@ -0,0 +1,93 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder;
+
+/**
+ * Gitignore matches against text.
+ *
+ * @author Michael VoÅĆÅ”ek
+ * @author Ahmed Abdou
+ */
+class Gitignore
+{
+ /**
+ * Returns a regexp which is the equivalent of the gitignore pattern.
+ *
+ * Format specification: https://git-scm.com/docs/gitignore#_pattern_format
+ */
+ public static function toRegex(string $gitignoreFileContent): string
+ {
+ return self::buildRegex($gitignoreFileContent, false);
+ }
+
+ public static function toRegexMatchingNegatedPatterns(string $gitignoreFileContent): string
+ {
+ return self::buildRegex($gitignoreFileContent, true);
+ }
+
+ private static function buildRegex(string $gitignoreFileContent, bool $inverted): string
+ {
+ $gitignoreFileContent = preg_replace('~(?
+ *
+ * @extends \FilterIterator
*/
-class CustomFilterIterator extends FilterIterator
+class CustomFilterIterator extends \FilterIterator
{
private $filters = [];
/**
- * @param \Iterator $iterator The Iterator to filter
- * @param callable[] $filters An array of PHP callbacks
+ * @param \Iterator $iterator The Iterator to filter
+ * @param callable[] $filters An array of PHP callbacks
*
* @throws \InvalidArgumentException
*/
@@ -44,14 +46,15 @@ class CustomFilterIterator extends FilterIterator
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
$fileinfo = $this->current();
foreach ($this->filters as $filter) {
- if (false === \call_user_func($filter, $fileinfo)) {
+ if (false === $filter($fileinfo)) {
return false;
}
}
diff --git a/lib/symfony/finder/Iterator/DateRangeFilterIterator.php b/lib/symfony/finder/Iterator/DateRangeFilterIterator.php
index 8a47321a3..f592e1913 100644
--- a/lib/symfony/finder/Iterator/DateRangeFilterIterator.php
+++ b/lib/symfony/finder/Iterator/DateRangeFilterIterator.php
@@ -17,14 +17,16 @@ use Symfony\Component\Finder\Comparator\DateComparator;
* DateRangeFilterIterator filters out files that are not in the given date range (last modified dates).
*
* @author Fabien Potencier
+ *
+ * @extends \FilterIterator
*/
-class DateRangeFilterIterator extends FilterIterator
+class DateRangeFilterIterator extends \FilterIterator
{
private $comparators = [];
/**
- * @param \Iterator $iterator The Iterator to filter
- * @param DateComparator[] $comparators An array of DateComparator instances
+ * @param \Iterator $iterator
+ * @param DateComparator[] $comparators
*/
public function __construct(\Iterator $iterator, array $comparators)
{
@@ -36,8 +38,9 @@ class DateRangeFilterIterator extends FilterIterator
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
$fileinfo = $this->current();
diff --git a/lib/symfony/finder/Iterator/DepthRangeFilterIterator.php b/lib/symfony/finder/Iterator/DepthRangeFilterIterator.php
index d9bbeb48f..f593a3f08 100644
--- a/lib/symfony/finder/Iterator/DepthRangeFilterIterator.php
+++ b/lib/symfony/finder/Iterator/DepthRangeFilterIterator.php
@@ -15,17 +15,22 @@ namespace Symfony\Component\Finder\Iterator;
* DepthRangeFilterIterator limits the directory depth.
*
* @author Fabien Potencier
+ *
+ * @template-covariant TKey
+ * @template-covariant TValue
+ *
+ * @extends \FilterIterator
*/
-class DepthRangeFilterIterator extends FilterIterator
+class DepthRangeFilterIterator extends \FilterIterator
{
private $minDepth = 0;
/**
- * @param \RecursiveIteratorIterator $iterator The Iterator to filter
- * @param int $minDepth The min depth
- * @param int $maxDepth The max depth
+ * @param \RecursiveIteratorIterator<\RecursiveIterator> $iterator The Iterator to filter
+ * @param int $minDepth The min depth
+ * @param int $maxDepth The max depth
*/
- public function __construct(\RecursiveIteratorIterator $iterator, $minDepth = 0, $maxDepth = \PHP_INT_MAX)
+ public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = \PHP_INT_MAX)
{
$this->minDepth = $minDepth;
$iterator->setMaxDepth(\PHP_INT_MAX === $maxDepth ? -1 : $maxDepth);
@@ -36,8 +41,9 @@ class DepthRangeFilterIterator extends FilterIterator
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
return $this->getInnerIterator()->getDepth() >= $this->minDepth;
diff --git a/lib/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/lib/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
index 60bc4e814..d9e182c17 100644
--- a/lib/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
+++ b/lib/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
@@ -15,8 +15,11 @@ namespace Symfony\Component\Finder\Iterator;
* ExcludeDirectoryFilterIterator filters out directories.
*
* @author Fabien Potencier
+ *
+ * @extends \FilterIterator
+ * @implements \RecursiveIterator
*/
-class ExcludeDirectoryFilterIterator extends FilterIterator implements \RecursiveIterator
+class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator
{
private $iterator;
private $isRecursive;
@@ -34,7 +37,7 @@ class ExcludeDirectoryFilterIterator extends FilterIterator implements \Recursiv
$patterns = [];
foreach ($directories as $directory) {
$directory = rtrim($directory, '/');
- if (!$this->isRecursive || false !== strpos($directory, '/')) {
+ if (!$this->isRecursive || str_contains($directory, '/')) {
$patterns[] = preg_quote($directory, '#');
} else {
$this->excludedDirs[$directory] = true;
@@ -50,8 +53,9 @@ class ExcludeDirectoryFilterIterator extends FilterIterator implements \Recursiv
/**
* Filters the iterator values.
*
- * @return bool True if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) {
@@ -68,11 +72,19 @@ class ExcludeDirectoryFilterIterator extends FilterIterator implements \Recursiv
return true;
}
+ /**
+ * @return bool
+ */
+ #[\ReturnTypeWillChange]
public function hasChildren()
{
return $this->isRecursive && $this->iterator->hasChildren();
}
+ /**
+ * @return self
+ */
+ #[\ReturnTypeWillChange]
public function getChildren()
{
$children = new self($this->iterator->getChildren(), []);
diff --git a/lib/symfony/finder/Iterator/FileTypeFilterIterator.php b/lib/symfony/finder/Iterator/FileTypeFilterIterator.php
index e9811d4a0..793ae3509 100644
--- a/lib/symfony/finder/Iterator/FileTypeFilterIterator.php
+++ b/lib/symfony/finder/Iterator/FileTypeFilterIterator.php
@@ -15,11 +15,13 @@ namespace Symfony\Component\Finder\Iterator;
* FileTypeFilterIterator only keeps files, directories, or both.
*
* @author Fabien Potencier
+ *
+ * @extends \FilterIterator
*/
-class FileTypeFilterIterator extends FilterIterator
+class FileTypeFilterIterator extends \FilterIterator
{
- const ONLY_FILES = 1;
- const ONLY_DIRECTORIES = 2;
+ public const ONLY_FILES = 1;
+ public const ONLY_DIRECTORIES = 2;
private $mode;
@@ -27,7 +29,7 @@ class FileTypeFilterIterator extends FilterIterator
* @param \Iterator $iterator The Iterator to filter
* @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
*/
- public function __construct(\Iterator $iterator, $mode)
+ public function __construct(\Iterator $iterator, int $mode)
{
$this->mode = $mode;
@@ -37,8 +39,9 @@ class FileTypeFilterIterator extends FilterIterator
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
$fileinfo = $this->current();
diff --git a/lib/symfony/finder/Iterator/FilecontentFilterIterator.php b/lib/symfony/finder/Iterator/FilecontentFilterIterator.php
index 81594b877..79f8c29d3 100644
--- a/lib/symfony/finder/Iterator/FilecontentFilterIterator.php
+++ b/lib/symfony/finder/Iterator/FilecontentFilterIterator.php
@@ -16,14 +16,17 @@ namespace Symfony\Component\Finder\Iterator;
*
* @author Fabien Potencier
* @author WÅodzimierz Gajda
+ *
+ * @extends MultiplePcreFilterIterator
*/
class FilecontentFilterIterator extends MultiplePcreFilterIterator
{
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
if (!$this->matchRegexps && !$this->noMatchRegexps) {
@@ -49,9 +52,9 @@ class FilecontentFilterIterator extends MultiplePcreFilterIterator
*
* @param string $str Pattern: string or regexp
*
- * @return string regexp corresponding to a given string or regexp
+ * @return string
*/
- protected function toRegex($str)
+ protected function toRegex(string $str)
{
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
}
diff --git a/lib/symfony/finder/Iterator/FilenameFilterIterator.php b/lib/symfony/finder/Iterator/FilenameFilterIterator.php
index e168cd8ff..77b3b2419 100644
--- a/lib/symfony/finder/Iterator/FilenameFilterIterator.php
+++ b/lib/symfony/finder/Iterator/FilenameFilterIterator.php
@@ -17,14 +17,17 @@ use Symfony\Component\Finder\Glob;
* FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string).
*
* @author Fabien Potencier
+ *
+ * @extends MultiplePcreFilterIterator
*/
class FilenameFilterIterator extends MultiplePcreFilterIterator
{
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
return $this->isAccepted($this->current()->getFilename());
@@ -38,9 +41,9 @@ class FilenameFilterIterator extends MultiplePcreFilterIterator
*
* @param string $str Pattern: glob or regexp
*
- * @return string regexp corresponding to a given glob or regexp
+ * @return string
*/
- protected function toRegex($str)
+ protected function toRegex(string $str)
{
return $this->isRegex($str) ? $str : Glob::toRegex($str);
}
diff --git a/lib/symfony/finder/Iterator/FilterIterator.php b/lib/symfony/finder/Iterator/FilterIterator.php
deleted file mode 100644
index c16dd8fa9..000000000
--- a/lib/symfony/finder/Iterator/FilterIterator.php
+++ /dev/null
@@ -1,60 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Finder\Iterator;
-
-/**
- * This iterator just overrides the rewind method in order to correct a PHP bug,
- * which existed before version 5.5.23/5.6.7.
- *
- * @see https://bugs.php.net/68557
- *
- * @author Alex Bogomazov
- *
- * @deprecated since 3.4, to be removed in 4.0.
- */
-abstract class FilterIterator extends \FilterIterator
-{
- /**
- * This is a workaround for the problem with \FilterIterator leaving inner \FilesystemIterator in wrong state after
- * rewind in some cases.
- *
- * @see FilterIterator::rewind()
- */
- public function rewind()
- {
- if (\PHP_VERSION_ID > 50607 || (\PHP_VERSION_ID > 50523 && \PHP_VERSION_ID < 50600)) {
- parent::rewind();
-
- return;
- }
-
- $iterator = $this;
- while ($iterator instanceof \OuterIterator) {
- $innerIterator = $iterator->getInnerIterator();
-
- if ($innerIterator instanceof RecursiveDirectoryIterator) {
- // this condition is necessary for iterators to work properly with non-local filesystems like ftp
- if ($innerIterator->isRewindable()) {
- $innerIterator->next();
- $innerIterator->rewind();
- }
- } elseif ($innerIterator instanceof \FilesystemIterator) {
- $innerIterator->next();
- $innerIterator->rewind();
- }
-
- $iterator = $innerIterator;
- }
-
- parent::rewind();
- }
-}
diff --git a/lib/symfony/finder/Iterator/LazyIterator.php b/lib/symfony/finder/Iterator/LazyIterator.php
new file mode 100644
index 000000000..32cc37ff1
--- /dev/null
+++ b/lib/symfony/finder/Iterator/LazyIterator.php
@@ -0,0 +1,32 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * @author JƩrƩmy DerussƩ
+ *
+ * @internal
+ */
+class LazyIterator implements \IteratorAggregate
+{
+ private $iteratorFactory;
+
+ public function __construct(callable $iteratorFactory)
+ {
+ $this->iteratorFactory = $iteratorFactory;
+ }
+
+ public function getIterator(): \Traversable
+ {
+ yield from ($this->iteratorFactory)();
+ }
+}
diff --git a/lib/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/lib/symfony/finder/Iterator/MultiplePcreFilterIterator.php
index ee365a58b..564765d8f 100644
--- a/lib/symfony/finder/Iterator/MultiplePcreFilterIterator.php
+++ b/lib/symfony/finder/Iterator/MultiplePcreFilterIterator.php
@@ -15,16 +15,21 @@ namespace Symfony\Component\Finder\Iterator;
* MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings).
*
* @author Fabien Potencier
+ *
+ * @template-covariant TKey
+ * @template-covariant TValue
+ *
+ * @extends \FilterIterator
*/
-abstract class MultiplePcreFilterIterator extends FilterIterator
+abstract class MultiplePcreFilterIterator extends \FilterIterator
{
protected $matchRegexps = [];
protected $noMatchRegexps = [];
/**
* @param \Iterator $iterator The Iterator to filter
- * @param array $matchPatterns An array of patterns that need to match
- * @param array $noMatchPatterns An array of patterns that need to not match
+ * @param string[] $matchPatterns An array of patterns that need to match
+ * @param string[] $noMatchPatterns An array of patterns that need to not match
*/
public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns)
{
@@ -46,11 +51,9 @@ abstract class MultiplePcreFilterIterator extends FilterIterator
* Such case can be handled by child classes before calling the method if they want to
* apply a different behavior.
*
- * @param string $string The string to be matched against filters
- *
* @return bool
*/
- protected function isAccepted($string)
+ protected function isAccepted(string $string)
{
// should at least not match one rule to exclude
foreach ($this->noMatchRegexps as $regex) {
@@ -77,13 +80,17 @@ abstract class MultiplePcreFilterIterator extends FilterIterator
/**
* Checks whether the string is a regex.
*
- * @param string $str
- *
- * @return bool Whether the given string is a regex
+ * @return bool
*/
- protected function isRegex($str)
+ protected function isRegex(string $str)
{
- if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) {
+ $availableModifiers = 'imsxuADU';
+
+ if (\PHP_VERSION_ID >= 80200) {
+ $availableModifiers .= 'n';
+ }
+
+ if (preg_match('/^(.{3,}?)['.$availableModifiers.']*$/', $str, $m)) {
$start = substr($m[1], 0, 1);
$end = substr($m[1], -1);
@@ -104,9 +111,7 @@ abstract class MultiplePcreFilterIterator extends FilterIterator
/**
* Converts string into regexp.
*
- * @param string $str Pattern
- *
- * @return string regexp corresponding to a given string
+ * @return string
*/
- abstract protected function toRegex($str);
+ abstract protected function toRegex(string $str);
}
diff --git a/lib/symfony/finder/Iterator/PathFilterIterator.php b/lib/symfony/finder/Iterator/PathFilterIterator.php
index 3fda557be..7974c4ee3 100644
--- a/lib/symfony/finder/Iterator/PathFilterIterator.php
+++ b/lib/symfony/finder/Iterator/PathFilterIterator.php
@@ -16,14 +16,17 @@ namespace Symfony\Component\Finder\Iterator;
*
* @author Fabien Potencier
* @author WÅodzimierz Gajda
+ *
+ * @extends MultiplePcreFilterIterator
*/
class PathFilterIterator extends MultiplePcreFilterIterator
{
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
$filename = $this->current()->getRelativePathname();
@@ -47,9 +50,9 @@ class PathFilterIterator extends MultiplePcreFilterIterator
*
* @param string $str Pattern: regexp or dirname
*
- * @return string regexp corresponding to a given string or regexp
+ * @return string
*/
- protected function toRegex($str)
+ protected function toRegex(string $str)
{
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
}
diff --git a/lib/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/lib/symfony/finder/Iterator/RecursiveDirectoryIterator.php
index 63764d407..27589cdd5 100644
--- a/lib/symfony/finder/Iterator/RecursiveDirectoryIterator.php
+++ b/lib/symfony/finder/Iterator/RecursiveDirectoryIterator.php
@@ -37,13 +37,9 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
private $directorySeparator = '/';
/**
- * @param string $path
- * @param int $flags
- * @param bool $ignoreUnreadableDirs
- *
* @throws \RuntimeException
*/
- public function __construct($path, $flags, $ignoreUnreadableDirs = false)
+ public function __construct(string $path, int $flags, bool $ignoreUnreadableDirs = false)
{
if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) {
throw new \RuntimeException('This iterator only support returning current as fileinfo.');
@@ -60,14 +56,15 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
/**
* Return an instance of SplFileInfo with support for relative paths.
*
- * @return SplFileInfo File information
+ * @return SplFileInfo
*/
+ #[\ReturnTypeWillChange]
public function current()
{
// the logic here avoids redoing the same work in all iterations
if (null === $subPathname = $this->subPath) {
- $subPathname = $this->subPath = (string) $this->getSubPath();
+ $subPathname = $this->subPath = $this->getSubPath();
}
if ('' !== $subPathname) {
$subPathname .= $this->directorySeparator;
@@ -82,10 +79,35 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
}
/**
- * @return \RecursiveIterator
+ * @param bool $allowLinks
+ *
+ * @return bool
+ */
+ #[\ReturnTypeWillChange]
+ public function hasChildren($allowLinks = false)
+ {
+ $hasChildren = parent::hasChildren($allowLinks);
+
+ if (!$hasChildren || !$this->ignoreUnreadableDirs) {
+ return $hasChildren;
+ }
+
+ try {
+ parent::getChildren();
+
+ return true;
+ } catch (\UnexpectedValueException $e) {
+ // If directory is unreadable and finder is set to ignore it, skip children
+ return false;
+ }
+ }
+
+ /**
+ * @return \RecursiveDirectoryIterator
*
* @throws AccessDeniedException
*/
+ #[\ReturnTypeWillChange]
public function getChildren()
{
try {
@@ -102,36 +124,29 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
return $children;
} catch (\UnexpectedValueException $e) {
- if ($this->ignoreUnreadableDirs) {
- // If directory is unreadable and finder is set to ignore it, a fake empty content is returned.
- return new \RecursiveArrayIterator([]);
- } else {
- throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e);
- }
+ throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e);
}
}
/**
* Do nothing for non rewindable stream.
+ *
+ * @return void
*/
+ #[\ReturnTypeWillChange]
public function rewind()
{
if (false === $this->isRewindable()) {
return;
}
- // @see https://bugs.php.net/68557
- if (\PHP_VERSION_ID < 50523 || \PHP_VERSION_ID >= 50600 && \PHP_VERSION_ID < 50607) {
- parent::next();
- }
-
parent::rewind();
}
/**
* Checks if the stream is rewindable.
*
- * @return bool true when the stream is rewindable, false otherwise
+ * @return bool
*/
public function isRewindable()
{
@@ -139,11 +154,6 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
return $this->rewindable;
}
- // workaround for an HHVM bug, should be removed when https://github.com/facebook/hhvm/issues/7281 is fixed
- if ('' === $this->getPath()) {
- return $this->rewindable = false;
- }
-
if (false !== $stream = @opendir($this->getPath())) {
$infos = stream_get_meta_data($stream);
closedir($stream);
diff --git a/lib/symfony/finder/Iterator/SizeRangeFilterIterator.php b/lib/symfony/finder/Iterator/SizeRangeFilterIterator.php
index 4e521c8c9..575bf29b7 100644
--- a/lib/symfony/finder/Iterator/SizeRangeFilterIterator.php
+++ b/lib/symfony/finder/Iterator/SizeRangeFilterIterator.php
@@ -17,14 +17,16 @@ use Symfony\Component\Finder\Comparator\NumberComparator;
* SizeRangeFilterIterator filters out files that are not in the given size range.
*
* @author Fabien Potencier
+ *
+ * @extends \FilterIterator
*/
-class SizeRangeFilterIterator extends FilterIterator
+class SizeRangeFilterIterator extends \FilterIterator
{
private $comparators = [];
/**
- * @param \Iterator $iterator The Iterator to filter
- * @param NumberComparator[] $comparators An array of NumberComparator instances
+ * @param \Iterator $iterator
+ * @param NumberComparator[] $comparators
*/
public function __construct(\Iterator $iterator, array $comparators)
{
@@ -36,8 +38,9 @@ class SizeRangeFilterIterator extends FilterIterator
/**
* Filters the iterator values.
*
- * @return bool true if the value should be kept, false otherwise
+ * @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
$fileinfo = $this->current();
diff --git a/lib/symfony/finder/Iterator/SortableIterator.php b/lib/symfony/finder/Iterator/SortableIterator.php
index e67997d11..9afde5c25 100644
--- a/lib/symfony/finder/Iterator/SortableIterator.php
+++ b/lib/symfony/finder/Iterator/SortableIterator.php
@@ -15,65 +15,89 @@ namespace Symfony\Component\Finder\Iterator;
* SortableIterator applies a sort on a given Iterator.
*
* @author Fabien Potencier
+ *
+ * @implements \IteratorAggregate
*/
class SortableIterator implements \IteratorAggregate
{
- const SORT_BY_NAME = 1;
- const SORT_BY_TYPE = 2;
- const SORT_BY_ACCESSED_TIME = 3;
- const SORT_BY_CHANGED_TIME = 4;
- const SORT_BY_MODIFIED_TIME = 5;
+ public const SORT_BY_NONE = 0;
+ public const SORT_BY_NAME = 1;
+ public const SORT_BY_TYPE = 2;
+ public const SORT_BY_ACCESSED_TIME = 3;
+ public const SORT_BY_CHANGED_TIME = 4;
+ public const SORT_BY_MODIFIED_TIME = 5;
+ public const SORT_BY_NAME_NATURAL = 6;
private $iterator;
private $sort;
/**
- * @param \Traversable $iterator The Iterator to filter
- * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
+ * @param \Traversable $iterator
+ * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
*
* @throws \InvalidArgumentException
*/
- public function __construct(\Traversable $iterator, $sort)
+ public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false)
{
$this->iterator = $iterator;
+ $order = $reverseOrder ? -1 : 1;
if (self::SORT_BY_NAME === $sort) {
- $this->sort = static function ($a, $b) {
- return strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
+ $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
+ return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
+ };
+ } elseif (self::SORT_BY_NAME_NATURAL === $sort) {
+ $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
+ return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
};
} elseif (self::SORT_BY_TYPE === $sort) {
- $this->sort = static function ($a, $b) {
+ $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
if ($a->isDir() && $b->isFile()) {
- return -1;
+ return -$order;
} elseif ($a->isFile() && $b->isDir()) {
- return 1;
+ return $order;
}
- return strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
+ return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
};
} elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
- $this->sort = static function ($a, $b) {
- return $a->getATime() - $b->getATime();
+ $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
+ return $order * ($a->getATime() - $b->getATime());
};
} elseif (self::SORT_BY_CHANGED_TIME === $sort) {
- $this->sort = static function ($a, $b) {
- return $a->getCTime() - $b->getCTime();
+ $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
+ return $order * ($a->getCTime() - $b->getCTime());
};
} elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
- $this->sort = static function ($a, $b) {
- return $a->getMTime() - $b->getMTime();
+ $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
+ return $order * ($a->getMTime() - $b->getMTime());
};
+ } elseif (self::SORT_BY_NONE === $sort) {
+ $this->sort = $order;
} elseif (\is_callable($sort)) {
- $this->sort = $sort;
+ $this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use ($sort) { return -$sort($a, $b); } : $sort;
} else {
throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.');
}
}
+ /**
+ * @return \Traversable
+ */
+ #[\ReturnTypeWillChange]
public function getIterator()
{
+ if (1 === $this->sort) {
+ return $this->iterator;
+ }
+
$array = iterator_to_array($this->iterator, true);
- uasort($array, $this->sort);
+
+ if (-1 === $this->sort) {
+ $array = array_reverse($array);
+ } else {
+ uasort($array, $this->sort);
+ }
return new \ArrayIterator($array);
}
diff --git a/lib/symfony/finder/Iterator/VcsIgnoredFilterIterator.php b/lib/symfony/finder/Iterator/VcsIgnoredFilterIterator.php
new file mode 100644
index 000000000..e27158cbd
--- /dev/null
+++ b/lib/symfony/finder/Iterator/VcsIgnoredFilterIterator.php
@@ -0,0 +1,151 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+use Symfony\Component\Finder\Gitignore;
+
+final class VcsIgnoredFilterIterator extends \FilterIterator
+{
+ /**
+ * @var string
+ */
+ private $baseDir;
+
+ /**
+ * @var array
+ */
+ private $gitignoreFilesCache = [];
+
+ /**
+ * @var array
+ */
+ private $ignoredPathsCache = [];
+
+ public function __construct(\Iterator $iterator, string $baseDir)
+ {
+ $this->baseDir = $this->normalizePath($baseDir);
+
+ parent::__construct($iterator);
+ }
+
+ public function accept(): bool
+ {
+ $file = $this->current();
+
+ $fileRealPath = $this->normalizePath($file->getRealPath());
+
+ return !$this->isIgnored($fileRealPath);
+ }
+
+ private function isIgnored(string $fileRealPath): bool
+ {
+ if (is_dir($fileRealPath) && !str_ends_with($fileRealPath, '/')) {
+ $fileRealPath .= '/';
+ }
+
+ if (isset($this->ignoredPathsCache[$fileRealPath])) {
+ return $this->ignoredPathsCache[$fileRealPath];
+ }
+
+ $ignored = false;
+
+ foreach ($this->parentsDirectoryDownward($fileRealPath) as $parentDirectory) {
+ if ($this->isIgnored($parentDirectory)) {
+ // rules in ignored directories are ignored, no need to check further.
+ break;
+ }
+
+ $fileRelativePath = substr($fileRealPath, \strlen($parentDirectory) + 1);
+
+ if (null === $regexps = $this->readGitignoreFile("{$parentDirectory}/.gitignore")) {
+ continue;
+ }
+
+ [$exclusionRegex, $inclusionRegex] = $regexps;
+
+ if (preg_match($exclusionRegex, $fileRelativePath)) {
+ $ignored = true;
+
+ continue;
+ }
+
+ if (preg_match($inclusionRegex, $fileRelativePath)) {
+ $ignored = false;
+ }
+ }
+
+ return $this->ignoredPathsCache[$fileRealPath] = $ignored;
+ }
+
+ /**
+ * @return list
+ */
+ private function parentsDirectoryDownward(string $fileRealPath): array
+ {
+ $parentDirectories = [];
+
+ $parentDirectory = $fileRealPath;
+
+ while (true) {
+ $newParentDirectory = \dirname($parentDirectory);
+
+ // dirname('/') = '/'
+ if ($newParentDirectory === $parentDirectory) {
+ break;
+ }
+
+ $parentDirectory = $newParentDirectory;
+
+ if (0 !== strpos($parentDirectory, $this->baseDir)) {
+ break;
+ }
+
+ $parentDirectories[] = $parentDirectory;
+ }
+
+ return array_reverse($parentDirectories);
+ }
+
+ /**
+ * @return array{0: string, 1: string}|null
+ */
+ private function readGitignoreFile(string $path): ?array
+ {
+ if (\array_key_exists($path, $this->gitignoreFilesCache)) {
+ return $this->gitignoreFilesCache[$path];
+ }
+
+ if (!file_exists($path)) {
+ return $this->gitignoreFilesCache[$path] = null;
+ }
+
+ if (!is_file($path) || !is_readable($path)) {
+ throw new \RuntimeException("The \"ignoreVCSIgnored\" option cannot be used by the Finder as the \"{$path}\" file is not readable.");
+ }
+
+ $gitignoreFileContent = file_get_contents($path);
+
+ return $this->gitignoreFilesCache[$path] = [
+ Gitignore::toRegex($gitignoreFileContent),
+ Gitignore::toRegexMatchingNegatedPatterns($gitignoreFileContent),
+ ];
+ }
+
+ private function normalizePath(string $path): string
+ {
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ return str_replace('\\', '/', $path);
+ }
+
+ return $path;
+ }
+}
diff --git a/lib/symfony/finder/LICENSE b/lib/symfony/finder/LICENSE
index 9e936ec04..88bf75bb4 100644
--- a/lib/symfony/finder/LICENSE
+++ b/lib/symfony/finder/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2020 Fabien Potencier
+Copyright (c) 2004-2022 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/symfony/finder/README.md b/lib/symfony/finder/README.md
index 0b19c7525..22bdeb9bc 100644
--- a/lib/symfony/finder/README.md
+++ b/lib/symfony/finder/README.md
@@ -7,8 +7,8 @@ interface.
Resources
---------
- * [Documentation](https://symfony.com/doc/current/components/finder.html)
- * [Contributing](https://symfony.com/doc/current/contributing/index.html)
- * [Report issues](https://github.com/symfony/symfony/issues) and
- [send Pull Requests](https://github.com/symfony/symfony/pulls)
- in the [main Symfony repository](https://github.com/symfony/symfony)
+ * [Documentation](https://symfony.com/doc/current/components/finder.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/lib/symfony/finder/SplFileInfo.php b/lib/symfony/finder/SplFileInfo.php
index 0f4e025b2..11604a2ef 100644
--- a/lib/symfony/finder/SplFileInfo.php
+++ b/lib/symfony/finder/SplFileInfo.php
@@ -26,7 +26,7 @@ class SplFileInfo extends \SplFileInfo
* @param string $relativePath The relative path
* @param string $relativePathname The relative path name
*/
- public function __construct($file, $relativePath, $relativePathname)
+ public function __construct(string $file, string $relativePath, string $relativePathname)
{
parent::__construct($file);
$this->relativePath = $relativePath;
@@ -38,7 +38,7 @@ class SplFileInfo extends \SplFileInfo
*
* This path does not contain the file name.
*
- * @return string the relative path
+ * @return string
*/
public function getRelativePath()
{
@@ -50,25 +50,35 @@ class SplFileInfo extends \SplFileInfo
*
* This path contains the file name.
*
- * @return string the relative path name
+ * @return string
*/
public function getRelativePathname()
{
return $this->relativePathname;
}
+ public function getFilenameWithoutExtension(): string
+ {
+ $filename = $this->getFilename();
+
+ return pathinfo($filename, \PATHINFO_FILENAME);
+ }
+
/**
* Returns the contents of the file.
*
- * @return string the contents of the file
+ * @return string
*
* @throws \RuntimeException
*/
public function getContents()
{
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
- $content = file_get_contents($this->getPathname());
- restore_error_handler();
+ try {
+ $content = file_get_contents($this->getPathname());
+ } finally {
+ restore_error_handler();
+ }
if (false === $content) {
throw new \RuntimeException($error);
}
diff --git a/lib/symfony/finder/composer.json b/lib/symfony/finder/composer.json
index b0895524b..ef19911da 100644
--- a/lib/symfony/finder/composer.json
+++ b/lib/symfony/finder/composer.json
@@ -1,7 +1,7 @@
{
"name": "symfony/finder",
"type": "library",
- "description": "Symfony Finder Component",
+ "description": "Finds files and directories via an intuitive fluent interface",
"keywords": [],
"homepage": "https://symfony.com",
"license": "MIT",
@@ -16,7 +16,9 @@
}
],
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Finder\\": "" },
diff --git a/lib/symfony/finder/phpunit.xml.dist b/lib/symfony/finder/phpunit.xml.dist
deleted file mode 100644
index 078847af9..000000000
--- a/lib/symfony/finder/phpunit.xml.dist
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
- ./Tests/
-
-
-
-
-
- ./
-
- ./Tests
- ./vendor
-
-
-
-
diff --git a/lib/symfony/framework-bundle/.gitignore b/lib/symfony/framework-bundle/.gitignore
deleted file mode 100644
index c49a5d8df..000000000
--- a/lib/symfony/framework-bundle/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-vendor/
-composer.lock
-phpunit.xml
diff --git a/lib/symfony/framework-bundle/CHANGELOG.md b/lib/symfony/framework-bundle/CHANGELOG.md
index f04942dbc..ea913ef98 100644
--- a/lib/symfony/framework-bundle/CHANGELOG.md
+++ b/lib/symfony/framework-bundle/CHANGELOG.md
@@ -1,6 +1,227 @@
CHANGELOG
=========
+5.4
+---
+
+ * Add `set_locale_from_accept_language` config option to automatically set the request locale based on the `Accept-Language`
+ HTTP request header and the `framework.enabled_locales` config option
+ * Add `set_content_language_from_locale` config option to automatically set the `Content-Language` HTTP response header based on the Request locale
+ * Deprecate the `framework.translator.enabled_locales`, use `framework.enabled_locales` instead
+ * Add autowiring alias for `HttpCache\StoreInterface`
+ * Add the ability to enable the profiler using a request query parameter, body parameter or attribute
+ * Deprecate the `AdapterInterface` autowiring alias, use `CacheItemPoolInterface` instead
+ * Deprecate the public `profiler` service to private
+ * Deprecate `get()`, `has()`, `getDoctrine()`, and `dispatchMessage()` in `AbstractController`, use method/constructor injection instead
+ * Deprecate the `cache.adapter.doctrine` service
+ * Add support for resetting container services after each messenger message
+ * Add `configureContainer()`, `configureRoutes()`, `getConfigDir()` and `getBundlesPath()` to `MicroKernelTrait`
+ * Add support for configuring log level, and status code by exception class
+ * Bind the `default_context` parameter onto serializer's encoders and normalizers
+ * Add support for `statusCode` default parameter when loading a template directly from route using the `Symfony\Bundle\FrameworkBundle\Controller\TemplateController` controller
+ * Deprecate `translation:update` command, use `translation:extract` instead
+ * Add `PhpStanExtractor` support for the PropertyInfo component
+ * Add `cache.adapter.doctrine_dbal` service to replace `cache.adapter.pdo` when a Doctrine DBAL connection is used.
+
+5.3
+---
+
+ * Deprecate the `session.storage` alias and `session.storage.*` services, use the `session.storage.factory` alias and `session.storage.factory.*` services instead
+ * Deprecate the `framework.session.storage_id` configuration option, use the `framework.session.storage_factory_id` configuration option instead
+ * Deprecate the `session` service and the `SessionInterface` alias, use the `Request::getSession()` or the new `RequestStack::getSession()` methods instead
+ * Add `AbstractController::renderForm()` to render a form and set the appropriate HTTP status code
+ * Add support for configuring PHP error level to log levels
+ * Add the `dispatcher` option to `debug:event-dispatcher`
+ * Add the `event_dispatcher.dispatcher` tag
+ * Add `assertResponseFormatSame()` in `BrowserKitAssertionsTrait`
+ * Add support for configuring UUID factory services
+ * Add tag `assets.package` to register asset packages
+ * Add support to use a PSR-6 compatible cache for Doctrine annotations
+ * Deprecate all other values than "none", "php_array" and "file" for `framework.annotation.cache`
+ * Add `KernelTestCase::getContainer()` as the best way to get a container in tests
+ * Rename the container parameter `profiler_listener.only_master_requests` to `profiler_listener.only_main_requests`
+ * Add service `fragment.uri_generator` to generate the URI of a fragment
+ * Deprecate registering workflow services as public
+ * Deprecate option `--xliff-version` of the `translation:update` command, use e.g. `--format=xlf20` instead
+ * Deprecate option `--output-format` of the `translation:update` command, use e.g. `--format=xlf20` instead
+
+5.2.0
+-----
+
+ * Added `framework.http_cache` configuration tree
+ * Added `framework.trusted_proxies` and `framework.trusted_headers` configuration options
+ * Deprecated the public `form.factory`, `form.type.file`, `translator`, `security.csrf.token_manager`, `serializer`,
+ `cache_clearer`, `filesystem` and `validator` services to private.
+ * Added `TemplateAwareDataCollectorInterface` and `AbstractDataCollector` to simplify custom data collector creation and leverage autoconfiguration
+ * Add `cache.adapter.redis_tag_aware` tag to use `RedisCacheAwareAdapter`
+ * added `framework.http_client.retry_failing` configuration tree
+ * added `assertCheckboxChecked()` and `assertCheckboxNotChecked()` in `WebTestCase`
+ * added `assertFormValue()` and `assertNoFormValue()` in `WebTestCase`
+ * Added "--as-tree=3" option to `translation:update` command to dump messages as a tree-like structure. The given value defines the level where to switch to inline YAML
+ * Deprecated the `lock.RESOURCE_NAME` and `lock.RESOURCE_NAME.store` services and the `lock`, `LockInterface`, `lock.store` and `PersistingStoreInterface` aliases, use `lock.RESOURCE_NAME.factory`, `lock.factory` or `LockFactory` instead.
+
+5.1.0
+-----
+ * Removed `--no-backup` option from `translation:update` command (broken since `5.0.0`)
+ * Added link to source for controllers registered as named services
+ * Added link to source on controller on `router:match`/`debug:router` (when `framework.ide` is configured)
+ * Added the `framework.router.default_uri` configuration option to configure the default `RequestContext`
+ * Made `MicroKernelTrait::configureContainer()` compatible with `ContainerConfigurator`
+ * Added a new `mailer.message_bus` option to configure or disable the message bus to use to send mails.
+ * Added flex-compatible default implementation for `MicroKernelTrait::registerBundles()`
+ * Deprecated passing a `RouteCollectionBuilder` to `MicroKernelTrait::configureRoutes()`, type-hint `RoutingConfigurator` instead
+ * The `TemplateController` now accepts context argument
+ * Deprecated *not* setting the "framework.router.utf8" configuration option as it will default to `true` in Symfony 6.0
+ * Added tag `routing.expression_language_function` to define functions available in route conditions
+ * Added `debug:container --deprecations` option to see compile-time deprecations.
+ * Made `BrowserKitAssertionsTrait` report the original error message in case of a failure
+ * Added ability for `config:dump-reference` and `debug:config` to dump and debug kernel container extension configuration.
+ * Deprecated `session.attribute_bag` service and `session.flash_bag` service.
+
+5.0.0
+-----
+
+ * Removed support to load translation resources from the legacy directories `src/Resources/translations/` and `src/Resources//translations/`
+ * Removed `ControllerNameParser`.
+ * Removed `ResolveControllerNameSubscriber`
+ * Removed support for `bundle:controller:action` to reference controllers. Use `serviceOrFqcn::method` instead
+ * Removed support for PHP templating, use Twig instead
+ * Removed `Controller`, use `AbstractController` instead
+ * Removed `Client`, use `KernelBrowser` instead
+ * Removed `ContainerAwareCommand`, use dependency injection instead
+ * Removed the `validation.strict_email` option, use `validation.email_validation_mode` instead
+ * Removed the `cache.app.simple` service and its corresponding PSR-16 autowiring alias
+ * Removed cache-related compiler passes and `RequestDataCollector`
+ * Removed the `translator.selector` and `session.save_listener` services
+ * Removed `SecurityUserValueResolver`, use `UserValueResolver` instead
+ * Removed `routing.loader.service`.
+ * Service route loaders must be tagged with `routing.route_loader`.
+ * Added `slugger` service and `SluggerInterface` alias
+ * Removed the `lock.store.flock`, `lock.store.semaphore`, `lock.store.memcached.abstract` and `lock.store.redis.abstract` services.
+ * Removed the `router.cache_class_prefix` parameter.
+
+4.4.0
+-----
+
+ * Added `lint:container` command to check that services wiring matches type declarations
+ * Added `MailerAssertionsTrait`
+ * Deprecated support for `templating` engine in `TemplateController`, use Twig instead
+ * Deprecated the `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()`
+ * Deprecated the `controller_name_converter` and `resolve_controller_name_subscriber` services
+ * The `ControllerResolver` and `DelegatingLoader` classes have been marked as `final`
+ * Added support for configuring chained cache pools
+ * Deprecated calling `WebTestCase::createClient()` while a kernel has been booted, ensure the kernel is shut down before calling the method
+ * Deprecated `routing.loader.service`, use `routing.loader.container` instead.
+ * Not tagging service route loaders with `routing.route_loader` has been deprecated.
+ * Overriding the methods `KernelTestCase::tearDown()` and `WebTestCase::tearDown()` without the `void` return-type is deprecated.
+ * Added new `error_controller` configuration to handle system exceptions
+ * Added sort option for `translation:update` command.
+ * [BC Break] The `framework.messenger.routing.senders` config key is not deeply merged anymore.
+ * Added `secrets:*` commands to deal with secrets seamlessly.
+ * Made `framework.session.handler_id` accept a DSN
+ * Marked the `RouterDataCollector` class as `@final`.
+ * [BC Break] The `framework.messenger.buses..middleware` config key is not deeply merged anymore.
+ * Moved `MailerAssertionsTrait` in `KernelTestCase`
+
+4.3.0
+-----
+
+ * Deprecated the `framework.templating` option, configure the Twig bundle instead.
+ * Added `WebTestAssertionsTrait` (included by default in `WebTestCase`)
+ * Renamed `Client` to `KernelBrowser`
+ * Not passing the project directory to the constructor of the `AssetsInstallCommand` is deprecated. This argument will
+ be mandatory in 5.0.
+ * Deprecated the "Psr\SimpleCache\CacheInterface" / "cache.app.simple" service, use "Symfony\Contracts\Cache\CacheInterface" / "cache.app" instead
+ * Added the ability to specify a custom `serializer` option for each
+ transport under`framework.messenger.transports`.
+ * Added the `RegisterLocaleAwareServicesPass` and configured the `LocaleAwareListener`
+ * [BC Break] When using Messenger, the default transport changed from
+ using Symfony's serializer service to use `PhpSerializer`, which uses
+ PHP's native `serialize()` and `unserialize()` functions. To use the
+ original serialization method, set the `framework.messenger.default_serializer`
+ config option to `messenger.transport.symfony_serializer`. Or set the
+ `serializer` option under one specific `transport`.
+ * [BC Break] The `framework.messenger.serializer` config key changed to
+ `framework.messenger.default_serializer`, which holds the string service
+ id and `framework.messenger.symfony_serializer`, which configures the
+ options if you're using Symfony's serializer.
+ * [BC Break] Removed the `framework.messenger.routing.send_and_handle` configuration.
+ Instead of setting it to true, configure a `SyncTransport` and route messages to it.
+ * Added information about deprecated aliases in `debug:autowiring`
+ * Added php ini session options `sid_length` and `sid_bits_per_character`
+ to the `session` section of the configuration
+ * Added support for Translator paths, Twig paths in translation commands.
+ * Added support for PHP files with translations in translation commands.
+ * Added support for boolean container parameters within routes.
+ * Added the `messenger:setup-transports` command to setup messenger transports
+ * Added a `InMemoryTransport` to Messenger. Use it with a DSN starting with `in-memory://`.
+ * Added `framework.property_access.throw_exception_on_invalid_property_path` config option.
+ * Added `cache:pool:list` command to list all available cache pools.
+
+4.2.0
+-----
+
+ * Added a `AbstractController::addLink()` method to add Link headers to the current response
+ * Allowed configuring taggable cache pools via a new `framework.cache.pools.tags` option (bool|service-id)
+ * Allowed configuring PDO-based cache pools via a new `cache.adapter.pdo` abstract service
+ * Deprecated auto-injection of the container in AbstractController instances, register them as service subscribers instead
+ * Deprecated processing of services tagged `security.expression_language_provider` in favor of a new `AddExpressionLanguageProvidersPass` in SecurityBundle.
+ * Deprecated the `Symfony\Bundle\FrameworkBundle\Controller\Controller` class in favor of `Symfony\Bundle\FrameworkBundle\Controller\AbstractController`.
+ * Enabled autoconfiguration for `Psr\Log\LoggerAwareInterface`
+ * Added new "auto" mode for `framework.session.cookie_secure` to turn it on when HTTPS is used
+ * Removed the `framework.messenger.encoder` and `framework.messenger.decoder` options. Use the `framework.messenger.serializer.id` option to replace the Messenger serializer.
+ * Deprecated the `ContainerAwareCommand` class in favor of `Symfony\Component\Console\Command\Command`
+ * Made `debug:container` and `debug:autowiring` ignore backslashes in service ids
+ * Deprecated the `Templating\Helper\TranslatorHelper::transChoice()` method, use the `trans()` one instead with a `%count%` parameter
+ * Deprecated `CacheCollectorPass`. Use `Symfony\Component\Cache\DependencyInjection\CacheCollectorPass` instead.
+ * Deprecated `CachePoolClearerPass`. Use `Symfony\Component\Cache\DependencyInjection\CachePoolClearerPass` instead.
+ * Deprecated `CachePoolPass`. Use `Symfony\Component\Cache\DependencyInjection\CachePoolPass` instead.
+ * Deprecated `CachePoolPrunerPass`. Use `Symfony\Component\Cache\DependencyInjection\CachePoolPrunerPass` instead.
+ * Deprecated support for legacy translations directories `src/Resources/translations/` and `src/Resources//translations/`, use `translations/` instead.
+ * Deprecated support for the legacy directory structure in `translation:update` and `debug:translation` commands.
+
+4.1.0
+-----
+
+ * Allowed to pass an optional `LoggerInterface $logger` instance to the `Router`
+ * Added a new `parameter_bag` service with related autowiring aliases to access parameters as-a-service
+ * Allowed the `Router` to work with any PSR-11 container
+ * Added option in workflow dump command to label graph with a custom label
+ * Using a `RouterInterface` that does not implement the `WarmableInterface` is deprecated.
+ * Warming up a router in `RouterCacheWarmer` that does not implement the `WarmableInterface` is deprecated and will not
+ be supported anymore in 5.0.
+ * The `RequestDataCollector` class has been deprecated. Use the `Symfony\Component\HttpKernel\DataCollector\RequestDataCollector` class instead.
+ * The `RedirectController` class allows for 307/308 HTTP status codes
+ * Deprecated `bundle:controller:action` syntax to reference controllers. Use `serviceOrFqcn::method` instead where `serviceOrFqcn`
+ is either the service ID or the FQCN of the controller.
+ * Deprecated `Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser`
+ * The `container.service_locator` tag of `ServiceLocator`s is now autoconfigured.
+ * Add the ability to search a route in `debug:router`.
+ * Add the ability to use SameSite cookies for sessions.
+
+4.0.0
+-----
+
+ * The default `type` option of the `framework.workflows.*` configuration entries is `state_machine`
+ * removed `AddConsoleCommandPass`, `AddConstraintValidatorsPass`,
+ `AddValidatorInitializersPass`, `CompilerDebugDumpPass`, `ConfigCachePass`,
+ `ControllerArgumentValueResolverPass`, `FormPass`, `PropertyInfoPass`,
+ `RoutingResolverPass`, `SerializerPass`, `ValidateWorkflowsPass`
+ * made `Translator::__construct()` `$defaultLocale` argument required
+ * removed `SessionListener`, `TestSessionListener`
+ * Removed `cache:clear` warmup part along with the `--no-optional-warmers` option
+ * Removed core form types services registration when unnecessary
+ * Removed `framework.serializer.cache` option and `serializer.mapping.cache.apc`, `serializer.mapping.cache.doctrine.apc` services
+ * Removed `ConstraintValidatorFactory`
+ * Removed class parameters related to routing
+ * Removed absolute template paths support in the template name parser
+ * Removed support of the `KERNEL_DIR` environment variable with `KernelTestCase::getKernelClass()`.
+ * Removed the `KernelTestCase::getPhpUnitXmlDir()` and `KernelTestCase::getPhpUnitCliConfigArgument()` methods.
+ * Removed the "framework.validation.cache" configuration option. Configure the "cache.validator" service under "framework.cache.pools" instead.
+ * Removed `PhpStringTokenParser`, use `Symfony\Component\Translation\Extractor\PhpStringTokenParser` instead.
+ * Removed `PhpExtractor`, use `Symfony\Component\Translation\Extractor\PhpExtractor` instead.
+ * Removed the `use_strict_mode` session option, it's is now enabled by default
+
3.4.0
-----
diff --git a/lib/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php
index aca75b507..17e066045 100644
--- a/lib/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php
+++ b/lib/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php
@@ -11,30 +11,22 @@
namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
-use Psr\Cache\CacheItemPoolInterface;
-use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\NullAdapter;
use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
-use Symfony\Component\Cache\Adapter\ProxyAdapter;
use Symfony\Component\Config\Resource\ClassExistenceResource;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
abstract class AbstractPhpFileCacheWarmer implements CacheWarmerInterface
{
private $phpArrayFile;
- private $fallbackPool;
/**
- * @param string $phpArrayFile The PHP file where metadata are cached
- * @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered metadata are cached
+ * @param string $phpArrayFile The PHP file where metadata are cached
*/
- public function __construct($phpArrayFile, CacheItemPoolInterface $fallbackPool)
+ public function __construct(string $phpArrayFile)
{
$this->phpArrayFile = $phpArrayFile;
- if (!$fallbackPool instanceof AdapterInterface) {
- $fallbackPool = new ProxyAdapter($fallbackPool);
- }
- $this->fallbackPool = $fallbackPool;
}
/**
@@ -47,15 +39,17 @@ abstract class AbstractPhpFileCacheWarmer implements CacheWarmerInterface
/**
* {@inheritdoc}
+ *
+ * @return string[] A list of classes to preload on PHP 7.4+
*/
- public function warmUp($cacheDir)
+ public function warmUp(string $cacheDir)
{
$arrayAdapter = new ArrayAdapter();
spl_autoload_register([ClassExistenceResource::class, 'throwOnRequiredClass']);
try {
if (!$this->doWarmUp($cacheDir, $arrayAdapter)) {
- return;
+ return [];
}
} finally {
spl_autoload_unregister([ClassExistenceResource::class, 'throwOnRequiredClass']);
@@ -66,24 +60,21 @@ abstract class AbstractPhpFileCacheWarmer implements CacheWarmerInterface
// so here we un-serialize the values first
$values = array_map(function ($val) { return null !== $val ? unserialize($val) : null; }, $arrayAdapter->getValues());
- $this->warmUpPhpArrayAdapter(new PhpArrayAdapter($this->phpArrayFile, $this->fallbackPool), $values);
-
- foreach ($values as $k => $v) {
- $item = $this->fallbackPool->getItem($k);
- $this->fallbackPool->saveDeferred($item->set($v));
- }
- $this->fallbackPool->commit();
+ return $this->warmUpPhpArrayAdapter(new PhpArrayAdapter($this->phpArrayFile, new NullAdapter()), $values);
}
+ /**
+ * @return string[] A list of classes to preload on PHP 7.4+
+ */
protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values)
{
- $phpArrayAdapter->warmUp($values);
+ return (array) $phpArrayAdapter->warmUp($values);
}
/**
* @internal
*/
- final protected function ignoreAutoloadException($class, \Exception $exception)
+ final protected function ignoreAutoloadException(string $class, \Exception $exception): void
{
try {
ClassExistenceResource::throwOnRequiredClass($class, $exception);
@@ -92,9 +83,7 @@ abstract class AbstractPhpFileCacheWarmer implements CacheWarmerInterface
}
/**
- * @param string $cacheDir
- *
* @return bool false if there is nothing to warm-up
*/
- abstract protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter);
+ abstract protected function doWarmUp(string $cacheDir, ArrayAdapter $arrayAdapter);
}
diff --git a/lib/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php
index 3859e07f4..550440017 100644
--- a/lib/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php
+++ b/lib/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php
@@ -12,11 +12,10 @@
namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
use Doctrine\Common\Annotations\AnnotationException;
-use Doctrine\Common\Annotations\CachedReader;
+use Doctrine\Common\Annotations\PsrCachedReader;
use Doctrine\Common\Annotations\Reader;
-use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
-use Symfony\Component\Cache\DoctrineProvider;
+use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
/**
* Warms up annotation caches for classes found in composer's autoload class map
@@ -31,13 +30,11 @@ class AnnotationsCacheWarmer extends AbstractPhpFileCacheWarmer
private $debug;
/**
- * @param string $phpArrayFile The PHP file where annotations are cached
- * @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered annotations are cached
- * @param bool $debug Run in debug mode
+ * @param string $phpArrayFile The PHP file where annotations are cached
*/
- public function __construct(Reader $annotationReader, $phpArrayFile, CacheItemPoolInterface $fallbackPool, $excludeRegexp = null, $debug = false)
+ public function __construct(Reader $annotationReader, string $phpArrayFile, string $excludeRegexp = null, bool $debug = false)
{
- parent::__construct($phpArrayFile, $fallbackPool);
+ parent::__construct($phpArrayFile);
$this->annotationReader = $annotationReader;
$this->excludeRegexp = $excludeRegexp;
$this->debug = $debug;
@@ -46,7 +43,7 @@ class AnnotationsCacheWarmer extends AbstractPhpFileCacheWarmer
/**
* {@inheritdoc}
*/
- protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter)
+ protected function doWarmUp(string $cacheDir, ArrayAdapter $arrayAdapter)
{
$annotatedClassPatterns = $cacheDir.'/annotations.map';
@@ -55,7 +52,7 @@ class AnnotationsCacheWarmer extends AbstractPhpFileCacheWarmer
}
$annotatedClasses = include $annotatedClassPatterns;
- $reader = new CachedReader($this->annotationReader, new DoctrineProvider($arrayAdapter), $this->debug);
+ $reader = new PsrCachedReader($this->annotationReader, $arrayAdapter, $this->debug);
foreach ($annotatedClasses as $class) {
if (null !== $this->excludeRegexp && preg_match($this->excludeRegexp, $class)) {
@@ -71,7 +68,18 @@ class AnnotationsCacheWarmer extends AbstractPhpFileCacheWarmer
return true;
}
- private function readAllComponents(Reader $reader, $class)
+ /**
+ * @return string[] A list of classes to preload on PHP 7.4+
+ */
+ protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values)
+ {
+ // make sure we don't cache null values
+ $values = array_filter($values, function ($val) { return null !== $val; });
+
+ return parent::warmUpPhpArrayAdapter($phpArrayAdapter, $values);
+ }
+
+ private function readAllComponents(Reader $reader, string $class)
{
$reflectionClass = new \ReflectionClass($class);
diff --git a/lib/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php
new file mode 100644
index 000000000..79bca2403
--- /dev/null
+++ b/lib/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php
@@ -0,0 +1,64 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
+
+/**
+ * Clears the cache pools when warming up the cache.
+ *
+ * Do not use in production!
+ *
+ * @author Teoh Han Hui
+ *
+ * @internal
+ */
+final class CachePoolClearerCacheWarmer implements CacheWarmerInterface
+{
+ private $poolClearer;
+ private $pools;
+
+ /**
+ * @param string[] $pools
+ */
+ public function __construct(Psr6CacheClearer $poolClearer, array $pools = [])
+ {
+ $this->poolClearer = $poolClearer;
+ $this->pools = $pools;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return string[]
+ */
+ public function warmUp(string $cacheDirectory): array
+ {
+ foreach ($this->pools as $pool) {
+ if ($this->poolClearer->hasPool($pool)) {
+ $this->poolClearer->clearPool($pool);
+ }
+ }
+
+ return [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isOptional(): bool
+ {
+ // optional cache warmers are not run when handling the request
+ return false;
+ }
+}
diff --git a/lib/symfony/framework-bundle/CacheWarmer/ClassCacheCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/ClassCacheCacheWarmer.php
deleted file mode 100644
index 4a6bee412..000000000
--- a/lib/symfony/framework-bundle/CacheWarmer/ClassCacheCacheWarmer.php
+++ /dev/null
@@ -1,67 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
-
-use Symfony\Component\ClassLoader\ClassCollectionLoader;
-use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
-
-/**
- * Generates the Class Cache (classes.php) file.
- *
- * @author Tugdual Saunier
- *
- * @deprecated since version 3.3, to be removed in 4.0.
- */
-class ClassCacheCacheWarmer implements CacheWarmerInterface
-{
- private $declaredClasses;
-
- public function __construct(array $declaredClasses = null)
- {
- if (\PHP_VERSION_ID >= 70000) {
- @trigger_error('The '.__CLASS__.' class is deprecated since Symfony 3.3 and will be removed in 4.0.', \E_USER_DEPRECATED);
- }
-
- $this->declaredClasses = $declaredClasses;
- }
-
- /**
- * Warms up the cache.
- *
- * @param string $cacheDir The cache directory
- */
- public function warmUp($cacheDir)
- {
- $classmap = $cacheDir.'/classes.map';
-
- if (!is_file($classmap)) {
- return;
- }
-
- if (file_exists($cacheDir.'/classes.php')) {
- return;
- }
- $declared = null !== $this->declaredClasses ? $this->declaredClasses : array_merge(get_declared_classes(), get_declared_interfaces(), get_declared_traits());
-
- ClassCollectionLoader::inline(include($classmap), $cacheDir.'/classes.php', $declared);
- }
-
- /**
- * Checks whether this warmer is optional or not.
- *
- * @return bool always true
- */
- public function isOptional()
- {
- return true;
- }
-}
diff --git a/lib/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php
new file mode 100644
index 000000000..ed20bbcb6
--- /dev/null
+++ b/lib/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php
@@ -0,0 +1,91 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Config\Builder\ConfigBuilderGenerator;
+use Symfony\Component\Config\Builder\ConfigBuilderGeneratorInterface;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * Generate all config builders.
+ *
+ * @author Tobias Nyholm
+ */
+class ConfigBuilderCacheWarmer implements CacheWarmerInterface
+{
+ private $kernel;
+ private $logger;
+
+ public function __construct(KernelInterface $kernel, LoggerInterface $logger = null)
+ {
+ $this->kernel = $kernel;
+ $this->logger = $logger;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return string[]
+ */
+ public function warmUp(string $cacheDir)
+ {
+ $generator = new ConfigBuilderGenerator($cacheDir);
+
+ foreach ($this->kernel->getBundles() as $bundle) {
+ $extension = $bundle->getContainerExtension();
+ if (null === $extension) {
+ continue;
+ }
+
+ try {
+ $this->dumpExtension($extension, $generator);
+ } catch (\Exception $e) {
+ if ($this->logger) {
+ $this->logger->warning('Failed to generate ConfigBuilder for extension {extensionClass}.', ['exception' => $e, 'extensionClass' => \get_class($extension)]);
+ }
+ }
+ }
+
+ // No need to preload anything
+ return [];
+ }
+
+ private function dumpExtension(ExtensionInterface $extension, ConfigBuilderGeneratorInterface $generator): void
+ {
+ $configuration = null;
+ if ($extension instanceof ConfigurationInterface) {
+ $configuration = $extension;
+ } elseif ($extension instanceof ConfigurationExtensionInterface) {
+ $configuration = $extension->getConfiguration([], new ContainerBuilder($this->kernel->getContainer()->getParameterBag()));
+ }
+
+ if (!$configuration) {
+ return;
+ }
+
+ $generator->build($configuration);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isOptional()
+ {
+ return true;
+ }
+}
diff --git a/lib/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php
index 5106f0c2e..6cdf176bb 100644
--- a/lib/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php
+++ b/lib/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php
@@ -12,56 +12,46 @@
namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
use Psr\Container\ContainerInterface;
-use Symfony\Component\DependencyInjection\ServiceSubscriberInterface;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
use Symfony\Component\Routing\RouterInterface;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
/**
* Generates the router matcher and generator classes.
*
* @author Fabien Potencier
*
- * @final since version 3.4
+ * @final
*/
class RouterCacheWarmer implements CacheWarmerInterface, ServiceSubscriberInterface
{
- protected $router;
+ private $container;
- /**
- * @param ContainerInterface $container
- */
- public function __construct($container)
+ public function __construct(ContainerInterface $container)
{
// As this cache warmer is optional, dependencies should be lazy-loaded, that's why a container should be injected.
- if ($container instanceof ContainerInterface) {
- $this->router = $container->get('router'); // For BC, the $router property must be populated in the constructor
- } elseif ($container instanceof RouterInterface) {
- $this->router = $container;
- @trigger_error(sprintf('Using a "%s" as first argument of %s is deprecated since Symfony 3.4 and will be unsupported in version 4.0. Use a %s instead.', RouterInterface::class, __CLASS__, ContainerInterface::class), \E_USER_DEPRECATED);
- } else {
- throw new \InvalidArgumentException(sprintf('"%s" only accepts instance of Psr\Container\ContainerInterface as first argument.', __CLASS__));
- }
+ $this->container = $container;
}
/**
- * Warms up the cache.
- *
- * @param string $cacheDir The cache directory
+ * {@inheritdoc}
*/
- public function warmUp($cacheDir)
+ public function warmUp(string $cacheDir): array
{
- if ($this->router instanceof WarmableInterface) {
- $this->router->warmUp($cacheDir);
+ $router = $this->container->get('router');
+
+ if ($router instanceof WarmableInterface) {
+ return (array) $router->warmUp($cacheDir);
}
+
+ throw new \LogicException(sprintf('The router "%s" cannot be warmed up because it does not implement "%s".', get_debug_type($router), WarmableInterface::class));
}
/**
- * Checks whether this warmer is optional or not.
- *
- * @return bool always true
+ * {@inheritdoc}
*/
- public function isOptional()
+ public function isOptional(): bool
{
return true;
}
@@ -69,7 +59,7 @@ class RouterCacheWarmer implements CacheWarmerInterface, ServiceSubscriberInterf
/**
* {@inheritdoc}
*/
- public static function getSubscribedServices()
+ public static function getSubscribedServices(): array
{
return [
'router' => RouterInterface::class,
diff --git a/lib/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php
index e74206c86..0ada0ffc9 100644
--- a/lib/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php
+++ b/lib/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php
@@ -12,7 +12,6 @@
namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
use Doctrine\Common\Annotations\AnnotationException;
-use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
@@ -31,20 +30,19 @@ class SerializerCacheWarmer extends AbstractPhpFileCacheWarmer
private $loaders;
/**
- * @param LoaderInterface[] $loaders The serializer metadata loaders
- * @param string $phpArrayFile The PHP file where metadata are cached
- * @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered metadata are cached
+ * @param LoaderInterface[] $loaders The serializer metadata loaders
+ * @param string $phpArrayFile The PHP file where metadata are cached
*/
- public function __construct(array $loaders, $phpArrayFile, CacheItemPoolInterface $fallbackPool)
+ public function __construct(array $loaders, string $phpArrayFile)
{
- parent::__construct($phpArrayFile, $fallbackPool);
+ parent::__construct($phpArrayFile);
$this->loaders = $loaders;
}
/**
* {@inheritdoc}
*/
- protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter)
+ protected function doWarmUp(string $cacheDir, ArrayAdapter $arrayAdapter)
{
if (!class_exists(CacheClassMetadataFactory::class) || !method_exists(XmlFileLoader::class, 'getMappedClasses') || !method_exists(YamlFileLoader::class, 'getMappedClasses')) {
return false;
@@ -72,7 +70,7 @@ class SerializerCacheWarmer extends AbstractPhpFileCacheWarmer
*
* @return XmlFileLoader[]|YamlFileLoader[]
*/
- private function extractSupportedLoaders(array $loaders)
+ private function extractSupportedLoaders(array $loaders): array
{
$supportedLoaders = [];
diff --git a/lib/symfony/framework-bundle/CacheWarmer/TemplateFinder.php b/lib/symfony/framework-bundle/CacheWarmer/TemplateFinder.php
deleted file mode 100644
index e3eea295e..000000000
--- a/lib/symfony/framework-bundle/CacheWarmer/TemplateFinder.php
+++ /dev/null
@@ -1,111 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
-
-use Symfony\Component\Finder\Finder;
-use Symfony\Component\HttpKernel\Bundle\BundleInterface;
-use Symfony\Component\HttpKernel\KernelInterface;
-use Symfony\Component\Templating\TemplateNameParserInterface;
-use Symfony\Component\Templating\TemplateReferenceInterface;
-
-/**
- * Finds all the templates.
- *
- * @author Victor Berchet
- */
-class TemplateFinder implements TemplateFinderInterface
-{
- private $kernel;
- private $parser;
- private $rootDir;
- private $templates;
-
- /**
- * @param KernelInterface $kernel A KernelInterface instance
- * @param TemplateNameParserInterface $parser A TemplateNameParserInterface instance
- * @param string $rootDir The directory where global templates can be stored
- */
- public function __construct(KernelInterface $kernel, TemplateNameParserInterface $parser, $rootDir)
- {
- $this->kernel = $kernel;
- $this->parser = $parser;
- $this->rootDir = $rootDir;
- }
-
- /**
- * Find all the templates in the bundle and in the kernel Resources folder.
- *
- * @return TemplateReferenceInterface[]
- */
- public function findAllTemplates()
- {
- if (null !== $this->templates) {
- return $this->templates;
- }
-
- $templates = [];
-
- foreach ($this->kernel->getBundles() as $bundle) {
- $templates = array_merge($templates, $this->findTemplatesInBundle($bundle));
- }
-
- $templates = array_merge($templates, $this->findTemplatesInFolder($this->rootDir.'/views'));
-
- return $this->templates = $templates;
- }
-
- /**
- * Find templates in the given directory.
- *
- * @param string $dir The folder where to look for templates
- *
- * @return TemplateReferenceInterface[]
- */
- private function findTemplatesInFolder($dir)
- {
- $templates = [];
-
- if (is_dir($dir)) {
- $finder = new Finder();
- foreach ($finder->files()->followLinks()->in($dir) as $file) {
- $template = $this->parser->parse($file->getRelativePathname());
- if (false !== $template) {
- $templates[] = $template;
- }
- }
- }
-
- return $templates;
- }
-
- /**
- * Find templates in the given bundle.
- *
- * @param BundleInterface $bundle The bundle where to look for templates
- *
- * @return TemplateReferenceInterface[]
- */
- private function findTemplatesInBundle(BundleInterface $bundle)
- {
- $name = $bundle->getName();
- $templates = array_unique(array_merge(
- $this->findTemplatesInFolder($bundle->getPath().'/Resources/views'),
- $this->findTemplatesInFolder($this->rootDir.'/'.$name.'/views')
- ));
-
- foreach ($templates as $i => $template) {
- $templates[$i] = $template->set('bundle', $name);
- }
-
- return $templates;
- }
-}
diff --git a/lib/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php b/lib/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php
deleted file mode 100644
index 433ed8f54..000000000
--- a/lib/symfony/framework-bundle/CacheWarmer/TemplateFinderInterface.php
+++ /dev/null
@@ -1,27 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
-
-/**
- * Interface for finding all the templates.
- *
- * @author Victor Berchet
- */
-interface TemplateFinderInterface
-{
- /**
- * Find all the templates.
- *
- * @return array An array of templates of type TemplateReferenceInterface
- */
- public function findAllTemplates();
-}
diff --git a/lib/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php
deleted file mode 100644
index 6662a1808..000000000
--- a/lib/symfony/framework-bundle/CacheWarmer/TemplatePathsCacheWarmer.php
+++ /dev/null
@@ -1,62 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
-
-use Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator;
-use Symfony\Component\Filesystem\Filesystem;
-use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;
-
-/**
- * Computes the association between template names and their paths on the disk.
- *
- * @author Fabien Potencier
- */
-class TemplatePathsCacheWarmer extends CacheWarmer
-{
- protected $finder;
- protected $locator;
-
- public function __construct(TemplateFinderInterface $finder, TemplateLocator $locator)
- {
- $this->finder = $finder;
- $this->locator = $locator;
- }
-
- /**
- * Warms up the cache.
- *
- * @param string $cacheDir The cache directory
- */
- public function warmUp($cacheDir)
- {
- $filesystem = new Filesystem();
- $templates = [];
-
- foreach ($this->finder->findAllTemplates() as $template) {
- $templates[$template->getLogicalName()] = rtrim($filesystem->makePathRelative($this->locator->locate($template), $cacheDir), '/');
- }
-
- $templates = str_replace("' => '", "' => __DIR__.'/", var_export($templates, true));
-
- $this->writeCacheFile($cacheDir.'/templates.php', sprintf("container = $container;
- } elseif ($container instanceof TranslatorInterface) {
- $this->translator = $container;
- @trigger_error(sprintf('Using a "%s" as first argument of %s is deprecated since Symfony 3.4 and will be unsupported in version 4.0. Use a %s instead.', TranslatorInterface::class, __CLASS__, ContainerInterface::class), \E_USER_DEPRECATED);
- } else {
- throw new \InvalidArgumentException(sprintf('"%s" only accepts instance of Psr\Container\ContainerInterface as first argument.', __CLASS__));
- }
+ $this->container = $container;
}
/**
* {@inheritdoc}
+ *
+ * @return string[]
*/
- public function warmUp($cacheDir)
+ public function warmUp(string $cacheDir)
{
if (null === $this->translator) {
$this->translator = $this->container->get('translator');
}
if ($this->translator instanceof WarmableInterface) {
- $this->translator->warmUp($cacheDir);
+ return (array) $this->translator->warmUp($cacheDir);
}
+
+ return [];
}
/**
diff --git a/lib/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php b/lib/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php
index 93c9eda6f..3c6d582c4 100644
--- a/lib/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php
+++ b/lib/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php
@@ -12,16 +12,14 @@
namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
use Doctrine\Common\Annotations\AnnotationException;
-use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
-use Symfony\Component\Validator\Mapping\Cache\Psr6Cache;
use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory;
use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
-use Symfony\Component\Validator\ValidatorBuilderInterface;
+use Symfony\Component\Validator\ValidatorBuilder;
/**
* Warms up XML and YAML validator metadata.
@@ -33,26 +31,25 @@ class ValidatorCacheWarmer extends AbstractPhpFileCacheWarmer
private $validatorBuilder;
/**
- * @param string $phpArrayFile The PHP file where metadata are cached
- * @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered metadata are cached
+ * @param string $phpArrayFile The PHP file where metadata are cached
*/
- public function __construct(ValidatorBuilderInterface $validatorBuilder, $phpArrayFile, CacheItemPoolInterface $fallbackPool)
+ public function __construct(ValidatorBuilder $validatorBuilder, string $phpArrayFile)
{
- parent::__construct($phpArrayFile, $fallbackPool);
+ parent::__construct($phpArrayFile);
$this->validatorBuilder = $validatorBuilder;
}
/**
* {@inheritdoc}
*/
- protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter)
+ protected function doWarmUp(string $cacheDir, ArrayAdapter $arrayAdapter)
{
if (!method_exists($this->validatorBuilder, 'getLoaders')) {
return false;
}
$loaders = $this->validatorBuilder->getLoaders();
- $metadataFactory = new LazyLoadingMetadataFactory(new LoaderChain($loaders), new Psr6Cache($arrayAdapter));
+ $metadataFactory = new LazyLoadingMetadataFactory(new LoaderChain($loaders), $arrayAdapter);
foreach ($this->extractSupportedLoaders($loaders) as $loader) {
foreach ($loader->getMappedClasses() as $mappedClass) {
@@ -71,10 +68,15 @@ class ValidatorCacheWarmer extends AbstractPhpFileCacheWarmer
return true;
}
+ /**
+ * @return string[] A list of classes to preload on PHP 7.4+
+ */
protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values)
{
// make sure we don't cache null values
- parent::warmUpPhpArrayAdapter($phpArrayAdapter, array_filter($values));
+ $values = array_filter($values, function ($val) { return null !== $val; });
+
+ return parent::warmUpPhpArrayAdapter($phpArrayAdapter, $values);
}
/**
@@ -82,7 +84,7 @@ class ValidatorCacheWarmer extends AbstractPhpFileCacheWarmer
*
* @return XmlFileLoader[]|YamlFileLoader[]
*/
- private function extractSupportedLoaders(array $loaders)
+ private function extractSupportedLoaders(array $loaders): array
{
$supportedLoaders = [];
diff --git a/lib/symfony/framework-bundle/Command/AboutCommand.php b/lib/symfony/framework-bundle/Command/AboutCommand.php
index 7d4206a18..05e7c3c67 100644
--- a/lib/symfony/framework-bundle/Command/AboutCommand.php
+++ b/lib/symfony/framework-bundle/Command/AboutCommand.php
@@ -11,6 +11,7 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
+use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Helper\TableSeparator;
use Symfony\Component\Console\Input\InputInterface;
@@ -24,11 +25,12 @@ use Symfony\Component\HttpKernel\KernelInterface;
*
* @author Roland Franssen
*
- * @final since version 3.4
+ * @final
*/
-class AboutCommand extends ContainerAwareCommand
+class AboutCommand extends Command
{
protected static $defaultName = 'about';
+ protected static $defaultDescription = 'Display information about the current project';
/**
* {@inheritdoc}
@@ -36,15 +38,12 @@ class AboutCommand extends ContainerAwareCommand
protected function configure()
{
$this
- ->setDescription('Displays information about the current project')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOT'
The %command.name% command displays information about the current Symfony project.
The PHP section displays important configuration that could affect your application. The values might
be different between web and CLI.
-
-The Environment section displays the current environment variables managed by Symfony Dotenv. It will not
-be shown if no variables were found. The values might be different between web and CLI.
EOT
)
;
@@ -53,90 +52,85 @@ EOT
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
- /** @var $kernel KernelInterface */
+ /** @var KernelInterface $kernel */
$kernel = $this->getApplication()->getKernel();
+ if (method_exists($kernel, 'getBuildDir')) {
+ $buildDir = $kernel->getBuildDir();
+ } else {
+ $buildDir = $kernel->getCacheDir();
+ }
+
$rows = [
['Symfony>'],
new TableSeparator(),
['Version', Kernel::VERSION],
- ['End of maintenance', Kernel::END_OF_MAINTENANCE.(self::isExpired(Kernel::END_OF_MAINTENANCE) ? ' Expired>' : '')],
- ['End of life', Kernel::END_OF_LIFE.(self::isExpired(Kernel::END_OF_LIFE) ? ' Expired>' : '')],
+ ['Long-Term Support', 4 === Kernel::MINOR_VERSION ? 'Yes' : 'No'],
+ ['End of maintenance', Kernel::END_OF_MAINTENANCE.(self::isExpired(Kernel::END_OF_MAINTENANCE) ? ' Expired>' : ' ('.self::daysBeforeExpiration(Kernel::END_OF_MAINTENANCE).'>)')],
+ ['End of life', Kernel::END_OF_LIFE.(self::isExpired(Kernel::END_OF_LIFE) ? ' Expired>' : ' ('.self::daysBeforeExpiration(Kernel::END_OF_LIFE).'>)')],
new TableSeparator(),
['Kernel>'],
new TableSeparator(),
['Type', \get_class($kernel)],
- ['Name', $kernel->getName()],
['Environment', $kernel->getEnvironment()],
['Debug', $kernel->isDebug() ? 'true' : 'false'],
['Charset', $kernel->getCharset()],
- ['Root directory', self::formatPath($kernel->getRootDir(), $kernel->getProjectDir())],
['Cache directory', self::formatPath($kernel->getCacheDir(), $kernel->getProjectDir()).' ('.self::formatFileSize($kernel->getCacheDir()).'>)'],
+ ['Build directory', self::formatPath($buildDir, $kernel->getProjectDir()).' ('.self::formatFileSize($buildDir).'>)'],
['Log directory', self::formatPath($kernel->getLogDir(), $kernel->getProjectDir()).' ('.self::formatFileSize($kernel->getLogDir()).'>)'],
new TableSeparator(),
['PHP>'],
new TableSeparator(),
['Version', \PHP_VERSION],
['Architecture', (\PHP_INT_SIZE * 8).' bits'],
- ['Intl locale', class_exists('Locale', false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a'],
+ ['Intl locale', class_exists(\Locale::class, false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a'],
['Timezone', date_default_timezone_get().' ('.(new \DateTime())->format(\DateTime::W3C).'>)'],
['OPcache', \extension_loaded('Zend OPcache') && filter_var(ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false'],
['APCu', \extension_loaded('apcu') && filter_var(ini_get('apc.enabled'), \FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false'],
['Xdebug', \extension_loaded('xdebug') ? 'true' : 'false'],
];
- if ($dotenv = self::getDotenvVars()) {
- $rows = array_merge($rows, [
- new TableSeparator(),
- ['Environment (.env)>'],
- new TableSeparator(),
- ], array_map(function ($value, $name) {
- return [$name, $value];
- }, $dotenv, array_keys($dotenv)));
- }
-
$io->table([], $rows);
+
+ return 0;
}
- private static function formatPath($path, $baseDir = null)
+ private static function formatPath(string $path, string $baseDir): string
{
- return null !== $baseDir ? preg_replace('~^'.preg_quote($baseDir, '~').'~', '.', $path) : $path;
+ return preg_replace('~^'.preg_quote($baseDir, '~').'~', '.', $path);
}
- private static function formatFileSize($path)
+ private static function formatFileSize(string $path): string
{
if (is_file($path)) {
$size = filesize($path) ?: 0;
} else {
$size = 0;
foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS | \RecursiveDirectoryIterator::FOLLOW_SYMLINKS)) as $file) {
- $size += $file->getSize();
+ if ($file->isReadable()) {
+ $size += $file->getSize();
+ }
}
}
return Helper::formatMemory($size);
}
- private static function isExpired($date)
+ private static function isExpired(string $date): bool
{
$date = \DateTime::createFromFormat('d/m/Y', '01/'.$date);
return false !== $date && new \DateTime() > $date->modify('last day of this month 23:59:59');
}
- private static function getDotenvVars()
+ private static function daysBeforeExpiration(string $date): string
{
- $vars = [];
- foreach (explode(',', getenv('SYMFONY_DOTENV_VARS')) as $name) {
- if ('' !== $name && false !== $value = getenv($name)) {
- $vars[$name] = $value;
- }
- }
+ $date = \DateTime::createFromFormat('d/m/Y', '01/'.$date);
- return $vars;
+ return (new \DateTime())->diff($date->modify('last day of this month 23:59:59'))->format('in %R%a days');
}
}
diff --git a/lib/symfony/framework-bundle/Command/AbstractConfigCommand.php b/lib/symfony/framework-bundle/Command/AbstractConfigCommand.php
index 3e5b4698c..f0d5a9814 100644
--- a/lib/symfony/framework-bundle/Command/AbstractConfigCommand.php
+++ b/lib/symfony/framework-bundle/Command/AbstractConfigCommand.php
@@ -16,6 +16,7 @@ use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\StyleInterface;
+use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
/**
@@ -59,11 +60,27 @@ abstract class AbstractConfigCommand extends ContainerDebugCommand
/**
* @return ExtensionInterface
*/
- protected function findExtension($name)
+ protected function findExtension(string $name)
{
$bundles = $this->initializeBundles();
$minScore = \INF;
+ $kernel = $this->getApplication()->getKernel();
+ if ($kernel instanceof ExtensionInterface && ($kernel instanceof ConfigurationInterface || $kernel instanceof ConfigurationExtensionInterface)) {
+ if ($name === $kernel->getAlias()) {
+ return $kernel;
+ }
+
+ if ($kernel->getAlias()) {
+ $distance = levenshtein($name, $kernel->getAlias());
+
+ if ($distance < $minScore) {
+ $guess = $kernel->getAlias();
+ $minScore = $distance;
+ }
+ }
+ }
+
foreach ($bundles as $bundle) {
if ($name === $bundle->getName()) {
if (!$bundle->getContainerExtension()) {
@@ -79,24 +96,24 @@ abstract class AbstractConfigCommand extends ContainerDebugCommand
$guess = $bundle->getName();
$minScore = $distance;
}
+ }
- $extension = $bundle->getContainerExtension();
+ $container = $this->getContainerBuilder($kernel);
- if ($extension) {
- if ($name === $extension->getAlias()) {
- return $extension;
- }
+ if ($container->hasExtension($name)) {
+ return $container->getExtension($name);
+ }
- $distance = levenshtein($name, $extension->getAlias());
+ foreach ($container->getExtensions() as $extension) {
+ $distance = levenshtein($name, $extension->getAlias());
- if ($distance < $minScore) {
- $guess = $extension->getAlias();
- $minScore = $distance;
- }
+ if ($distance < $minScore) {
+ $guess = $extension->getAlias();
+ $minScore = $distance;
}
}
- if ('Bundle' !== substr($name, -6)) {
+ if (!str_ends_with($name, 'Bundle')) {
$message = sprintf('No extensions with configuration available for "%s".', $name);
} else {
$message = sprintf('No extension with alias "%s" is enabled.', $name);
@@ -116,7 +133,7 @@ abstract class AbstractConfigCommand extends ContainerDebugCommand
}
if (!$configuration instanceof ConfigurationInterface) {
- throw new \LogicException(sprintf('Configuration class "%s" should implement ConfigurationInterface in order to be dumpable.', \get_class($configuration)));
+ throw new \LogicException(sprintf('Configuration class "%s" should implement ConfigurationInterface in order to be dumpable.', get_debug_type($configuration)));
}
}
@@ -124,8 +141,9 @@ abstract class AbstractConfigCommand extends ContainerDebugCommand
{
// Re-build bundle manually to initialize DI extensions that can be extended by other bundles in their build() method
// as this method is not called when the container is loaded from the cache.
- $container = $this->getContainerBuilder();
- $bundles = $this->getApplication()->getKernel()->getBundles();
+ $kernel = $this->getApplication()->getKernel();
+ $container = $this->getContainerBuilder($kernel);
+ $bundles = $kernel->getBundles();
foreach ($bundles as $bundle) {
if ($extension = $bundle->getContainerExtension()) {
$container->registerExtension($extension);
diff --git a/lib/symfony/framework-bundle/Command/AssetsInstallCommand.php b/lib/symfony/framework-bundle/Command/AssetsInstallCommand.php
index 394fedadf..870e686de 100644
--- a/lib/symfony/framework-bundle/Command/AssetsInstallCommand.php
+++ b/lib/symfony/framework-bundle/Command/AssetsInstallCommand.php
@@ -11,6 +11,7 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
+use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@@ -22,6 +23,7 @@ use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
/**
* Command that places bundle web assets into a given directory.
@@ -29,34 +31,26 @@ use Symfony\Component\HttpKernel\Bundle\BundleInterface;
* @author Fabien Potencier
* @author GƔbor Egyed
*
- * @final since version 3.4
+ * @final
*/
-class AssetsInstallCommand extends ContainerAwareCommand
+class AssetsInstallCommand extends Command
{
- const METHOD_COPY = 'copy';
- const METHOD_ABSOLUTE_SYMLINK = 'absolute symlink';
- const METHOD_RELATIVE_SYMLINK = 'relative symlink';
+ public const METHOD_COPY = 'copy';
+ public const METHOD_ABSOLUTE_SYMLINK = 'absolute symlink';
+ public const METHOD_RELATIVE_SYMLINK = 'relative symlink';
protected static $defaultName = 'assets:install';
+ protected static $defaultDescription = 'Install bundle\'s web assets under a public directory';
private $filesystem;
+ private $projectDir;
- /**
- * @param Filesystem $filesystem
- */
- public function __construct($filesystem = null)
+ public function __construct(Filesystem $filesystem, string $projectDir)
{
- if (!$filesystem instanceof Filesystem) {
- @trigger_error(sprintf('%s() expects an instance of "%s" as first argument since Symfony 3.4. Not passing it is deprecated and will throw a TypeError in 4.0.', __METHOD__, Filesystem::class), \E_USER_DEPRECATED);
-
- parent::__construct($filesystem);
-
- return;
- }
-
parent::__construct();
$this->filesystem = $filesystem;
+ $this->projectDir = $projectDir;
}
/**
@@ -68,9 +62,10 @@ class AssetsInstallCommand extends ContainerAwareCommand
->setDefinition([
new InputArgument('target', InputArgument::OPTIONAL, 'The target directory', null),
])
- ->addOption('symlink', null, InputOption::VALUE_NONE, 'Symlinks the assets instead of copying it')
+ ->addOption('symlink', null, InputOption::VALUE_NONE, 'Symlink the assets instead of copying them')
->addOption('relative', null, InputOption::VALUE_NONE, 'Make relative symlinks')
- ->setDescription('Installs bundles web assets under a public directory')
+ ->addOption('no-cleanup', null, InputOption::VALUE_NONE, 'Do not remove the assets of the bundles that no longer exist')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOT'
The %command.name% command installs bundle assets into a given
directory (e.g. the public directory).
@@ -97,32 +92,20 @@ EOT
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
- // BC to be removed in 4.0
- if (null === $this->filesystem) {
- $this->filesystem = $this->getContainer()->get('filesystem');
- $baseDir = $this->getContainer()->getParameter('kernel.project_dir');
- }
-
+ /** @var KernelInterface $kernel */
$kernel = $this->getApplication()->getKernel();
- $targetArg = rtrim($input->getArgument('target'), '/');
-
+ $targetArg = rtrim($input->getArgument('target') ?? '', '/');
if (!$targetArg) {
- $targetArg = $this->getPublicDirectory($this->getContainer());
+ $targetArg = $this->getPublicDirectory($kernel->getContainer());
}
if (!is_dir($targetArg)) {
- $targetArg = (isset($baseDir) ? $baseDir : $kernel->getContainer()->getParameter('kernel.project_dir')).'/'.$targetArg;
+ $targetArg = $kernel->getProjectDir().'/'.$targetArg;
if (!is_dir($targetArg)) {
- // deprecated, logic to be removed in 4.0
- // this allows the commands to work out of the box with web/ and public/
- if (is_dir(\dirname($targetArg).'/web')) {
- $targetArg = \dirname($targetArg).'/web';
- } else {
- throw new InvalidArgumentException(sprintf('The target directory "%s" does not exist.', $targetArg));
- }
+ throw new InvalidArgumentException(sprintf('The target directory "%s" does not exist.', $targetArg));
}
}
@@ -150,7 +133,7 @@ EOT
$validAssetDirs = [];
/** @var BundleInterface $bundle */
foreach ($kernel->getBundles() as $bundle) {
- if (!is_dir($originDir = $bundle->getPath().'/Resources/public')) {
+ if (!is_dir($originDir = $bundle->getPath().'/Resources/public') && !is_dir($originDir = $bundle->getPath().'/public')) {
continue;
}
@@ -190,7 +173,7 @@ EOT
}
}
// remove the assets of the bundles that no longer exist
- if (is_dir($bundlesDir)) {
+ if (!$input->getOption('no-cleanup') && is_dir($bundlesDir)) {
$dirsToRemove = Finder::create()->depth(0)->directories()->exclude($validAssetDirs)->in($bundlesDir);
$this->filesystem->remove($dirsToRemove);
}
@@ -215,13 +198,8 @@ EOT
* Try to create relative symlink.
*
* Falling back to absolute symlink and finally hard copy.
- *
- * @param string $originDir
- * @param string $targetDir
- *
- * @return string
*/
- private function relativeSymlinkWithFallback($originDir, $targetDir)
+ private function relativeSymlinkWithFallback(string $originDir, string $targetDir): string
{
try {
$this->symlink($originDir, $targetDir, true);
@@ -237,13 +215,8 @@ EOT
* Try to create absolute symlink.
*
* Falling back to hard copy.
- *
- * @param string $originDir
- * @param string $targetDir
- *
- * @return string
*/
- private function absoluteSymlinkWithFallback($originDir, $targetDir)
+ private function absoluteSymlinkWithFallback(string $originDir, string $targetDir): string
{
try {
$this->symlink($originDir, $targetDir);
@@ -259,13 +232,9 @@ EOT
/**
* Creates symbolic link.
*
- * @param string $originDir
- * @param string $targetDir
- * @param bool $relative
- *
- * @throws IOException if link can not be created
+ * @throws IOException if link cannot be created
*/
- private function symlink($originDir, $targetDir, $relative = false)
+ private function symlink(string $originDir, string $targetDir, bool $relative = false)
{
if ($relative) {
$this->filesystem->mkdir(\dirname($targetDir));
@@ -279,13 +248,8 @@ EOT
/**
* Copies origin to target.
- *
- * @param string $originDir
- * @param string $targetDir
- *
- * @return string
*/
- private function hardCopy($originDir, $targetDir)
+ private function hardCopy(string $originDir, string $targetDir): string
{
$this->filesystem->mkdir($targetDir, 0777);
// We use a custom iterator to ignore VCS files
@@ -294,15 +258,15 @@ EOT
return self::METHOD_COPY;
}
- private function getPublicDirectory(ContainerInterface $container)
+ private function getPublicDirectory(ContainerInterface $container): string
{
$defaultPublicDir = 'public';
- if (!$container->hasParameter('kernel.project_dir')) {
+ if (null === $this->projectDir && !$container->hasParameter('kernel.project_dir')) {
return $defaultPublicDir;
}
- $composerFilePath = $container->getParameter('kernel.project_dir').'/composer.json';
+ $composerFilePath = ($this->projectDir ?? $container->getParameter('kernel.project_dir')).'/composer.json';
if (!file_exists($composerFilePath)) {
return $defaultPublicDir;
@@ -310,10 +274,6 @@ EOT
$composerConfig = json_decode(file_get_contents($composerFilePath), true);
- if (isset($composerConfig['extra']['public-dir'])) {
- return $composerConfig['extra']['public-dir'];
- }
-
- return $defaultPublicDir;
+ return $composerConfig['extra']['public-dir'] ?? $defaultPublicDir;
}
}
diff --git a/lib/symfony/framework-bundle/Command/BuildDebugContainerTrait.php b/lib/symfony/framework-bundle/Command/BuildDebugContainerTrait.php
new file mode 100644
index 000000000..785027dbc
--- /dev/null
+++ b/lib/symfony/framework-bundle/Command/BuildDebugContainerTrait.php
@@ -0,0 +1,64 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * @internal
+ *
+ * @author Robin Chalas
+ * @author Nicolas Grekas
+ */
+trait BuildDebugContainerTrait
+{
+ protected $containerBuilder;
+
+ /**
+ * Loads the ContainerBuilder from the cache.
+ *
+ * @throws \LogicException
+ */
+ protected function getContainerBuilder(KernelInterface $kernel): ContainerBuilder
+ {
+ if ($this->containerBuilder) {
+ return $this->containerBuilder;
+ }
+
+ if (!$kernel->isDebug() || !(new ConfigCache($kernel->getContainer()->getParameter('debug.container.dump'), true))->isFresh()) {
+ $buildContainer = \Closure::bind(function () {
+ $this->initializeBundles();
+
+ return $this->buildContainer();
+ }, $kernel, \get_class($kernel));
+ $container = $buildContainer();
+ $container->getCompilerPassConfig()->setRemovingPasses([]);
+ $container->getCompilerPassConfig()->setAfterRemovingPasses([]);
+ $container->compile();
+ } else {
+ (new XmlFileLoader($container = new ContainerBuilder(), new FileLocator()))->load($kernel->getContainer()->getParameter('debug.container.dump'));
+ $locatorPass = new ServiceLocatorTagPass();
+ $locatorPass->process($container);
+
+ $container->getCompilerPassConfig()->setBeforeOptimizationPasses([]);
+ $container->getCompilerPassConfig()->setOptimizationPasses([]);
+ $container->getCompilerPassConfig()->setBeforeRemovingPasses([]);
+ }
+
+ return $this->containerBuilder = $container;
+ }
+}
diff --git a/lib/symfony/framework-bundle/Command/CacheClearCommand.php b/lib/symfony/framework-bundle/Command/CacheClearCommand.php
index aa8541ea1..b0d556539 100644
--- a/lib/symfony/framework-bundle/Command/CacheClearCommand.php
+++ b/lib/symfony/framework-bundle/Command/CacheClearCommand.php
@@ -11,17 +11,18 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
+use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Dumper\Preloader;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
-use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpKernel\RebootableInterface;
/**
@@ -30,33 +31,22 @@ use Symfony\Component\HttpKernel\RebootableInterface;
* @author Francis Besset
* @author Fabien Potencier
*
- * @final since version 3.4
+ * @final
*/
-class CacheClearCommand extends ContainerAwareCommand
+class CacheClearCommand extends Command
{
protected static $defaultName = 'cache:clear';
+ protected static $defaultDescription = 'Clear the cache';
private $cacheClearer;
private $filesystem;
- private $warning;
- /**
- * @param CacheClearerInterface $cacheClearer
- */
- public function __construct($cacheClearer = null, Filesystem $filesystem = null)
+ public function __construct(CacheClearerInterface $cacheClearer, Filesystem $filesystem = null)
{
- if (!$cacheClearer instanceof CacheClearerInterface) {
- @trigger_error(sprintf('%s() expects an instance of "%s" as first argument since Symfony 3.4. Not passing it is deprecated and will throw a TypeError in 4.0.', __METHOD__, CacheClearerInterface::class), \E_USER_DEPRECATED);
-
- parent::__construct($cacheClearer);
-
- return;
- }
-
parent::__construct();
$this->cacheClearer = $cacheClearer;
- $this->filesystem = $filesystem ?: new Filesystem();
+ $this->filesystem = $filesystem ?? new Filesystem();
}
/**
@@ -69,9 +59,9 @@ class CacheClearCommand extends ContainerAwareCommand
new InputOption('no-warmup', '', InputOption::VALUE_NONE, 'Do not warm up the cache'),
new InputOption('no-optional-warmers', '', InputOption::VALUE_NONE, 'Skip optional cache warmers (faster)'),
])
- ->setDescription('Clears the cache')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
-The %command.name% command clears the application cache for a given environment
+The %command.name% command clears and warms up the application cache for a given environment
and debug mode:
php %command.full_name% --env=dev
@@ -84,98 +74,122 @@ EOF
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
- // BC to be removed in 4.0
- if (null === $this->cacheClearer) {
- $this->cacheClearer = $this->getContainer()->get('cache_clearer');
- $this->filesystem = $this->getContainer()->get('filesystem');
- $realCacheDir = $this->getContainer()->getParameter('kernel.cache_dir');
- }
-
$fs = $this->filesystem;
$io = new SymfonyStyle($input, $output);
$kernel = $this->getApplication()->getKernel();
- $realCacheDir = isset($realCacheDir) ? $realCacheDir : $kernel->getContainer()->getParameter('kernel.cache_dir');
+ $realCacheDir = $kernel->getContainer()->getParameter('kernel.cache_dir');
+ $realBuildDir = $kernel->getContainer()->hasParameter('kernel.build_dir') ? $kernel->getContainer()->getParameter('kernel.build_dir') : $realCacheDir;
// the old cache dir name must not be longer than the real one to avoid exceeding
// the maximum length of a directory or file path within it (esp. Windows MAX_PATH)
- $oldCacheDir = substr($realCacheDir, 0, -1).('~' === substr($realCacheDir, -1) ? '+' : '~');
+ $oldCacheDir = substr($realCacheDir, 0, -1).(str_ends_with($realCacheDir, '~') ? '+' : '~');
$fs->remove($oldCacheDir);
if (!is_writable($realCacheDir)) {
throw new RuntimeException(sprintf('Unable to write in the "%s" directory.', $realCacheDir));
}
+ $useBuildDir = $realBuildDir !== $realCacheDir;
+ $oldBuildDir = substr($realBuildDir, 0, -1).('~' === substr($realBuildDir, -1) ? '+' : '~');
+ if ($useBuildDir) {
+ $fs->remove($oldBuildDir);
+
+ if (!is_writable($realBuildDir)) {
+ throw new RuntimeException(sprintf('Unable to write in the "%s" directory.', $realBuildDir));
+ }
+
+ if ($this->isNfs($realCacheDir)) {
+ $fs->remove($realCacheDir);
+ } else {
+ $fs->rename($realCacheDir, $oldCacheDir);
+ }
+ $fs->mkdir($realCacheDir);
+ }
+
$io->comment(sprintf('Clearing the cache for the %s environment with debug %s ', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
+ if ($useBuildDir) {
+ $this->cacheClearer->clear($realBuildDir);
+ }
$this->cacheClearer->clear($realCacheDir);
// The current event dispatcher is stale, let's not use it anymore
$this->getApplication()->setDispatcher(new EventDispatcher());
- $containerDir = new \ReflectionObject($kernel->getContainer());
- $containerDir = basename(\dirname($containerDir->getFileName()));
+ $containerFile = (new \ReflectionObject($kernel->getContainer()))->getFileName();
+ $containerDir = basename(\dirname($containerFile));
// the warmup cache dir name must have the same length as the real one
// to avoid the many problems in serialized resources files
- $warmupDir = substr($realCacheDir, 0, -1).('_' === substr($realCacheDir, -1) ? '-' : '_');
+ $warmupDir = substr($realBuildDir, 0, -1).('_' === substr($realBuildDir, -1) ? '-' : '_');
if ($output->isVerbose() && $fs->exists($warmupDir)) {
$io->comment('Clearing outdated warmup directory...');
}
$fs->remove($warmupDir);
- $fs->mkdir($warmupDir);
- if (!$input->getOption('no-warmup')) {
+ if ($_SERVER['REQUEST_TIME'] <= filemtime($containerFile) && filemtime($containerFile) <= time()) {
if ($output->isVerbose()) {
- $io->comment('Warming up cache...');
+ $io->comment('Cache is fresh.');
}
- $this->warmup($warmupDir, $realCacheDir, !$input->getOption('no-optional-warmers'));
-
- if ($this->warning) {
- @trigger_error($this->warning, \E_USER_DEPRECATED);
- $io->warning($this->warning);
- $this->warning = null;
- }
- }
-
- if (!$fs->exists($warmupDir.'/'.$containerDir)) {
- $fs->rename($realCacheDir.'/'.$containerDir, $warmupDir.'/'.$containerDir);
- touch($warmupDir.'/'.$containerDir.'.legacy');
- }
-
- if ('/' === \DIRECTORY_SEPARATOR && $mounts = @file('/proc/mounts')) {
- foreach ($mounts as $mount) {
- $mount = \array_slice(explode(' ', $mount), 1, -3);
- if (!\in_array(array_pop($mount), ['vboxsf', 'nfs'])) {
- continue;
+ if (!$input->getOption('no-warmup') && !$input->getOption('no-optional-warmers')) {
+ if ($output->isVerbose()) {
+ $io->comment('Warming up optional cache...');
}
- $mount = implode(' ', $mount).'/';
+ $warmer = $kernel->getContainer()->get('cache_warmer');
+ // non optional warmers already ran during container compilation
+ $warmer->enableOnlyOptionalWarmers();
+ $preload = (array) $warmer->warmUp($realCacheDir);
- if (0 === strpos($realCacheDir, $mount)) {
- $io->note('For better performances, you should move the cache and log directories to a non-shared folder of the VM.');
- $oldCacheDir = false;
- break;
+ if ($preload && file_exists($preloadFile = $realCacheDir.'/'.$kernel->getContainer()->getParameter('kernel.container_class').'.preload.php')) {
+ Preloader::append($preloadFile, $preload);
}
}
- }
-
- if ($oldCacheDir) {
- $fs->rename($realCacheDir, $oldCacheDir);
} else {
- $fs->remove($realCacheDir);
- }
- $fs->rename($warmupDir, $realCacheDir);
+ $fs->mkdir($warmupDir);
- if ($output->isVerbose()) {
- $io->comment('Removing old cache directory...');
- }
+ if (!$input->getOption('no-warmup')) {
+ if ($output->isVerbose()) {
+ $io->comment('Warming up cache...');
+ }
+ $this->warmup($warmupDir, $realCacheDir, !$input->getOption('no-optional-warmers'));
+ }
+
+ if (!$fs->exists($warmupDir.'/'.$containerDir)) {
+ $fs->rename($realBuildDir.'/'.$containerDir, $warmupDir.'/'.$containerDir);
+ touch($warmupDir.'/'.$containerDir.'.legacy');
+ }
+
+ if ($this->isNfs($realBuildDir)) {
+ $io->note('For better performances, you should move the cache and log directories to a non-shared folder of the VM.');
+ $fs->remove($realBuildDir);
+ } else {
+ $fs->rename($realBuildDir, $oldBuildDir);
+ }
+
+ $fs->rename($warmupDir, $realBuildDir);
- try {
- $fs->remove($oldCacheDir);
- } catch (IOException $e) {
if ($output->isVerbose()) {
- $io->warning($e->getMessage());
+ $io->comment('Removing old build and cache directory...');
+ }
+
+ if ($useBuildDir) {
+ try {
+ $fs->remove($oldBuildDir);
+ } catch (IOException $e) {
+ if ($output->isVerbose()) {
+ $io->warning($e->getMessage());
+ }
+ }
+ }
+
+ try {
+ $fs->remove($oldCacheDir);
+ } catch (IOException $e) {
+ if ($output->isVerbose()) {
+ $io->warning($e->getMessage());
+ }
}
}
@@ -184,177 +198,64 @@ EOF
}
$io->success(sprintf('Cache for the "%s" environment (debug=%s) was successfully cleared.', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
+
+ return 0;
}
- /**
- * @param string $warmupDir
- * @param string $realCacheDir
- * @param bool $enableOptionalWarmers
- */
- protected function warmup($warmupDir, $realCacheDir, $enableOptionalWarmers = true)
+ private function isNfs(string $dir): bool
+ {
+ static $mounts = null;
+
+ if (null === $mounts) {
+ $mounts = [];
+ if ('/' === \DIRECTORY_SEPARATOR && $files = @file('/proc/mounts')) {
+ foreach ($files as $mount) {
+ $mount = \array_slice(explode(' ', $mount), 1, -3);
+ if (!\in_array(array_pop($mount), ['vboxsf', 'nfs'])) {
+ continue;
+ }
+ $mounts[] = implode(' ', $mount).'/';
+ }
+ }
+ }
+ foreach ($mounts as $mount) {
+ if (0 === strpos($dir, $mount)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private function warmup(string $warmupDir, string $realBuildDir, bool $enableOptionalWarmers = true)
{
// create a temporary kernel
- $realKernel = $this->getApplication()->getKernel();
- if ($realKernel instanceof RebootableInterface) {
- $realKernel->reboot($warmupDir);
- $tempKernel = $realKernel;
- } else {
- $this->warning = 'Calling "cache:clear" with a kernel that does not implement "Symfony\Component\HttpKernel\RebootableInterface" is deprecated since Symfony 3.4 and will be unsupported in 4.0.';
- $realKernelClass = \get_class($realKernel);
- $namespace = '';
- if (false !== $pos = strrpos($realKernelClass, '\\')) {
- $namespace = substr($realKernelClass, 0, $pos);
- $realKernelClass = substr($realKernelClass, $pos + 1);
- }
- $tempKernel = $this->getTempKernel($realKernel, $namespace, $realKernelClass, $warmupDir);
- $tempKernel->boot();
-
- $tempKernelReflection = new \ReflectionObject($tempKernel);
- $tempKernelFile = $tempKernelReflection->getFileName();
+ $kernel = $this->getApplication()->getKernel();
+ if (!$kernel instanceof RebootableInterface) {
+ throw new \LogicException('Calling "cache:clear" with a kernel that does not implement "Symfony\Component\HttpKernel\RebootableInterface" is not supported.');
}
+ $kernel->reboot($warmupDir);
// warmup temporary dir
- $warmer = $tempKernel->getContainer()->get('cache_warmer');
if ($enableOptionalWarmers) {
- $warmer->enableOptionalWarmers();
+ $warmer = $kernel->getContainer()->get('cache_warmer');
+ // non optional warmers already ran during container compilation
+ $warmer->enableOnlyOptionalWarmers();
+ $preload = (array) $warmer->warmUp($warmupDir);
+
+ if ($preload && file_exists($preloadFile = $warmupDir.'/'.$kernel->getContainer()->getParameter('kernel.container_class').'.preload.php')) {
+ Preloader::append($preloadFile, $preload);
+ }
}
- $warmer->warmUp($warmupDir);
// fix references to cached files with the real cache directory name
$search = [$warmupDir, str_replace('\\', '\\\\', $warmupDir)];
- $replace = str_replace('\\', '/', $realCacheDir);
+ $replace = str_replace('\\', '/', $realBuildDir);
foreach (Finder::create()->files()->in($warmupDir) as $file) {
$content = str_replace($search, $replace, file_get_contents($file), $count);
if ($count) {
file_put_contents($file, $content);
}
}
-
- if ($realKernel instanceof RebootableInterface) {
- return;
- }
-
- // fix references to the Kernel in .meta files
- $safeTempKernel = str_replace('\\', '\\\\', \get_class($tempKernel));
- $realKernelFQN = \get_class($realKernel);
-
- foreach (Finder::create()->files()->depth('<3')->name('*.meta')->in($warmupDir) as $file) {
- file_put_contents($file, preg_replace(
- '/(C\:\d+\:)"'.$safeTempKernel.'"/',
- sprintf('$1"%s"', $realKernelFQN),
- file_get_contents($file)
- ));
- }
-
- // fix references to container's class
- $tempContainerClass = $tempKernel->getContainerClass();
- $realContainerClass = $tempKernel->getRealContainerClass();
- foreach (Finder::create()->files()->depth('<2')->name($tempContainerClass.'*')->in($warmupDir) as $file) {
- $content = str_replace($tempContainerClass, $realContainerClass, file_get_contents($file));
- file_put_contents($file, $content);
- rename($file, str_replace(\DIRECTORY_SEPARATOR.$tempContainerClass, \DIRECTORY_SEPARATOR.$realContainerClass, $file));
- }
- if (is_dir($tempContainerDir = $warmupDir.'/'.\get_class($tempKernel->getContainer()))) {
- foreach (Finder::create()->files()->in($tempContainerDir) as $file) {
- $content = str_replace($tempContainerClass, $realContainerClass, file_get_contents($file));
- file_put_contents($file, $content);
- }
- }
-
- // remove temp kernel file after cache warmed up
- @unlink($tempKernelFile);
- }
-
- /**
- * @param string $namespace
- * @param string $parentClass
- * @param string $warmupDir
- *
- * @return KernelInterface
- */
- protected function getTempKernel(KernelInterface $parent, $namespace, $parentClass, $warmupDir)
- {
- $projectDir = '';
- $cacheDir = var_export($warmupDir, true);
- $rootDir = var_export(realpath($parent->getRootDir()), true);
- $logDir = var_export(realpath($parent->getLogDir()), true);
- // the temp kernel class name must have the same length than the real one
- // to avoid the many problems in serialized resources files
- $class = substr($parentClass, 0, -1).'_';
- // the temp container class must be changed too
- $container = $parent->getContainer();
- $realContainerClass = var_export($container->hasParameter('kernel.container_class') ? $container->getParameter('kernel.container_class') : \get_class($parent->getContainer()), true);
- $containerClass = substr_replace($realContainerClass, '_', -2, 1);
-
- if (method_exists($parent, 'getProjectDir')) {
- $projectDir = var_export(realpath($parent->getProjectDir()), true);
- $projectDir = <<getResources();
- \$filteredResources = [];
- foreach (\$resources as \$resource) {
- if ((string) \$resource !== __FILE__) {
- \$filteredResources[] = \$resource;
- }
- }
-
- \$container->setResources(\$filteredResources);
-
- return \$container;
- }
- }
-}
-EOF;
- $this->filesystem->mkdir($warmupDir);
- file_put_contents($file = $warmupDir.'/kernel.tmp', $code);
- require_once $file;
- $class = "$namespace\\$class";
-
- return new $class($parent->getEnvironment(), $parent->isDebug());
}
}
diff --git a/lib/symfony/framework-bundle/Command/CachePoolClearCommand.php b/lib/symfony/framework-bundle/Command/CachePoolClearCommand.php
index 13a619630..b72924dfa 100644
--- a/lib/symfony/framework-bundle/Command/CachePoolClearCommand.php
+++ b/lib/symfony/framework-bundle/Command/CachePoolClearCommand.php
@@ -12,6 +12,9 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Completion\CompletionInput;
+use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@@ -24,28 +27,23 @@ use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
*
* @author Nicolas Grekas
*/
-final class CachePoolClearCommand extends ContainerAwareCommand
+final class CachePoolClearCommand extends Command
{
protected static $defaultName = 'cache:pool:clear';
+ protected static $defaultDescription = 'Clear cache pools';
private $poolClearer;
+ private $poolNames;
/**
- * @param Psr6CacheClearer $poolClearer
+ * @param string[]|null $poolNames
*/
- public function __construct($poolClearer = null)
+ public function __construct(Psr6CacheClearer $poolClearer, array $poolNames = null)
{
- if (!$poolClearer instanceof Psr6CacheClearer) {
- @trigger_error(sprintf('%s() expects an instance of "%s" as first argument since Symfony 3.4. Not passing it is deprecated and will throw a TypeError in 4.0.', __METHOD__, Psr6CacheClearer::class), \E_USER_DEPRECATED);
-
- parent::__construct($poolClearer);
-
- return;
- }
-
parent::__construct();
$this->poolClearer = $poolClearer;
+ $this->poolNames = $poolNames;
}
/**
@@ -57,7 +55,7 @@ final class CachePoolClearCommand extends ContainerAwareCommand
->setDefinition([
new InputArgument('pools', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'A list of cache pools or cache pool clearers'),
])
- ->setDescription('Clears cache pools')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
The %command.name% command clears the given cache pools or cache pool clearers.
@@ -70,14 +68,8 @@ EOF
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
- // BC to be removed in 4.0
- if (null === $this->poolClearer) {
- $this->poolClearer = $this->getContainer()->get('cache.global_clearer');
- $cacheDir = $this->getContainer()->getParameter('kernel.cache_dir');
- }
-
$io = new SymfonyStyle($input, $output);
$kernel = $this->getApplication()->getKernel();
$pools = [];
@@ -101,19 +93,39 @@ EOF
foreach ($clearers as $id => $clearer) {
$io->comment(sprintf('Calling cache clearer: %s ', $id));
- $clearer->clear(isset($cacheDir) ? $cacheDir : $kernel->getContainer()->getParameter('kernel.cache_dir'));
+ $clearer->clear($kernel->getContainer()->getParameter('kernel.cache_dir'));
}
+ $failure = false;
foreach ($pools as $id => $pool) {
$io->comment(sprintf('Clearing cache pool: %s ', $id));
if ($pool instanceof CacheItemPoolInterface) {
- $pool->clear();
+ if (!$pool->clear()) {
+ $io->warning(sprintf('Cache pool "%s" could not be cleared.', $pool));
+ $failure = true;
+ }
} else {
- $this->poolClearer->clearPool($id);
+ if (false === $this->poolClearer->clearPool($id)) {
+ $io->warning(sprintf('Cache pool "%s" could not be cleared.', $pool));
+ $failure = true;
+ }
}
}
+ if ($failure) {
+ return 1;
+ }
+
$io->success('Cache was successfully cleared.');
+
+ return 0;
+ }
+
+ public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
+ {
+ if (\is_array($this->poolNames) && $input->mustSuggestArgumentValuesFor('pools')) {
+ $suggestions->suggestValues($this->poolNames);
+ }
}
}
diff --git a/lib/symfony/framework-bundle/Command/CachePoolDeleteCommand.php b/lib/symfony/framework-bundle/Command/CachePoolDeleteCommand.php
new file mode 100644
index 000000000..b36d48cfe
--- /dev/null
+++ b/lib/symfony/framework-bundle/Command/CachePoolDeleteCommand.php
@@ -0,0 +1,98 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Completion\CompletionInput;
+use Symfony\Component\Console\Completion\CompletionSuggestions;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
+
+/**
+ * Delete an item from a cache pool.
+ *
+ * @author Pierre du Plessis
+ */
+final class CachePoolDeleteCommand extends Command
+{
+ protected static $defaultName = 'cache:pool:delete';
+ protected static $defaultDescription = 'Delete an item from a cache pool';
+
+ private $poolClearer;
+ private $poolNames;
+
+ /**
+ * @param string[]|null $poolNames
+ */
+ public function __construct(Psr6CacheClearer $poolClearer, array $poolNames = null)
+ {
+ parent::__construct();
+
+ $this->poolClearer = $poolClearer;
+ $this->poolNames = $poolNames;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function configure()
+ {
+ $this
+ ->setDefinition([
+ new InputArgument('pool', InputArgument::REQUIRED, 'The cache pool from which to delete an item'),
+ new InputArgument('key', InputArgument::REQUIRED, 'The cache key to delete from the pool'),
+ ])
+ ->setDescription(self::$defaultDescription)
+ ->setHelp(<<<'EOF'
+The %command.name% deletes an item from a given cache pool.
+
+ %command.full_name%
+EOF
+ )
+ ;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $io = new SymfonyStyle($input, $output);
+ $pool = $input->getArgument('pool');
+ $key = $input->getArgument('key');
+ $cachePool = $this->poolClearer->getPool($pool);
+
+ if (!$cachePool->hasItem($key)) {
+ $io->note(sprintf('Cache item "%s" does not exist in cache pool "%s".', $key, $pool));
+
+ return 0;
+ }
+
+ if (!$cachePool->deleteItem($key)) {
+ throw new \Exception(sprintf('Cache item "%s" could not be deleted.', $key));
+ }
+
+ $io->success(sprintf('Cache item "%s" was successfully deleted.', $key));
+
+ return 0;
+ }
+
+ public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
+ {
+ if (\is_array($this->poolNames) && $input->mustSuggestArgumentValuesFor('pool')) {
+ $suggestions->suggestValues($this->poolNames);
+ }
+ }
+}
diff --git a/lib/symfony/framework-bundle/Command/CachePoolListCommand.php b/lib/symfony/framework-bundle/Command/CachePoolListCommand.php
new file mode 100644
index 000000000..0ad33241d
--- /dev/null
+++ b/lib/symfony/framework-bundle/Command/CachePoolListCommand.php
@@ -0,0 +1,68 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * List available cache pools.
+ *
+ * @author Tobias Nyholm
+ */
+final class CachePoolListCommand extends Command
+{
+ protected static $defaultName = 'cache:pool:list';
+ protected static $defaultDescription = 'List available cache pools';
+
+ private $poolNames;
+
+ /**
+ * @param string[] $poolNames
+ */
+ public function __construct(array $poolNames)
+ {
+ parent::__construct();
+
+ $this->poolNames = $poolNames;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function configure()
+ {
+ $this
+ ->setDescription(self::$defaultDescription)
+ ->setHelp(<<<'EOF'
+The %command.name% command lists all available cache pools.
+EOF
+ )
+ ;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $io = new SymfonyStyle($input, $output);
+
+ $io->table(['Pool name'], array_map(function ($pool) {
+ return [$pool];
+ }, $this->poolNames));
+
+ return 0;
+ }
+}
diff --git a/lib/symfony/framework-bundle/Command/CachePoolPruneCommand.php b/lib/symfony/framework-bundle/Command/CachePoolPruneCommand.php
index deee37694..8d1035294 100644
--- a/lib/symfony/framework-bundle/Command/CachePoolPruneCommand.php
+++ b/lib/symfony/framework-bundle/Command/CachePoolPruneCommand.php
@@ -25,13 +25,14 @@ use Symfony\Component\Console\Style\SymfonyStyle;
final class CachePoolPruneCommand extends Command
{
protected static $defaultName = 'cache:pool:prune';
+ protected static $defaultDescription = 'Prune cache pools';
private $pools;
/**
- * @param iterable|PruneableInterface[] $pools
+ * @param iterable $pools
*/
- public function __construct($pools)
+ public function __construct(iterable $pools)
{
parent::__construct();
@@ -44,7 +45,7 @@ final class CachePoolPruneCommand extends Command
protected function configure()
{
$this
- ->setDescription('Prunes cache pools')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
The %command.name% command deletes all expired items from all pruneable pools.
@@ -57,7 +58,7 @@ EOF
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
@@ -67,5 +68,7 @@ EOF
}
$io->success('Successfully pruned cache pool(s).');
+
+ return 0;
}
}
diff --git a/lib/symfony/framework-bundle/Command/CacheWarmupCommand.php b/lib/symfony/framework-bundle/Command/CacheWarmupCommand.php
index 720a02889..3529c5457 100644
--- a/lib/symfony/framework-bundle/Command/CacheWarmupCommand.php
+++ b/lib/symfony/framework-bundle/Command/CacheWarmupCommand.php
@@ -11,10 +11,12 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
+use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Dumper\Preloader;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate;
/**
@@ -22,27 +24,17 @@ use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate;
*
* @author Fabien Potencier
*
- * @final since version 3.4
+ * @final
*/
-class CacheWarmupCommand extends ContainerAwareCommand
+class CacheWarmupCommand extends Command
{
protected static $defaultName = 'cache:warmup';
+ protected static $defaultDescription = 'Warm up an empty cache';
private $cacheWarmer;
- /**
- * @param CacheWarmerAggregate $cacheWarmer
- */
- public function __construct($cacheWarmer = null)
+ public function __construct(CacheWarmerAggregate $cacheWarmer)
{
- if (!$cacheWarmer instanceof CacheWarmerAggregate) {
- @trigger_error(sprintf('Passing a command name as the first argument of "%s()" is deprecated since Symfony 3.4 and support for it will be removed in 4.0. If the command was registered by convention, make it a service instead.', __METHOD__), \E_USER_DEPRECATED);
-
- parent::__construct($cacheWarmer);
-
- return;
- }
-
parent::__construct();
$this->cacheWarmer = $cacheWarmer;
@@ -57,7 +49,7 @@ class CacheWarmupCommand extends ContainerAwareCommand
->setDefinition([
new InputOption('no-optional-warmers', '', InputOption::VALUE_NONE, 'Skip optional cache warmers (faster)'),
])
- ->setDescription('Warms up an empty cache')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
The %command.name% command warms up the cache.
@@ -76,14 +68,8 @@ EOF
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
- // BC to be removed in 4.0
- if (null === $this->cacheWarmer) {
- $this->cacheWarmer = $this->getContainer()->get('cache_warmer');
- $cacheDir = $this->getContainer()->getParameter('kernel.cache_dir');
- }
-
$io = new SymfonyStyle($input, $output);
$kernel = $this->getApplication()->getKernel();
@@ -93,8 +79,14 @@ EOF
$this->cacheWarmer->enableOptionalWarmers();
}
- $this->cacheWarmer->warmUp(isset($cacheDir) ? $cacheDir : $kernel->getContainer()->getParameter('kernel.cache_dir'));
+ $preload = $this->cacheWarmer->warmUp($cacheDir = $kernel->getContainer()->getParameter('kernel.cache_dir'));
+
+ if ($preload && file_exists($preloadFile = $cacheDir.'/'.$kernel->getContainer()->getParameter('kernel.container_class').'.preload.php')) {
+ Preloader::append($preloadFile, $preload);
+ }
$io->success(sprintf('Cache for the "%s" environment (debug=%s) was successfully warmed.', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
+
+ return 0;
}
}
diff --git a/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php b/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php
index adea7dbdb..8a8f2355b 100644
--- a/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php
+++ b/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php
@@ -11,12 +11,19 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Completion\CompletionInput;
+use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Compiler\ValidateEnvPlaceholdersPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\Yaml\Yaml;
/**
@@ -24,11 +31,12 @@ use Symfony\Component\Yaml\Yaml;
*
* @author GrƩgoire Pineau
*
- * @final since version 3.4
+ * @final
*/
class ConfigDebugCommand extends AbstractConfigCommand
{
protected static $defaultName = 'debug:config';
+ protected static $defaultDescription = 'Dump the current configuration for an extension';
/**
* {@inheritdoc}
@@ -40,7 +48,7 @@ class ConfigDebugCommand extends AbstractConfigCommand
new InputArgument('name', InputArgument::OPTIONAL, 'The bundle name or the extension alias'),
new InputArgument('path', InputArgument::OPTIONAL, 'The configuration option path'),
])
- ->setDescription('Dumps the current configuration for an extension')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
The %command.name% command dumps the current configuration for an
extension/bundle.
@@ -62,32 +70,33 @@ EOF
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$errorIo = $io->getErrorStyle();
if (null === $name = $input->getArgument('name')) {
$this->listBundles($errorIo);
+
+ $kernel = $this->getApplication()->getKernel();
+ if ($kernel instanceof ExtensionInterface
+ && ($kernel instanceof ConfigurationInterface || $kernel instanceof ConfigurationExtensionInterface)
+ && $kernel->getAlias()
+ ) {
+ $errorIo->table(['Kernel Extension'], [[$kernel->getAlias()]]);
+ }
+
$errorIo->comment('Provide the name of a bundle as the first argument of this command to dump its configuration. (e.g. debug:config FrameworkBundle )');
$errorIo->comment('For dumping a specific option, add its path as the second argument of this command. (e.g. debug:config FrameworkBundle serializer to dump the framework.serializer configuration)');
- return;
+ return 0;
}
$extension = $this->findExtension($name);
+ $extensionAlias = $extension->getAlias();
$container = $this->compileContainer();
- $extensionAlias = $extension->getAlias();
- $configs = $container->getExtensionConfig($extensionAlias);
- $configuration = $extension->getConfiguration($configs, $container);
-
- $this->validateConfiguration($extension, $configuration);
-
- $configs = $container->resolveEnvPlaceholders($container->getParameterBag()->resolveValue($configs));
-
- $processor = new Processor();
- $config = $container->resolveEnvPlaceholders($container->getParameterBag()->resolveValue($processor->processConfiguration($configuration, $configs)));
+ $config = $this->getConfig($extension, $container);
if (null === $path = $input->getArgument('path')) {
$io->title(
@@ -96,7 +105,7 @@ EOF
$io->writeln(Yaml::dump([$extensionAlias => $config], 10));
- return;
+ return 0;
}
try {
@@ -110,9 +119,11 @@ EOF
$io->title(sprintf('Current configuration for "%s.%s"', $extensionAlias, $path));
$io->writeln(Yaml::dump($config, 10));
+
+ return 0;
}
- private function compileContainer()
+ private function compileContainer(): ContainerBuilder
{
$kernel = clone $this->getApplication()->getKernel();
$kernel->boot();
@@ -128,13 +139,11 @@ EOF
/**
* Iterate over configuration until the last step of the given path.
*
- * @param array $config A bundle configuration
- *
* @throws LogicException If the configuration does not exist
*
* @return mixed
*/
- private function getConfigForPath(array $config, $path, $alias)
+ private function getConfigForPath(array $config, string $path, string $alias)
{
$steps = explode('.', $path);
@@ -148,4 +157,84 @@ EOF
return $config;
}
+
+ private function getConfigForExtension(ExtensionInterface $extension, ContainerBuilder $container): array
+ {
+ $extensionAlias = $extension->getAlias();
+
+ $extensionConfig = [];
+ foreach ($container->getCompilerPassConfig()->getPasses() as $pass) {
+ if ($pass instanceof ValidateEnvPlaceholdersPass) {
+ $extensionConfig = $pass->getExtensionConfig();
+ break;
+ }
+ }
+
+ if (isset($extensionConfig[$extensionAlias])) {
+ return $extensionConfig[$extensionAlias];
+ }
+
+ // Fall back to default config if the extension has one
+
+ if (!$extension instanceof ConfigurationExtensionInterface) {
+ throw new \LogicException(sprintf('The extension with alias "%s" does not have configuration.', $extensionAlias));
+ }
+
+ $configs = $container->getExtensionConfig($extensionAlias);
+ $configuration = $extension->getConfiguration($configs, $container);
+ $this->validateConfiguration($extension, $configuration);
+
+ return (new Processor())->processConfiguration($configuration, $configs);
+ }
+
+ public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
+ {
+ if ($input->mustSuggestArgumentValuesFor('name')) {
+ $suggestions->suggestValues($this->getAvailableBundles(!preg_match('/^[A-Z]/', $input->getCompletionValue())));
+
+ return;
+ }
+
+ if ($input->mustSuggestArgumentValuesFor('path') && null !== $name = $input->getArgument('name')) {
+ try {
+ $config = $this->getConfig($this->findExtension($name), $this->compileContainer());
+ $paths = array_keys(self::buildPathsCompletion($config));
+ $suggestions->suggestValues($paths);
+ } catch (LogicException $e) {
+ }
+ }
+ }
+
+ private function getAvailableBundles(bool $alias): array
+ {
+ $availableBundles = [];
+ foreach ($this->getApplication()->getKernel()->getBundles() as $bundle) {
+ $availableBundles[] = $alias ? $bundle->getContainerExtension()->getAlias() : $bundle->getName();
+ }
+
+ return $availableBundles;
+ }
+
+ private function getConfig(ExtensionInterface $extension, ContainerBuilder $container)
+ {
+ return $container->resolveEnvPlaceholders(
+ $container->getParameterBag()->resolveValue(
+ $this->getConfigForExtension($extension, $container)
+ )
+ );
+ }
+
+ private static function buildPathsCompletion(array $paths, string $prefix = ''): array
+ {
+ $completionPaths = [];
+ foreach ($paths as $key => $values) {
+ if (\is_array($values)) {
+ $completionPaths = $completionPaths + self::buildPathsCompletion($values, $prefix.$key.'.');
+ } else {
+ $completionPaths[$prefix.$key] = null;
+ }
+ }
+
+ return $completionPaths;
+ }
}
diff --git a/lib/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php b/lib/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php
index a4d2764b1..7a56ec5ab 100644
--- a/lib/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php
+++ b/lib/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php
@@ -11,14 +11,20 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Dumper\XmlReferenceDumper;
use Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper;
+use Symfony\Component\Console\Completion\CompletionInput;
+use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+use Symfony\Component\Yaml\Yaml;
/**
* A console command for dumping available configuration reference.
@@ -27,11 +33,12 @@ use Symfony\Component\Console\Style\SymfonyStyle;
* @author Wouter J
* @author GrƩgoire Pineau
*
- * @final since version 3.4
+ * @final
*/
class ConfigDumpReferenceCommand extends AbstractConfigCommand
{
protected static $defaultName = 'config:dump-reference';
+ protected static $defaultDescription = 'Dump the default configuration for an extension';
/**
* {@inheritdoc}
@@ -44,7 +51,7 @@ class ConfigDumpReferenceCommand extends AbstractConfigCommand
new InputArgument('path', InputArgument::OPTIONAL, 'The configuration option path'),
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (yaml or xml)', 'yaml'),
])
- ->setDescription('Dumps the default configuration for an extension')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
The %command.name% command dumps the default configuration for an
extension/bundle.
@@ -74,28 +81,48 @@ EOF
*
* @throws \LogicException
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$errorIo = $io->getErrorStyle();
if (null === $name = $input->getArgument('name')) {
$this->listBundles($errorIo);
+
+ $kernel = $this->getApplication()->getKernel();
+ if ($kernel instanceof ExtensionInterface
+ && ($kernel instanceof ConfigurationInterface || $kernel instanceof ConfigurationExtensionInterface)
+ && $kernel->getAlias()
+ ) {
+ $errorIo->table(['Kernel Extension'], [[$kernel->getAlias()]]);
+ }
+
$errorIo->comment([
'Provide the name of a bundle as the first argument of this command to dump its default configuration. (e.g. config:dump-reference FrameworkBundle )',
'For dumping a specific option, add its path as the second argument of this command. (e.g. config:dump-reference FrameworkBundle profiler.matcher to dump the framework.profiler.matcher configuration)',
]);
- return null;
+ return 0;
}
$extension = $this->findExtension($name);
- $configuration = $extension->getConfiguration([], $this->getContainerBuilder());
+ if ($extension instanceof ConfigurationInterface) {
+ $configuration = $extension;
+ } else {
+ $configuration = $extension->getConfiguration([], $this->getContainerBuilder($this->getApplication()->getKernel()));
+ }
$this->validateConfiguration($extension, $configuration);
$format = $input->getOption('format');
+
+ if ('yaml' === $format && !class_exists(Yaml::class)) {
+ $errorIo->error('Setting the "format" option to "yaml" requires the Symfony Yaml component. Try running "composer install symfony/yaml" or use "--format=xml" instead.');
+
+ return 1;
+ }
+
$path = $input->getArgument('path');
if (null !== $path && 'yaml' !== $format) {
@@ -130,6 +157,34 @@ EOF
$io->writeln(null === $path ? $dumper->dump($configuration, $extension->getNamespace()) : $dumper->dumpAtPath($configuration, $path));
- return null;
+ return 0;
+ }
+
+ public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
+ {
+ if ($input->mustSuggestArgumentValuesFor('name')) {
+ $suggestions->suggestValues($this->getAvailableBundles());
+ }
+
+ if ($input->mustSuggestOptionValuesFor('format')) {
+ $suggestions->suggestValues($this->getAvailableFormatOptions());
+ }
+ }
+
+ private function getAvailableBundles(): array
+ {
+ $bundles = [];
+
+ foreach ($this->getApplication()->getKernel()->getBundles() as $bundle) {
+ $bundles[] = $bundle->getName();
+ $bundles[] = $bundle->getContainerExtension()->getAlias();
+ }
+
+ return $bundles;
+ }
+
+ private function getAvailableFormatOptions(): array
+ {
+ return ['yaml', 'xml'];
}
}
diff --git a/lib/symfony/framework-bundle/Command/ContainerAwareCommand.php b/lib/symfony/framework-bundle/Command/ContainerAwareCommand.php
deleted file mode 100644
index 2c84e7f72..000000000
--- a/lib/symfony/framework-bundle/Command/ContainerAwareCommand.php
+++ /dev/null
@@ -1,56 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Bundle\FrameworkBundle\Command;
-
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\DependencyInjection\ContainerAwareInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Command.
- *
- * @author Fabien Potencier
- */
-abstract class ContainerAwareCommand extends Command implements ContainerAwareInterface
-{
- /**
- * @var ContainerInterface|null
- */
- private $container;
-
- /**
- * @return ContainerInterface
- *
- * @throws \LogicException
- */
- protected function getContainer()
- {
- if (null === $this->container) {
- $application = $this->getApplication();
- if (null === $application) {
- throw new \LogicException('The container cannot be retrieved as the application instance is not yet set.');
- }
-
- $this->container = $application->getKernel()->getContainer();
- }
-
- return $this->container;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setContainer(ContainerInterface $container = null)
- {
- $this->container = $container;
- }
-}
diff --git a/lib/symfony/framework-bundle/Command/ContainerDebugCommand.php b/lib/symfony/framework-bundle/Command/ContainerDebugCommand.php
index edbb526f0..8dfebe4ae 100644
--- a/lib/symfony/framework-bundle/Command/ContainerDebugCommand.php
+++ b/lib/symfony/framework-bundle/Command/ContainerDebugCommand.php
@@ -12,17 +12,17 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
use Symfony\Bundle\FrameworkBundle\Console\Helper\DescriptorHelper;
-use Symfony\Component\Config\ConfigCache;
-use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Completion\CompletionInput;
+use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
-use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
/**
@@ -30,16 +30,14 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
*
* @author Ryan Weaver
*
- * @internal since version 3.4
+ * @internal
*/
-class ContainerDebugCommand extends ContainerAwareCommand
+class ContainerDebugCommand extends Command
{
- protected static $defaultName = 'debug:container';
+ use BuildDebugContainerTrait;
- /**
- * @var ContainerBuilder|null
- */
- protected $containerBuilder;
+ protected static $defaultName = 'debug:container';
+ protected static $defaultDescription = 'Display current services for an application';
/**
* {@inheritdoc}
@@ -49,34 +47,48 @@ class ContainerDebugCommand extends ContainerAwareCommand
$this
->setDefinition([
new InputArgument('name', InputArgument::OPTIONAL, 'A service name (foo)'),
- new InputOption('show-private', null, InputOption::VALUE_NONE, 'Used to show public *and* private services'),
- new InputOption('show-arguments', null, InputOption::VALUE_NONE, 'Used to show arguments in services'),
- new InputOption('tag', null, InputOption::VALUE_REQUIRED, 'Shows all services with a specific tag'),
- new InputOption('tags', null, InputOption::VALUE_NONE, 'Displays tagged services for an application'),
- new InputOption('parameter', null, InputOption::VALUE_REQUIRED, 'Displays a specific parameter for an application'),
- new InputOption('parameters', null, InputOption::VALUE_NONE, 'Displays parameters for an application'),
- new InputOption('types', null, InputOption::VALUE_NONE, 'Displays types (classes/interfaces) available in the container'),
+ new InputOption('show-arguments', null, InputOption::VALUE_NONE, 'Show arguments in services'),
+ new InputOption('show-hidden', null, InputOption::VALUE_NONE, 'Show hidden (internal) services'),
+ new InputOption('tag', null, InputOption::VALUE_REQUIRED, 'Show all services with a specific tag'),
+ new InputOption('tags', null, InputOption::VALUE_NONE, 'Display tagged services for an application'),
+ new InputOption('parameter', null, InputOption::VALUE_REQUIRED, 'Display a specific parameter for an application'),
+ new InputOption('parameters', null, InputOption::VALUE_NONE, 'Display parameters for an application'),
+ new InputOption('types', null, InputOption::VALUE_NONE, 'Display types (classes/interfaces) available in the container'),
+ new InputOption('env-var', null, InputOption::VALUE_REQUIRED, 'Display a specific environment variable used in the container'),
+ new InputOption('env-vars', null, InputOption::VALUE_NONE, 'Display environment variables used in the container'),
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw description'),
+ new InputOption('deprecations', null, InputOption::VALUE_NONE, 'Display deprecations generated when compiling and warming up the container'),
])
- ->setDescription('Displays current services for an application')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
The %command.name% command displays all configured public services:
php %command.full_name%
+To see deprecations generated during container compilation and cache warmup, use the --deprecations option:
+
+ php %command.full_name% --deprecations
+
To get specific information about a service, specify its name:
php %command.full_name% validator
+To get specific information about a service including all its arguments, use the --show-arguments flag:
+
+ php %command.full_name% validator --show-arguments
+
To see available types that can be used for autowiring, use the --types flag:
php %command.full_name% --types
-By default, private services are hidden. You can display all services by
-using the --show-private flag:
+To see environment variables used by the container, use the --env-vars flag:
- php %command.full_name% --show-private
+ php %command.full_name% --env-vars
+
+Display a specific environment variable by specifying its name with the --env-var option:
+
+ php %command.full_name% --env-var=APP_ENV
Use the --tags option to display tagged public services grouped by tag:
@@ -94,6 +106,11 @@ Display a specific parameter by specifying its name with the --parameter
php %command.full_name% --parameter=kernel.debug
+By default, internal services are hidden. You can display them
+using the --show-hidden flag:
+
+ php %command.full_name% --show-hidden
+
EOF
)
;
@@ -102,16 +119,21 @@ EOF
/**
* {@inheritdoc}
*/
- protected function execute(InputInterface $input, OutputInterface $output)
+ protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$errorIo = $io->getErrorStyle();
$this->validateInput($input);
- $object = $this->getContainerBuilder();
+ $kernel = $this->getApplication()->getKernel();
+ $object = $this->getContainerBuilder($kernel);
- if ($input->getOption('types')) {
- $options = ['show_private' => true];
+ if ($input->getOption('env-vars')) {
+ $options = ['env-vars' => true];
+ } elseif ($envVar = $input->getOption('env-var')) {
+ $options = ['env-vars' => true, 'name' => $envVar];
+ } elseif ($input->getOption('types')) {
+ $options = [];
$options['filter'] = [$this, 'filterToServiceTypes'];
} elseif ($input->getOption('parameters')) {
$parameters = [];
@@ -123,33 +145,89 @@ EOF
} elseif ($parameter = $input->getOption('parameter')) {
$options = ['parameter' => $parameter];
} elseif ($input->getOption('tags')) {
- $options = ['group_by' => 'tags', 'show_private' => $input->getOption('show-private')];
+ $options = ['group_by' => 'tags'];
} elseif ($tag = $input->getOption('tag')) {
- $options = ['tag' => $tag, 'show_private' => $input->getOption('show-private')];
+ $options = ['tag' => $tag];
} elseif ($name = $input->getArgument('name')) {
- $name = $this->findProperServiceName($input, $errorIo, $object, $name);
+ $name = $this->findProperServiceName($input, $errorIo, $object, $name, $input->getOption('show-hidden'));
$options = ['id' => $name];
+ } elseif ($input->getOption('deprecations')) {
+ $options = ['deprecations' => true];
} else {
- $options = ['show_private' => $input->getOption('show-private')];
+ $options = [];
}
$helper = new DescriptorHelper();
$options['format'] = $input->getOption('format');
$options['show_arguments'] = $input->getOption('show-arguments');
+ $options['show_hidden'] = $input->getOption('show-hidden');
$options['raw_text'] = $input->getOption('raw');
$options['output'] = $io;
- $options['is_debug'] = $this->getApplication()->getKernel()->isDebug();
- $helper->describe($io, $object, $options);
+ $options['is_debug'] = $kernel->isDebug();
- if (!$input->getArgument('name') && !$input->getOption('tag') && !$input->getOption('parameter') && $input->isInteractive()) {
+ try {
+ $helper->describe($io, $object, $options);
+
+ if (isset($options['id']) && isset($kernel->getContainer()->getRemovedIds()[$options['id']])) {
+ $errorIo->note(sprintf('The "%s" service or alias has been removed or inlined when the container was compiled.', $options['id']));
+ }
+ } catch (ServiceNotFoundException $e) {
+ if ('' !== $e->getId() && '@' === $e->getId()[0]) {
+ throw new ServiceNotFoundException($e->getId(), $e->getSourceId(), null, [substr($e->getId(), 1)]);
+ }
+
+ throw $e;
+ }
+
+ if (!$input->getArgument('name') && !$input->getOption('tag') && !$input->getOption('parameter') && !$input->getOption('env-vars') && !$input->getOption('env-var') && $input->isInteractive()) {
if ($input->getOption('tags')) {
$errorIo->comment('To search for a specific tag, re-run this command with a search term. (e.g. debug:container --tag=form.type )');
} elseif ($input->getOption('parameters')) {
$errorIo->comment('To search for a specific parameter, re-run this command with a search term. (e.g. debug:container --parameter=kernel.debug )');
- } else {
+ } elseif (!$input->getOption('deprecations')) {
$errorIo->comment('To search for a specific service, re-run this command with a search term. (e.g. debug:container log )');
}
}
+
+ return 0;
+ }
+
+ public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
+ {
+ if ($input->mustSuggestOptionValuesFor('format')) {
+ $helper = new DescriptorHelper();
+ $suggestions->suggestValues($helper->getFormats());
+
+ return;
+ }
+
+ $kernel = $this->getApplication()->getKernel();
+ $object = $this->getContainerBuilder($kernel);
+
+ if ($input->mustSuggestArgumentValuesFor('name')
+ && !$input->getOption('tag') && !$input->getOption('tags')
+ && !$input->getOption('parameter') && !$input->getOption('parameters')
+ && !$input->getOption('env-var') && !$input->getOption('env-vars')
+ && !$input->getOption('types') && !$input->getOption('deprecations')
+ ) {
+ $suggestions->suggestValues($this->findServiceIdsContaining(
+ $object,
+ $input->getCompletionValue(),
+ (bool) $input->getOption('show-hidden')
+ ));
+
+ return;
+ }
+
+ if ($input->mustSuggestOptionValuesFor('tag')) {
+ $suggestions->suggestValues($object->findTags());
+
+ return;
+ }
+
+ if ($input->mustSuggestOptionValuesFor('parameter')) {
+ $suggestions->suggestValues(array_keys($object->getParameterBag()->all()));
+ }
}
/**
@@ -170,94 +248,66 @@ EOF
$name = $input->getArgument('name');
if ((null !== $name) && ($optionsCount > 0)) {
- throw new InvalidArgumentException('The options tags, tag, parameters & parameter can not be combined with the service name argument.');
+ throw new InvalidArgumentException('The options tags, tag, parameters & parameter cannot be combined with the service name argument.');
} elseif ((null === $name) && $optionsCount > 1) {
- throw new InvalidArgumentException('The options tags, tag, parameters & parameter can not be combined together.');
+ throw new InvalidArgumentException('The options tags, tag, parameters & parameter cannot be combined together.');
}
}
- /**
- * Loads the ContainerBuilder from the cache.
- *
- * @return ContainerBuilder
- *
- * @throws \LogicException
- */
- protected function getContainerBuilder()
+ private function findProperServiceName(InputInterface $input, SymfonyStyle $io, ContainerBuilder $builder, string $name, bool $showHidden): string
{
- if ($this->containerBuilder) {
- return $this->containerBuilder;
- }
+ $name = ltrim($name, '\\');
- $kernel = $this->getApplication()->getKernel();
-
- if (!$kernel->isDebug() || !(new ConfigCache($kernel->getContainer()->getParameter('debug.container.dump'), true))->isFresh()) {
- $buildContainer = \Closure::bind(function () { return $this->buildContainer(); }, $kernel, \get_class($kernel));
- $container = $buildContainer();
- $container->getCompilerPassConfig()->setRemovingPasses([]);
- $container->getCompilerPassConfig()->setAfterRemovingPasses([]);
- $container->compile();
- } else {
- (new XmlFileLoader($container = new ContainerBuilder(), new FileLocator()))->load($kernel->getContainer()->getParameter('debug.container.dump'));
- $locatorPass = new ServiceLocatorTagPass();
- $locatorPass->process($container);
- }
-
- return $this->containerBuilder = $container;
- }
-
- private function findProperServiceName(InputInterface $input, SymfonyStyle $io, ContainerBuilder $builder, $name)
- {
if ($builder->has($name) || !$input->isInteractive()) {
return $name;
}
- $matchingServices = $this->findServiceIdsContaining($builder, $name);
+ $matchingServices = $this->findServiceIdsContaining($builder, $name, $showHidden);
if (empty($matchingServices)) {
throw new InvalidArgumentException(sprintf('No services found that match "%s".', $name));
}
- $default = 1 === \count($matchingServices) ? $matchingServices[0] : null;
-
- return $io->choice('Select one of the following services to display its information', $matchingServices, $default);
- }
-
- private function findServiceIdsContaining(ContainerBuilder $builder, $name)
- {
- $serviceIds = $builder->getServiceIds();
- $foundServiceIds = [];
- foreach ($serviceIds as $serviceId) {
- if (false === stripos($serviceId, $name)) {
- continue;
- }
- $foundServiceIds[] = $serviceId;
+ if (1 === \count($matchingServices)) {
+ return $matchingServices[0];
}
- return $foundServiceIds;
+ return $io->choice('Select one of the following services to display its information', $matchingServices);
+ }
+
+ private function findServiceIdsContaining(ContainerBuilder $builder, string $name, bool $showHidden): array
+ {
+ $serviceIds = $builder->getServiceIds();
+ $foundServiceIds = $foundServiceIdsIgnoringBackslashes = [];
+ foreach ($serviceIds as $serviceId) {
+ if (!$showHidden && str_starts_with($serviceId, '.')) {
+ continue;
+ }
+ if (false !== stripos(str_replace('\\', '', $serviceId), $name)) {
+ $foundServiceIdsIgnoringBackslashes[] = $serviceId;
+ }
+ if ('' === $name || false !== stripos($serviceId, $name)) {
+ $foundServiceIds[] = $serviceId;
+ }
+ }
+
+ return $foundServiceIds ?: $foundServiceIdsIgnoringBackslashes;
}
/**
* @internal
*/
- public function filterToServiceTypes($serviceId)
+ public function filterToServiceTypes(string $serviceId): bool
{
// filter out things that could not be valid class names
- if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+$/', $serviceId)) {
+ if (!preg_match('/(?(DEFINE)(?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+))^(?&V)(?:\\\\(?&V))*+(?: \$(?&V))?$/', $serviceId)) {
return false;
}
// if the id has a \, assume it is a class
- if (false !== strpos($serviceId, '\\')) {
+ if (str_contains($serviceId, '\\')) {
return true;
}
- try {
- new \ReflectionClass($serviceId);
-
- return true;
- } catch (\ReflectionException $e) {
- // the service id is not a valid class/interface
- return false;
- }
+ return class_exists($serviceId) || interface_exists($serviceId, false);
}
}
diff --git a/lib/symfony/framework-bundle/Command/ContainerLintCommand.php b/lib/symfony/framework-bundle/Command/ContainerLintCommand.php
new file mode 100644
index 000000000..337f1f420
--- /dev/null
+++ b/lib/symfony/framework-bundle/Command/ContainerLintCommand.php
@@ -0,0 +1,134 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Command;
+
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\Compiler\CheckTypeDeclarationsPass;
+use Symfony\Component\DependencyInjection\Compiler\PassConfig;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
+use Symfony\Component\HttpKernel\Kernel;
+
+final class ContainerLintCommand extends Command
+{
+ protected static $defaultName = 'lint:container';
+ protected static $defaultDescription = 'Ensure that arguments injected into services match type declarations';
+
+ /**
+ * @var ContainerBuilder
+ */
+ private $containerBuilder;
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function configure()
+ {
+ $this
+ ->setDescription(self::$defaultDescription)
+ ->setHelp('This command parses service definitions and ensures that injected values match the type declarations of each services\' class.')
+ ;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $io = new SymfonyStyle($input, $output);
+ $errorIo = $io->getErrorStyle();
+
+ try {
+ $container = $this->getContainerBuilder();
+ } catch (RuntimeException $e) {
+ $errorIo->error($e->getMessage());
+
+ return 2;
+ }
+
+ $container->setParameter('container.build_time', time());
+
+ try {
+ $container->compile();
+ } catch (InvalidArgumentException $e) {
+ $errorIo->error($e->getMessage());
+
+ return 1;
+ }
+
+ $io->success('The container was linted successfully: all services are injected with values that are compatible with their type declarations.');
+
+ return 0;
+ }
+
+ private function getContainerBuilder(): ContainerBuilder
+ {
+ if ($this->containerBuilder) {
+ return $this->containerBuilder;
+ }
+
+ $kernel = $this->getApplication()->getKernel();
+ $kernelContainer = $kernel->getContainer();
+
+ if (!$kernel->isDebug() || !(new ConfigCache($kernelContainer->getParameter('debug.container.dump'), true))->isFresh()) {
+ if (!$kernel instanceof Kernel) {
+ throw new RuntimeException(sprintf('This command does not support the application kernel: "%s" does not extend "%s".', get_debug_type($kernel), Kernel::class));
+ }
+
+ $buildContainer = \Closure::bind(function (): ContainerBuilder {
+ $this->initializeBundles();
+
+ return $this->buildContainer();
+ }, $kernel, \get_class($kernel));
+ $container = $buildContainer();
+
+ $skippedIds = [];
+ } else {
+ if (!$kernelContainer instanceof Container) {
+ throw new RuntimeException(sprintf('This command does not support the application container: "%s" does not extend "%s".', get_debug_type($kernelContainer), Container::class));
+ }
+
+ (new XmlFileLoader($container = new ContainerBuilder($parameterBag = new EnvPlaceholderParameterBag()), new FileLocator()))->load($kernelContainer->getParameter('debug.container.dump'));
+
+ $refl = new \ReflectionProperty($parameterBag, 'resolved');
+ $refl->setAccessible(true);
+ $refl->setValue($parameterBag, true);
+
+ $skippedIds = [];
+ foreach ($container->getServiceIds() as $serviceId) {
+ if (str_starts_with($serviceId, '.errored.')) {
+ $skippedIds[$serviceId] = true;
+ }
+ }
+
+ $container->getCompilerPassConfig()->setBeforeOptimizationPasses([]);
+ $container->getCompilerPassConfig()->setOptimizationPasses([]);
+ $container->getCompilerPassConfig()->setBeforeRemovingPasses([]);
+ }
+
+ $container->setParameter('container.build_hash', 'lint_container');
+ $container->setParameter('container.build_id', 'lint_container');
+
+ $container->addCompilerPass(new CheckTypeDeclarationsPass(true, $skippedIds), PassConfig::TYPE_AFTER_REMOVING, -100);
+
+ return $this->containerBuilder = $container;
+ }
+}
diff --git a/lib/symfony/framework-bundle/Command/DebugAutowiringCommand.php b/lib/symfony/framework-bundle/Command/DebugAutowiringCommand.php
index 84c87521c..e1e3c9534 100644
--- a/lib/symfony/framework-bundle/Command/DebugAutowiringCommand.php
+++ b/lib/symfony/framework-bundle/Command/DebugAutowiringCommand.php
@@ -11,10 +11,16 @@
namespace Symfony\Bundle\FrameworkBundle\Command;
+use Symfony\Bundle\FrameworkBundle\Console\Descriptor\Descriptor;
+use Symfony\Component\Console\Completion\CompletionInput;
+use Symfony\Component\Console\Completion\CompletionSuggestions;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
/**
* A console command for autowiring information.
@@ -26,6 +32,17 @@ use Symfony\Component\Console\Style\SymfonyStyle;
class DebugAutowiringCommand extends ContainerDebugCommand
{
protected static $defaultName = 'debug:autowiring';
+ protected static $defaultDescription = 'List classes/interfaces you can use for autowiring';
+
+ private $supportsHref;
+ private $fileLinkFormatter;
+
+ public function __construct(string $name = null, FileLinkFormatter $fileLinkFormatter = null)
+ {
+ $this->supportsHref = method_exists(OutputFormatterStyle::class, 'setHref');
+ $this->fileLinkFormatter = $fileLinkFormatter;
+ parent::__construct($name);
+ }
/**
* {@inheritdoc}
@@ -35,10 +52,11 @@ class DebugAutowiringCommand extends ContainerDebugCommand
$this
->setDefinition([
new InputArgument('search', InputArgument::OPTIONAL, 'A search filter'),
+ new InputOption('all', null, InputOption::VALUE_NONE, 'Show also services that are not aliased'),
])
- ->setDescription('Lists classes/interfaces you can use for autowiring')
+ ->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
-The