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 = `
+
+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 0000000..0f84956
Binary files /dev/null and b/Public/favicon.png differ
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 %}
+
+
+
+{% 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"
+}