From a1dbc0b521bebb7e449b3110a2cd97433a613c91 Mon Sep 17 00:00:00 2001 From: Cerys Date: Fri, 24 Jan 2025 17:43:52 +0000 Subject: [PATCH] made a start on the more boilerplate kinda stuff --- .gitignore | 6 + App/Configuration.php | 44 + App/TwigExtensions/FiltersExtension.php | 97 ++ App/TwigExtensions/FunctionExtensions.php | 130 ++ App/TwigExtensions/NavigationExtension.php | 45 + .../StringManipulationExtension.php | 36 + App/TwigTests/TwigTests.php | 33 + App/Wrappers/AlgoliaInteractions.php | 18 + App/Wrappers/DatabaseInteractions.php | 77 + App/Wrappers/SQLQueryBuilderWrapper.php | 41 + Configuration/Configuration.yaml | 15 + LocalStorage/.gitkeep | 0 LocalStorage/Tunes/.gitkeep | 0 Localisation/en-GB.yaml | 160 ++ Pages/index.php | 8 + Pages/tune/uuid.php | 22 + Public/Static/CSS/Elements/HomePage.css | 37 + Public/Static/CSS/Elements/_General.css | 21 + Public/Static/CSS/Mapper.css | 11 + Public/Static/CSS/Themes/Light.css | 2 + Public/Static/JS/AlgoliaInteractions.js | 30 + Public/favicon.png | Bin 0 -> 1277 bytes Routing/Router.php | 29 + Templates/Bases/ErrorPage.html.twig | 26 + Templates/Bases/StandardWebPage.html.twig | 33 + Templates/ErrorPages/404.html.twig | 4 + Templates/Pages/index.html.twig | 21 + Templates/Pages/tune/uuid.html.twig | 7 + composer.json | 32 + composer.lock | 1326 +++++++++++++++++ 30 files changed, 2311 insertions(+) create mode 100644 .gitignore create mode 100644 App/Configuration.php create mode 100644 App/TwigExtensions/FiltersExtension.php create mode 100644 App/TwigExtensions/FunctionExtensions.php create mode 100644 App/TwigExtensions/NavigationExtension.php create mode 100644 App/TwigExtensions/StringManipulationExtension.php create mode 100644 App/TwigTests/TwigTests.php create mode 100644 App/Wrappers/AlgoliaInteractions.php create mode 100644 App/Wrappers/DatabaseInteractions.php create mode 100644 App/Wrappers/SQLQueryBuilderWrapper.php create mode 100644 Configuration/Configuration.yaml create mode 100644 LocalStorage/.gitkeep create mode 100644 LocalStorage/Tunes/.gitkeep create mode 100644 Localisation/en-GB.yaml create mode 100644 Pages/index.php create mode 100644 Pages/tune/uuid.php create mode 100644 Public/Static/CSS/Elements/HomePage.css create mode 100644 Public/Static/CSS/Elements/_General.css create mode 100644 Public/Static/CSS/Mapper.css create mode 100644 Public/Static/CSS/Themes/Light.css create mode 100644 Public/Static/JS/AlgoliaInteractions.js create mode 100644 Public/favicon.png create mode 100644 Routing/Router.php create mode 100644 Templates/Bases/ErrorPage.html.twig create mode 100644 Templates/Bases/StandardWebPage.html.twig create mode 100644 Templates/ErrorPages/404.html.twig create mode 100644 Templates/Pages/index.html.twig create mode 100644 Templates/Pages/tune/uuid.html.twig create mode 100644 composer.json create mode 100644 composer.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b9ac8b --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea/ + +vendor/ +composer.phar + +Configuration/Secrets.yaml diff --git a/App/Configuration.php b/App/Configuration.php new file mode 100644 index 0000000..5aa8e6a --- /dev/null +++ b/App/Configuration.php @@ -0,0 +1,44 @@ +format("l d F Y"); + } + public function PrettyTime(?string $target): string + { + if($target == [] || $target == "" || $target == null) return "meow :3"; + + $temp = new DateTime( + datetime: $target, + ); + + return $temp->format("h:i:s A"); + } + + public function PrettyDateTime(?string $target): string + { + return $this->PrettyDate(target: $target) . " at " . $this->PrettyTime(target: $target); + } +} diff --git a/App/TwigExtensions/FunctionExtensions.php b/App/TwigExtensions/FunctionExtensions.php new file mode 100644 index 0000000..bda72da --- /dev/null +++ b/App/TwigExtensions/FunctionExtensions.php @@ -0,0 +1,130 @@ +twig = $twig; + } + + public function getFunctions() + { + return [ + new TwigFunction('RandomUUID', [$this, 'RandomUUID'], ['is_safe' => ['html']]), + + new TwigFunction('BuildForms', [$this, 'BuildForms'], ['is_safe' => ['html']]), + new TwigFunction('BuildModifiableField', [$this, 'BuildModifiableField'], ['is_safe' => ['html']]), + new TwigFunction('BuildEnumField', [$this, 'BuildEnumField'], ['is_safe' => ['html']]), + + new TwigFunction('GetLFSFileURL', [$this, 'GetLFSFileURL'], ['is_safe' => ['html']]), + new TwigFunction('GetConfigurationItem', [$this, 'GetConfigurationItem'], ['is_safe' => ['html']]), + + new TwigFunction('ParseForUserToken', [$this, 'ParseForUserToken'], ['is_safe' => ['html']]), + ]; + } + + public function RandomUUID(): string + { + return Uuid::uuid4()->toString(); + } + + public function BuildForms(...$formDefinitions): string + { + $output = '
'; + foreach ($formDefinitions as $formDefinition) + { + $output .= twig_include($this->twig, [], '/Partials/Form.html.twig', ['FormDefinition' => $formDefinition]); + } + return "$output
"; + } + public function BuildModifiableField(string $apiBase, string $id, string $value): string + { + $output = twig_include($this->twig, [], '/Partials/ModifiableField.html.twig', ['FieldData' => [ + "APIBase"=>$apiBase, + "ID"=>$id, + "Value"=>$value, + ]]); + return "$output"; + } + public function BuildEnumField(string $apiBase, string $id, string $value, string $enumName): string + { + $enumData = APIWrapper::Get("/Enumerators/$enumName")->Payload["Cases"]; + foreach($enumData as $case) + { + if($case["Value"] == $value) + { + $currentEnum = $case; + } + } + + $output = twig_include($this->twig, [], '/Partials/EnumField.html.twig', ['FieldData' => [ + "APIBase"=>$apiBase, + "ID"=>$id, + "Value"=>$value, + "EnumName"=>$enumName, + "CurrentEnum"=>$currentEnum, + "EnumData"=>$enumData, + ]]); + return "$output"; + } + public function GetConfigurationItem(string...$nav): string + { + return Configuration::GetConfig(...$nav); + } + + public function GetLFSFileURL(string $fileID): string + { + return LFSWrapper::GetFileURLByID($fileID); + } + + + public function ParseForUserToken(string $input) : string + { + $modes = implode(separator: "|", array:[ + "USER", + "VEHICLE", + ]); + $uuidRegex = "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}"; + $fullRegex = "/@({$modes}).{$uuidRegex}.{$uuidRegex}/"; + preg_match_all($fullRegex, $input, $matches); + + foreach($matches[0] as $match) + { + $parts = explode(".", $match); + + $mode = substr(string: $parts[0], offset: 1); + $tenantID = $parts[1]; + $objectID = $parts[2]; + + switch ($mode) + { + case "USER": + $temp = twig_include($this->twig, [], '/Partials/UserButton.html.twig', [ + '_tenantID' => $tenantID, + '_userID' => $objectID, + ]); + break; + case "VEHICLE": + break; + } + + $input = str_replace($match, $temp, $input); + } + + return $input; + } +} diff --git a/App/TwigExtensions/NavigationExtension.php b/App/TwigExtensions/NavigationExtension.php new file mode 100644 index 0000000..2e92dc5 --- /dev/null +++ b/App/TwigExtensions/NavigationExtension.php @@ -0,0 +1,45 @@ + +
+ arrow_back + Back +
+

{{TITLE}}

+
+ + '; + return str_replace( + search: "{{TITLE}}", + replace: $title, + subject: $html + ); + } +} \ No newline at end of file diff --git a/App/TwigExtensions/StringManipulationExtension.php b/App/TwigExtensions/StringManipulationExtension.php new file mode 100644 index 0000000..1db8e15 --- /dev/null +++ b/App/TwigExtensions/StringManipulationExtension.php @@ -0,0 +1,36 @@ +"7-other-equipment" + ]; + + $motCodeElements = explode(separator: '.', string: $motCode); + + $builder = "https://www.gov.uk/guidance/mot-inspection-manual-for-private-passenger-and-light-commercial-vehicles/"; + $builder .= $groups[intval(value: $motCodeElements[0])]; + $builder .= "#section-"; + $builder .= "-"; + $builder .= $motCodeElements[1]; + $builder .= "-"; + $builder .= $motCodeElements[2]; + + return $builder; + } +} \ No newline at end of file diff --git a/App/TwigTests/TwigTests.php b/App/TwigTests/TwigTests.php new file mode 100644 index 0000000..3306d07 --- /dev/null +++ b/App/TwigTests/TwigTests.php @@ -0,0 +1,33 @@ +SearchClient = SearchClient::create( + appId: Configuration::GetConfig("Algolia", "AppID"), + apiKey: Configuration::GetConfig("Algolia", "Keys", "SearchOnly"), + ); + } +} diff --git a/App/Wrappers/DatabaseInteractions.php b/App/Wrappers/DatabaseInteractions.php new file mode 100644 index 0000000..c3ef5c7 --- /dev/null +++ b/App/Wrappers/DatabaseInteractions.php @@ -0,0 +1,77 @@ +pdo = new PDO( + "mysql:host=$servername;dbname=$database", $username, $password + ); + } + + public function ScheduleRowForDeletion(string $tableName, string $id) + { + + } + + + + + public function RunSelect(SelectInterface $queryBuilder): array + { + $sth = $this->pdo->prepare($queryBuilder->getStatement()); + $sth->execute($queryBuilder->getBindValues()); + $result = $sth->fetchAll(PDO::FETCH_ASSOC); + return $result; + } + + public function RunOneSelect(SelectInterface $queryBuilder): array + { + $sth = $this->pdo->prepare($queryBuilder->getStatement()); + $sth->execute($queryBuilder->getBindValues()); + $result = $sth->fetchAll(PDO::FETCH_ASSOC); + if(sizeof($result) == 1) return $result[0]; + + echo "invalid single row db response"; + die(); + } + + public function UpdateSingleField(UpdateInterface $queryBuilder): void + { + $sth = $this->pdo->prepare($queryBuilder->getStatement()); + $sth->execute($queryBuilder->getBindValues()); + $result = $sth->fetchAll(PDO::FETCH_ASSOC); + } + + public function RunInsert(InsertInterface $queryBuilder): bool + { + $sth = $this->pdo->prepare($queryBuilder->getStatement()); + return $sth->execute($queryBuilder->getBindValues()); + } + + public function RunDelete(DeleteInterface $queryBuilder): bool + { + $sth = $this->pdo->prepare($queryBuilder->getStatement()); + return $sth->execute($queryBuilder->getBindValues()); + } +} diff --git a/App/Wrappers/SQLQueryBuilderWrapper.php b/App/Wrappers/SQLQueryBuilderWrapper.php new file mode 100644 index 0000000..ae51c99 --- /dev/null +++ b/App/Wrappers/SQLQueryBuilderWrapper.php @@ -0,0 +1,41 @@ +newSelect() + ->from("$table AS T") + ; + return $query + ->cols([ + "T.*", + ]); + } + + public static function SELECT_ONE(string $table, string $id) + { + return self::SELECT(table: $table) + ->where(cond: "ID=:__id__") + ->bindValue(name: "__id__", value: $id) + ->limit(limit: 1) + ; + } + + public static function SELECT_WITH_PARENT_ID(string $table, string $parentIDName, string $parentIDValue) + { + return self::SELECT(table: $table) + ->where(cond: "$parentIDName=:__parent_id__") + ->bindValue(name: "__parent_id__", value: $parentIDValue) + ; + } +} diff --git a/Configuration/Configuration.yaml b/Configuration/Configuration.yaml new file mode 100644 index 0000000..d6e2d2d --- /dev/null +++ b/Configuration/Configuration.yaml @@ -0,0 +1,15 @@ + +Algolia: + AppID: ;ALGOLIA__APP_ID + IndexName: FolkTunes_LIVE + APIKeys: + SearchOnly: ;ALGOLIA__API_SEARCH_KEY + Write: ;ALGOLIA__API_WRITE_KEY + Admin: ;ALGOLIA__API_ADMIN_KEY + +MariaDB: + Host: vps-gen-eng-001.infra.scorpia.network + Port: 3306 + Username: ;MARIADB__USERNAME + Password: ;MARIADB__PASSWORD + Database: FolkTuneFinder_Live diff --git a/LocalStorage/.gitkeep b/LocalStorage/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/LocalStorage/Tunes/.gitkeep b/LocalStorage/Tunes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Localisation/en-GB.yaml b/Localisation/en-GB.yaml new file mode 100644 index 0000000..445f352 --- /dev/null +++ b/Localisation/en-GB.yaml @@ -0,0 +1,160 @@ + +################################################## +# A +################################################## + + + +################################################## +# B +################################################## + + + +################################################## +# C +################################################## + + + +################################################## +# D +################################################## + + + +################################################## +# E +################################################## + + + +################################################## +# F +################################################## + + + +################################################## +# G +################################################## + + + +################################################## +# H +################################################## + + + +################################################## +# I +################################################## + + + +################################################## +# J +################################################## + + + +################################################## +# K +################################################## + + + +################################################## +# L +################################################## + + + +################################################## +# M +################################################## + + + +################################################## +# N +################################################## + + + +################################################## +# O +################################################## + + + +################################################## +# P +################################################## + + + +################################################## +# Q +################################################## + + + +################################################## +# R +################################################## + + + +################################################## +# S +################################################## + + + +################################################## +# T +################################################## + + + +################################################## +# U +################################################## + + + +################################################## +# V +################################################## + + + +################################################## +# W +################################################## + + + +################################################## +# X +################################################## + + + +################################################## +# Y +################################################## + + + +################################################## +# Z +################################################## + + + +################################################## +# _ +################################################## diff --git a/Pages/index.php b/Pages/index.php new file mode 100644 index 0000000..46b7b7d --- /dev/null +++ b/Pages/index.php @@ -0,0 +1,8 @@ +RunOneSelect( + queryBuilder: SQLQueryBuilderWrapper::SELECT_ONE( + table: 'Tunes', + id: $_GET['tune-id'] + ), +); + +TwigWrapper::RenderTwig( + target: "Pages/tune/uuid.html.twig", + arguments: [ + "TuneDetails"=>$tuneDetails, + ] +); + diff --git a/Public/Static/CSS/Elements/HomePage.css b/Public/Static/CSS/Elements/HomePage.css new file mode 100644 index 0000000..966504f --- /dev/null +++ b/Public/Static/CSS/Elements/HomePage.css @@ -0,0 +1,37 @@ + + + +.InnerContent { + margin: 0 auto; + text-align: center; +} + +input[type="text"] { + width: 80%; + padding: 10px; + margin-bottom: 10px; + border: 1px solid #ccc; + border-radius: 4px; +} +#AlgoliaResults { + margin-top: 20px; + text-align: left; +} + +.AlgoliaTuneHit { + padding: 10px; + border: 1px solid #ccc; + border-radius: 4px; + background-color: #fff; + margin-bottom: 10px; +} + +.AlgoliaTuneHit h2 { + +} +.AlgoliaTuneHit .TuneTimeSignature { + +} +.AlgoliaTuneHit .TuneKeySignature { + +} diff --git a/Public/Static/CSS/Elements/_General.css b/Public/Static/CSS/Elements/_General.css new file mode 100644 index 0000000..80ec035 --- /dev/null +++ b/Public/Static/CSS/Elements/_General.css @@ -0,0 +1,21 @@ + +* { + margin: 0; + padding: 0; +} +body{ + font-family: 'Atkinson Hyperlegible', sans-serif; + font-style: normal; + font-weight: 300; + font-smoothing: antialiased; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + font-size: 1rem; + +} +main { + background: var(--colour--main--background); +} + diff --git a/Public/Static/CSS/Mapper.css b/Public/Static/CSS/Mapper.css new file mode 100644 index 0000000..7ce04c2 --- /dev/null +++ b/Public/Static/CSS/Mapper.css @@ -0,0 +1,11 @@ + +/* FONTS */ +@import url('https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&display=swap'); + +/* ICONS */ +@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css'); + +/* ELEMENTS */ +@import "/Static/CSS/Elements/_General.css"; +@import "/Static/CSS/Elements/HomePage.css"; + diff --git a/Public/Static/CSS/Themes/Light.css b/Public/Static/CSS/Themes/Light.css new file mode 100644 index 0000000..5a4260f --- /dev/null +++ b/Public/Static/CSS/Themes/Light.css @@ -0,0 +1,2 @@ +:root { +} diff --git a/Public/Static/JS/AlgoliaInteractions.js b/Public/Static/JS/AlgoliaInteractions.js new file mode 100644 index 0000000..21179c9 --- /dev/null +++ b/Public/Static/JS/AlgoliaInteractions.js @@ -0,0 +1,30 @@ + + + +function searchTunes(query) { + const resultsDiv = document.getElementById("AlgoliaResults"); + + resultsDiv.innerHTML = ""; + + index.search(query).then(({ hits }) => { + if (hits.length > 0) { + hits.forEach(hit => { + const tuneDiv = document.createElement("div"); + tuneDiv.className = "AlgoliaTuneHit"; + tuneDiv.innerHTML = ` +

${hit.title}

+
time signature: ${hit.time_sig}
+
key signature: ${hit.key_sig}
+`; + resultsDiv.appendChild(tuneDiv); + }); + } else { + resultsDiv.innerHTML = "

No tunes found. Try a different search!

"; + } + }).catch(err => { + console.error('Error searching Algolia:', err); + resultsDiv.innerHTML = "

An error occurred. Please try again later.

"; + }); +} + + diff --git a/Public/favicon.png b/Public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..0f849562d10c5f08f2cb3afd24efd08f2761dbe3 GIT binary patch literal 1277 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^(LH;uum9_jayrj)=R+@$_?s zk4|&^es`@*OMyc%@PeZwtB3}#3WqCKP|y+&@jzv7MnxB2=SB?y4-OTTNm_zJLP1>` zA__|tGdnm%?)>^zBfhWa?e6M5hs}(_cI=$HJ^%QF|EAMyKmXhO`}f;(b+@*$&0oNh zbK#=lj>d)q(u^z)4hc++?Z@R97#lfR8 zO)c-PDhCFZDu?o3XW2Y~m$5S7oe>+0Lqi9{G6i-!8D^OV1J=$mhe|`16Ovs*3Jxv) zaXgGgZHrhq1RhQncW#)oP=k@l<;Rnw0t)FGUJVR_cF0QK2ra19ci+V(|M#o~$Amnk zL$eD77#L$Y6S#uzImCPvc%Zc84j<#GhFID%_pM$e_|}%%2~T%)h>=cboP9*amRTWTk=fxlzifYYo>oxso7ZmfzdpI|#nBT5nR{<6 zN^1DUENRE~XY%vC^UEVIHcwnJ<+QJTyn7|bk7m|4-(npCWoO=ZZ|kmhkvw(u71O*U zCsX%v{C2Cfy(eBjv7hlitJLo0iC0-eR!w%V)Z2II@}-nJo%6TVno5bTPnVgUIcHZx z)Y@%{+ft?WTzQqOt9V&TkDvF$J@cuW8+#5HH3oG~p8vz=MR(8iyQ1a2%jd6;o$Ivy zxl)6?bDi6^ui=;wQskW#_Tew$Cv%( z@_*JB2^)O(DEegXwx}k`V|)AQqknC_ul|?ZzUIm^wFR3Ge66Z|{Ke<@yj!i3Ge7Qg zs!rb-Q#Vai;q9Cl);%-3qjIVADDl>=;?_I_m}N||M}vTGkR9im$_tye&-JRy!#__LFY&y|{BvcP;1ne`uBenUzT!Z&ccUY5vP1zF|hp z(kT0k6}3~If6moee5cZO?(I(fM?ZKoyngI?R(DWroy)}w>*aMms&WGpdyP)OC%Ou7u<|o0he8z9HgSS nY84$Avu1g4csP46e4l-!WMRRpPL^lDVvWJm)z4*}Q$iB}plng9 literal 0 HcmV?d00001 diff --git a/Routing/Router.php b/Routing/Router.php new file mode 100644 index 0000000..d625fb3 --- /dev/null +++ b/Routing/Router.php @@ -0,0 +1,29 @@ + + + + + + + {{ "Folk Tunes"|translate }} | {% block PageTitle %}{% endblock %} + + + + + + +
+ +
+

{% block error_code %}{% endblock %}

+

{% block error_message %}{% endblock %}

+ + Back to Home +
+ +
+ + + diff --git a/Templates/Bases/StandardWebPage.html.twig b/Templates/Bases/StandardWebPage.html.twig new file mode 100644 index 0000000..c2f6fe5 --- /dev/null +++ b/Templates/Bases/StandardWebPage.html.twig @@ -0,0 +1,33 @@ + + + + + + + {{ "Folk Tunes"|translate }} | {% block PageTitle %}{% endblock %} + + + + + + + + + + + +
+
+
+ {% block content %}{% endblock %} +
+
+ +
+ + + + \ No newline at end of file diff --git a/Templates/ErrorPages/404.html.twig b/Templates/ErrorPages/404.html.twig new file mode 100644 index 0000000..50d6cd9 --- /dev/null +++ b/Templates/ErrorPages/404.html.twig @@ -0,0 +1,4 @@ +{% extends "/Bases/ErrorPage.html.twig" %} + +{% block error_code %}404{% endblock %} +{% block error_message %}{{ "Page Not Found"|translate }}{% endblock %} diff --git a/Templates/Pages/index.html.twig b/Templates/Pages/index.html.twig new file mode 100644 index 0000000..a957349 --- /dev/null +++ b/Templates/Pages/index.html.twig @@ -0,0 +1,21 @@ +{% extends "/Bases/StandardWebPage.html.twig" %} + +{% block content %} +
+

Folk Tune Search

+ +
+
+ + +{% endblock %} \ No newline at end of file diff --git a/Templates/Pages/tune/uuid.html.twig b/Templates/Pages/tune/uuid.html.twig new file mode 100644 index 0000000..866800e --- /dev/null +++ b/Templates/Pages/tune/uuid.html.twig @@ -0,0 +1,7 @@ +{% extends "/Bases/StandardWebPage.html.twig" %} + +{% block content %} +
+

{{ TuneDetails.Title }}

+
+{% endblock %} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..4a861ae --- /dev/null +++ b/composer.json @@ -0,0 +1,32 @@ +{ + "name": "darksparrow/folktunes", + "description": "Folk Tune Search Engine", + "type": "project", + "license": "proprietary", + "authors": [ + { + "name": "Cerys Lewis", + "email": "cerys@darksparrow.uk", + "role": "Lead Developer" + } + ], + "support": { + "email": "systems@darksparrow.uk" + }, + "autoload": { + "psr-4": { + "App\\": "App/" + } + }, + "require": { + "php": ">=8.2", + + "zircote/swagger-php": "~4.7.9", + + "twig/twig": "3.14.1.0", + + "algolia/algoliasearch-client-php": "*", + "ext-pdo": "*", + "aura/sqlquery": "2.8.1" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..6d607ca --- /dev/null +++ b/composer.lock @@ -0,0 +1,1326 @@ +{ + "_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": "90b41113c9eda0bc1927b5c774613582", + "packages": [ + { + "name": "algolia/algoliasearch-client-php", + "version": "4.13.0", + "source": { + "type": "git", + "url": "https://github.com/algolia/algoliasearch-client-php.git", + "reference": "ddc6ab3710c5527d0637cf991601ac7979197d94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/algolia/algoliasearch-client-php/zipball/ddc6ab3710c5527d0637cf991601ac7979197d94", + "reference": "ddc6ab3710c5527d0637cf991601ac7979197d94", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.0", + "php": ">=8.1", + "psr/http-message": "^1.1 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0 || ^3.5.0", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^11.0", + "vlucas/phpdotenv": "^5.4" + }, + "suggest": { + "guzzlehttp/guzzle": "If you prefer to use Guzzle HTTP client instead of the Http Client implementation provided by the package" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Http/Psr7/functions.php" + ], + "psr-4": { + "Algolia\\AlgoliaSearch\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Algolia Team", + "homepage": "https://alg.li/support" + } + ], + "description": "API powering the features of Algolia.", + "homepage": "https://github.com/algolia/algoliasearch-client-php", + "keywords": [ + "algolia", + "api", + "client", + "php", + "search" + ], + "support": { + "issues": "https://github.com/algolia/algoliasearch-client-php/issues", + "source": "https://github.com/algolia/algoliasearch-client-php/tree/4.13.0" + }, + "time": "2025-01-22T12:32:40+00:00" + }, + { + "name": "aura/sqlquery", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/auraphp/Aura.SqlQuery.git", + "reference": "33a6283a0bc987d6b12e91c73486937ce1047366" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/auraphp/Aura.SqlQuery/zipball/33a6283a0bc987d6b12e91c73486937ce1047366", + "reference": "33a6283a0bc987d6b12e91c73486937ce1047366", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "yoast/phpunit-polyfills": "~1.0" + }, + "suggest": { + "aura/sql": "Provides an extension to the native PDO along with a profiler and connection locator. Use version 2.*." + }, + "type": "library", + "extra": { + "aura": { + "type": "library" + } + }, + "autoload": { + "psr-4": { + "Aura\\SqlQuery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Aura.SqlQuery Contributors", + "homepage": "https://github.com/auraphp/Aura.SqlQuery/contributors" + } + ], + "description": "Object-oriented query builders for MySQL, Postgres, SQLite, and SQLServer; can be used with any database connection library.", + "homepage": "https://github.com/auraphp/Aura.SqlQuery", + "keywords": [ + "database", + "db", + "delete", + "dml", + "insert", + "mysql", + "pdo", + "pgsql", + "postgres", + "postgresql", + "query", + "select", + "sql", + "sql server", + "sqlite", + "sqlserver", + "update" + ], + "support": { + "issues": "https://github.com/auraphp/Aura.SqlQuery/issues", + "source": "https://github.com/auraphp/Aura.SqlQuery/tree/2.8.1" + }, + "time": "2023-04-25T13:25:37+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.10.28", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.2" + }, + "time": "2024-09-05T10:17:24+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "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/v3.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": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.2.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-30T19:00:17+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\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.31.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.2.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": "2024-10-23T06:56:12+00:00" + }, + { + "name": "twig/twig", + "version": "v3.14.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "f405356d20fb43603bcadc8b09bfb676cb04a379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/f405356d20fb43603bcadc8b09bfb676cb04a379", + "reference": "f405356d20fb43603bcadc8b09bfb676cb04a379", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.14.1" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-11-06T18:17:38+00:00" + }, + { + "name": "zircote/swagger-php", + "version": "4.7.16", + "source": { + "type": "git", + "url": "https://github.com/zircote/swagger-php.git", + "reference": "21366a8c43819457d458e772a4e86d0df9233b5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/21366a8c43819457d458e772a4e86d0df9233b5e", + "reference": "21366a8c43819457d458e772a4e86d0df9233b5e", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.7 || ^2.0", + "ext-json": "*", + "php": ">=7.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^2 || ^3", + "symfony/finder": ">=2.2", + "symfony/yaml": ">=3.3" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "friendsofphp/php-cs-fixer": "^2.17 || ^3.0", + "phpstan/phpstan": "^1.6", + "phpunit/phpunit": ">=8", + "vimeo/psalm": "^4.23" + }, + "bin": [ + "bin/openapi" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenApi\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Robert Allen", + "email": "zircote@gmail.com" + }, + { + "name": "Bob Fanger", + "email": "bfanger@gmail.com", + "homepage": "https://bfanger.nl" + }, + { + "name": "Martin Rademacher", + "email": "mano@radebatz.net", + "homepage": "https://radebatz.net" + } + ], + "description": "swagger-php - Generate interactive documentation for your RESTful API using phpdoc annotations", + "homepage": "https://github.com/zircote/swagger-php/", + "keywords": [ + "api", + "json", + "rest", + "service discovery" + ], + "support": { + "issues": "https://github.com/zircote/swagger-php/issues", + "source": "https://github.com/zircote/swagger-php/tree/4.7.16" + }, + "time": "2023-11-30T21:47:39+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.2", + "ext-pdo": "*" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +}