diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5758d1d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +# https://help.github.com/en/categories/automating-your-workflow-with-github-actions + +on: + - pull_request + - push + +name: CI + +jobs: + + tests: + name: Tests on PHP ${{ matrix.php }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['7.4'] + steps: + - uses: actions/checkout@v2 + + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + tools: composer + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install dependencies + run: composer install --no-interaction --no-ansi --no-progress + + - name: Run tests + run: vendor/bin/phpunit diff --git a/.gitignore b/.gitignore index 63a736b..e1c396e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ .vscode .phel-repl-history +.phpunit.result.cache + +/content/documentation/api.md /public +/static/api_search.js /vendor diff --git a/README.md b/README.md index 5c072a1..2fa938e 100644 --- a/README.md +++ b/README.md @@ -15,5 +15,5 @@ zola build # build & publish ```bash composer install # install phel as composer dependency -php build/api-page.php > content/documentation/api.md +composer build # build the API documentation page & the API search index ``` diff --git a/build/api-page.php b/build/api-page.php index 0496575..b4b1896 100644 --- a/build/api-page.php +++ b/build/api-page.php @@ -2,15 +2,11 @@ declare(strict_types=1); -use Gacela\Framework\Gacela; -use Phel\Lang\Keyword; -use Phel\Lang\TypeFactory; -use Phel\Run\RunFacade; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Output\ConsoleOutput; - require __DIR__ . '/../vendor/autoload.php'; +use Gacela\Framework\Gacela; +use PhelDocBuild\FileGenerator\Facade; + Gacela::bootstrap(__DIR__, [ 'config' => [ 'type' => 'php', @@ -18,34 +14,7 @@ 'path_local' => 'phel-config-local.php', ], ]); -$rf = new RunFacade(); -$rf->getRunCommand()->run(new ArrayInput(['path' => __DIR__ . '/src/doc.phel']), new ConsoleOutput()); - -echo "+++\n"; -echo "title = \"API\"\n"; -echo "weight = 110\n"; -echo "template = \"page-api.html\"\n"; -echo "+++\n\n"; - -$normalizedData = []; -foreach ($GLOBALS['__phel'] as $ns => $functions) { - $normalizedNs = str_replace('phel\\', '', $ns); - $moduleName = $normalizedNs === 'core' ? '' : $normalizedNs . '/'; - foreach ($functions as $fnName => $fn) { - $fullFnName = $moduleName . $fnName; - - $normalizedData[$fullFnName] = $GLOBALS['__phel_meta'][$ns][$fnName] ?? TypeFactory::getInstance()->emptyPersistentMap(); - } -} - -ksort($normalizedData); -foreach ($normalizedData as $fnName => $meta) { - $doc = $meta[Keyword::create('doc')] ?? ''; - $isPrivate = $meta[Keyword::create('private')] ?? false; - if (!$isPrivate) { - echo "## `$fnName`\n\n"; - echo $doc; - echo "\n\n"; - } -} +$fileGeneratorFacade = new Facade(); +$fileGeneratorFacade->generateMdPage(); +$fileGeneratorFacade->generateApiSearch(); diff --git a/build/phel-config.php b/build/phel-config.php index 6ab38aa..51ce67b 100644 --- a/build/phel-config.php +++ b/build/phel-config.php @@ -1,7 +1,7 @@ ['/src'], + 'src-dirs' => ['/src/phel'], 'test-dirs' => [], 'vendor-dir' => '/../vendor' ]; diff --git a/build/src/doc.phel b/build/src/phel/doc.phel similarity index 100% rename from build/src/doc.phel rename to build/src/phel/doc.phel diff --git a/build/src/php/FileGenerator/Config.php b/build/src/php/FileGenerator/Config.php new file mode 100644 index 0000000..75bd7ac --- /dev/null +++ b/build/src/php/FileGenerator/Config.php @@ -0,0 +1,15 @@ +set(self::FACADE_PHEL_RUN, fn() => new RunFacade()); + } +} diff --git a/build/src/php/FileGenerator/Domain/ApiSearchGenerator.php b/build/src/php/FileGenerator/Domain/ApiSearchGenerator.php new file mode 100644 index 0000000..f62e0ac --- /dev/null +++ b/build/src/php/FileGenerator/Domain/ApiSearchGenerator.php @@ -0,0 +1,51 @@ +', '<', '!']; + + /** + * @return array + */ + public function generateSearchIndex(array $groupNormalizedData): array + { + /** + * Zola ignores the especial chars, and uses instead a number. This variable keep track + * of the appearances and uses an autoincrement number to follow the proper link. + * + * For example, consider the two functions: `table` and `table?` + * They belong to the same group `table`, and their anchor will be such as: + * table -> table + * table? -> table-1 + */ + $groupFnNameAppearances = []; + + $result = []; + foreach ($groupNormalizedData as $groupKey => $values) { + $groupFnNameAppearances[$groupKey] = 0; + + foreach ($values as ['fnName' => $fnName, 'fnSignature' => $fnSignature, 'desc' => $desc]) { + if ($groupFnNameAppearances[$groupKey] === 0) { + $anchor = $groupKey; + $groupFnNameAppearances[$groupKey]++; + } else { + $sanitizedFnName = str_replace(['/', ...self::SPECIAL_ENDING_CHARS], ['-', ''], $fnName); + $anchor = rtrim($sanitizedFnName, '-') . '-' . $groupFnNameAppearances[$groupKey]++; + } + + $result[] = [ + 'fnName' => $fnName, + 'fnSignature' => $fnSignature, + 'desc' => $desc, + 'anchor' => $anchor, + ]; + } + } + + return $result; + } +} diff --git a/build/src/php/FileGenerator/Domain/MdPageRenderer.php b/build/src/php/FileGenerator/Domain/MdPageRenderer.php new file mode 100644 index 0000000..6c39b31 --- /dev/null +++ b/build/src/php/FileGenerator/Domain/MdPageRenderer.php @@ -0,0 +1,32 @@ +output = $output; + } + + public function renderMdPage(array $groupNormalizedData): void + { + $this->output->writeln("+++"); + $this->output->writeln("title = \"API\""); + $this->output->writeln("weight = 110"); + $this->output->writeln("template = \"page-api.html\""); + $this->output->writeln("+++\n"); + + foreach ($groupNormalizedData as $values) { + foreach ($values as ['fnName' => $fnName, 'doc' => $doc]) { + $this->output->writeln("## `$fnName`\n"); + $this->output->write($doc); + $this->output->writeln("\n"); + } + } + } +} diff --git a/build/src/php/FileGenerator/Domain/OutputInterface.php b/build/src/php/FileGenerator/Domain/OutputInterface.php new file mode 100644 index 0000000..62dcde8 --- /dev/null +++ b/build/src/php/FileGenerator/Domain/OutputInterface.php @@ -0,0 +1,12 @@ + + */ + public function getNormalizedPhelFunctions(): array; +} diff --git a/build/src/php/FileGenerator/Domain/PhelFnNormalizer.php b/build/src/php/FileGenerator/Domain/PhelFnNormalizer.php new file mode 100644 index 0000000..27f816d --- /dev/null +++ b/build/src/php/FileGenerator/Domain/PhelFnNormalizer.php @@ -0,0 +1,68 @@ +phelFnLoader = $phelFnLoader; + } + + /** + * @return array + */ + public function getNormalizedGroupedPhelFns(): array + { + $normalizedData = $this->phelFnLoader->getNormalizedPhelFunctions(); + + $result = []; + foreach ($normalizedData as $fnName => $meta) { + $isPrivate = $meta[Keyword::create('private')] ?? false; + if ($isPrivate) { + continue; + } + + $groupKey = preg_replace( + '/[^a-zA-Z0-9\-]+/', + '', + str_replace('/', '-', $fnName) + ); + + $doc = $meta[Keyword::create('doc')] ?? ''; + $pattern = '#(```phel\n(?.*)\n```\n)?(?.*)#s'; + preg_match($pattern, $doc, $matches); + + $result[strtolower(rtrim($groupKey, '-'))][] = [ + 'fnName' => $fnName, + 'doc' => $meta[Keyword::create('doc')] ?? '', + 'fnSignature' => $matches['fnSignature'] ?? '', + 'desc' => $this->formatDescription($matches['desc'] ?? ''), + ]; + } + + foreach ($result as $values) { + usort($values, static fn(array $a, array $b) => $a['fnName'] <=> $b['fnName']); + } + + return $result; + } + + /** + * The $desc is in Markdown format, the regex transforms links `[printf](https://...)` into `printf`. + */ + private function formatDescription(string $desc): string + { + return preg_replace( + '#\[([^\]]+)\]\(([^\)]+)\)#', + '\1', + $desc + ); + } +} diff --git a/build/src/php/FileGenerator/Facade.php b/build/src/php/FileGenerator/Facade.php new file mode 100644 index 0000000..c515072 --- /dev/null +++ b/build/src/php/FileGenerator/Facade.php @@ -0,0 +1,27 @@ +getFactory() + ->createDocFileGenerator() + ->renderMdPage(); + } + + public function generateApiSearch(): void + { + $this->getFactory() + ->createDocFileGenerator() + ->generateApiSearch(); + } +} diff --git a/build/src/php/FileGenerator/Factory.php b/build/src/php/FileGenerator/Factory.php new file mode 100644 index 0000000..8672b51 --- /dev/null +++ b/build/src/php/FileGenerator/Factory.php @@ -0,0 +1,75 @@ +createMdPageRenderer(), + $this->createPhelFnNormalizer(), + $this->createApiSearchGenerator(), + $this->getConfig()->getSrcDir() + ); + } + + private function createMdPageRenderer(): MdPageRenderer + { + return new MdPageRenderer($this->createOutput()); + } + + private function createOutput(): OutputInterface + { + return new class() implements OutputInterface { + + public function write(string $line): void + { + echo $line; + } + + public function writeln(string $line): void + { + echo $line . PHP_EOL; + } + }; + } + + private function createPhelFnNormalizer(): PhelFnNormalizer + { + return new PhelFnNormalizer($this->createPhelFnLoader()); + } + + private function createPhelFnLoader(): PhelFnLoaderInterface + { + return new PhelFnLoader( + $this->getRunFacade(), + $this->getConfig()->getSrcDir() + ); + } + + private function createApiSearchGenerator(): ApiSearchGenerator + { + return new ApiSearchGenerator(); + } + + private function getRunFacade(): RunFacadeInterface + { + return $this->getProvidedDependency(DependencyProvider::FACADE_PHEL_RUN); + } +} diff --git a/build/src/php/FileGenerator/Infrastructure/DocFileGenerator.php b/build/src/php/FileGenerator/Infrastructure/DocFileGenerator.php new file mode 100644 index 0000000..7bacc86 --- /dev/null +++ b/build/src/php/FileGenerator/Infrastructure/DocFileGenerator.php @@ -0,0 +1,51 @@ +mdPageRenderer = $mdPageRenderer; + $this->phelFnNormalizer = $phelFnNormalizer; + $this->apiSearchGenerator = $apiSearchGenerator; + $this->srcDir = $srcDir; + } + + public function renderMdPage(): void + { + $groupedPhelFns = $this->phelFnNormalizer->getNormalizedGroupedPhelFns(); + + $this->mdPageRenderer->renderMdPage($groupedPhelFns); + } + + public function generateApiSearch(): void + { + $groupedPhelFns = $this->phelFnNormalizer->getNormalizedGroupedPhelFns(); + + $searchIndex = $this->apiSearchGenerator->generateSearchIndex($groupedPhelFns); + + file_put_contents( + $this->srcDir . '/../../static/api_search.js', + "window.searchIndexApi = " . json_encode($searchIndex) + ); + } + +} diff --git a/build/src/php/FileGenerator/Infrastructure/PhelFnLoader.php b/build/src/php/FileGenerator/Infrastructure/PhelFnLoader.php new file mode 100644 index 0000000..833d61f --- /dev/null +++ b/build/src/php/FileGenerator/Infrastructure/PhelFnLoader.php @@ -0,0 +1,80 @@ +runFacade = $runFacade; + $this->srcDir = $srcDir; + } + + /** + * @return array + */ + public function getNormalizedPhelFunctions(): array + { + $this->loadAllPhelFunctions(); + + /** @var array $normalizedData */ + $normalizedData = []; + foreach ($this->getAllPhelFunctions() as $ns => $functions) { + $normalizedNs = str_replace('phel\\', '', $ns); + $moduleName = $normalizedNs === 'core' ? '' : $normalizedNs . '/'; + foreach ($functions as $fnName => $fn) { + $fullFnName = $moduleName . $fnName; + + $normalizedData[$fullFnName] = $this->getPhelMeta($ns, $fnName); + } + } + ksort($normalizedData); + + return $normalizedData; + } + + private function loadAllPhelFunctions(): void + { + if (self::$wasRunCommandExecuted) { + return; + } + + $this->runFacade->getRunCommand()->run( + new ArrayInput(['path' => $this->srcDir . '/phel/doc.phel']), + new ConsoleOutput() + ); + + self::$wasRunCommandExecuted = true; + } + + /** + * @return array> + */ + private function getAllPhelFunctions(): array + { + return $GLOBALS['__phel']; + } + + private function getPhelMeta(string $ns, string $fnName): PersistentMapInterface + { + return $GLOBALS['__phel_meta'][$ns][$fnName] + ?? TypeFactory::getInstance()->emptyPersistentMap(); + } +} diff --git a/build/tests/php/FileGenerator/ApiSearchGeneratorTest.php b/build/tests/php/FileGenerator/ApiSearchGeneratorTest.php new file mode 100644 index 0000000..56cdc59 --- /dev/null +++ b/build/tests/php/FileGenerator/ApiSearchGeneratorTest.php @@ -0,0 +1,219 @@ +generator = new ApiSearchGenerator(); + } + + public function test_generate_search_index_one_item(): void + { + $actual = $this->generator->generateSearchIndex([ + 'table' => [ + [ + 'fnName' => 'table?', + 'fnSignature' => '(table? x)', + 'desc' => 'doc for table?', + ], + ], + ]); + + $expected = [ + [ + 'fnName' => 'table?', + 'fnSignature' => '(table? x)', + 'desc' => 'doc for table?', + 'anchor' => 'table', + ], + ]; + + self::assertEquals($expected, $actual); + } + + public function test_multiple_items_in_different_groups(): void + { + $actual = $this->generator->generateSearchIndex([ + 'table' => [ + [ + 'fnName' => 'table', + 'fnSignature' => '(table & xs)', + 'desc' => 'doc for table', + ], + ], + 'not' => [ + [ + 'fnName' => 'not', + 'fnSignature' => '(not x)', + 'desc' => 'doc for not', + ], + ], + ]); + + $expected = [ + [ + 'fnName' => 'table', + 'fnSignature' => '(table & xs)', + 'desc' => 'doc for table', + 'anchor' => 'table', + ], + [ + 'fnName' => 'not', + 'fnSignature' => '(not x)', + 'desc' => 'doc for not', + 'anchor' => 'not', + ], + ]; + + self::assertEquals($expected, $actual); + } + + public function test_multiple_items_in_the_same_group(): void + { + $actual = $this->generator->generateSearchIndex([ + 'table' => [ + [ + 'fnName' => 'table', + 'fnSignature' => '(table & xs)', + 'desc' => 'doc for table', + ], + [ + 'fnName' => 'table?', + 'fnSignature' => '(table? x)', + 'desc' => 'doc for table?', + ], + ], + ]); + + $expected = [ + [ + 'fnName' => 'table', + 'fnSignature' => '(table & xs)', + 'desc' => 'doc for table', + 'anchor' => 'table', + ], + [ + 'fnName' => 'table?', + 'fnSignature' => '(table? x)', + 'desc' => 'doc for table?', + 'anchor' => 'table-1', + ], + ]; + + self::assertEquals($expected, $actual); + } + + public function test_fn_name_with_slash_in_the_middle(): void + { + $actual = $this->generator->generateSearchIndex([ + 'http-response' => [ + [ + 'fnName' => 'http/response', + 'fnSignature' => '', + 'desc' => '', + ], + [ + 'fnName' => 'http/response?', + 'fnSignature' => '', + 'desc' => '', + ], + ], + ]); + + $expected = [ + [ + 'fnName' => 'http/response', + 'fnSignature' => '', + 'desc' => '', + 'anchor' => 'http-response', + ], + [ + 'fnName' => 'http/response?', + 'fnSignature' => '', + 'desc' => '', + 'anchor' => 'http-response-1', + ], + ]; + + self::assertEquals($expected, $actual); + } + + public function test_fn_name_ending_with_minus(): void + { + $actual = $this->generator->generateSearchIndex([ + 'defn' => [ + [ + 'fnName' => 'defn', + 'fnSignature' => '', + 'desc' => '', + ], + [ + 'fnName' => 'defn-', + 'fnSignature' => '', + 'desc' => '', + ], + ], + ]); + + $expected = [ + [ + 'fnName' => 'defn', + 'fnSignature' => '', + 'desc' => '', + 'anchor' => 'defn', + ], + [ + 'fnName' => 'defn-', + 'fnSignature' => '', + 'desc' => '', + 'anchor' => 'defn-1', + ], + ]; + + self::assertEquals($expected, $actual); + } + + public function test_fn_name_with_upper_case(): void + { + $actual = $this->generator->generateSearchIndex([ + 'nan' => [ + [ + 'fnName' => 'NAN', + 'fnSignature' => '', + 'desc' => '', + ], + [ + 'fnName' => 'nan?', + 'fnSignature' => '', + 'desc' => '', + ], + ], + ]); + + $expected = [ + [ + 'fnName' => 'NAN', + 'fnSignature' => '', + 'desc' => '', + 'anchor' => 'nan', + ], + [ + 'fnName' => 'nan?', + 'fnSignature' => '', + 'desc' => '', + 'anchor' => 'nan-1', + ], + ]; + + self::assertEquals($expected, $actual); + } +} diff --git a/build/tests/php/FileGenerator/PhelFnNormalizerTest.php b/build/tests/php/FileGenerator/PhelFnNormalizerTest.php new file mode 100644 index 0000000..a200942 --- /dev/null +++ b/build/tests/php/FileGenerator/PhelFnNormalizerTest.php @@ -0,0 +1,44 @@ +createMock(PhelFnLoaderInterface::class); + $phelFnLoader->method('getNormalizedPhelFunctions')->willReturn([ + 'test/table' => $this->createMock(PersistentMapInterface::class), + 'test/table?' => $this->createMock(PersistentMapInterface::class), + ]); + + $generator = new PhelFnNormalizer($phelFnLoader); + $actual = $generator->getNormalizedGroupedPhelFns(); + + $expected = [ + 'test-table' => [ + [ + 'fnName' => 'test/table', + 'doc' => '', + 'fnSignature' => '', + 'desc' => '', + ], + [ + 'fnName' => 'test/table?', + 'doc' => '', + 'fnSignature' => '', + 'desc' => '', + ], + ], + ]; + + self::assertEquals($expected, $actual); + } +} diff --git a/composer.json b/composer.json index 5ab5d82..f0ae4e7 100644 --- a/composer.json +++ b/composer.json @@ -4,6 +4,27 @@ "homepage": "https://phel-lang.org/", "license": "MIT", "require": { - "phel-lang/phel-lang": "^0.5" + "ext-json": "*", + "phel-lang/phel-lang": "^0.5", + "gacela-project/gacela": "^0.10.0" + }, + "require-dev": { + "roave/security-advisories": "dev-latest", + "phpunit/phpunit": "^9.5", + "symfony/var-dumper": "^5.4" + }, + "autoload": { + "psr-4": { + "PhelDocBuild\\": "build/src/php/" + } + }, + "autoload-dev": { + "psr-4": { + "PhelDocBuildTests\\": "build/tests/php" + } + }, + "scripts": { + "build": "php build/api-page.php > content/documentation/api.md", + "test": "./vendor/bin/phpunit" } } diff --git a/composer.lock b/composer.lock index 4757671..c44be26 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4c756196e025ce979c9c843a113aaca1", + "content-hash": "53aa7ace909f9df35ca5bda2276c5a0e", "packages": [ { "name": "gacela-project/gacela", @@ -243,16 +243,16 @@ }, { "name": "symfony/console", - "version": "v5.4.1", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9130e1a0fc93cb0faadca4ee917171bd2ca9e5f4" + "reference": "a2c6b7ced2eb7799a35375fb9022519282b5405e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9130e1a0fc93cb0faadca4ee917171bd2ca9e5f4", - "reference": "9130e1a0fc93cb0faadca4ee917171bd2ca9e5f4", + "url": "https://api.github.com/repos/symfony/console/zipball/a2c6b7ced2eb7799a35375fb9022519282b5405e", + "reference": "a2c6b7ced2eb7799a35375fb9022519282b5405e", "shasum": "" }, "require": { @@ -322,7 +322,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.1" + "source": "https://github.com/symfony/console/tree/v5.4.2" }, "funding": [ { @@ -338,7 +338,7 @@ "type": "tidelift" } ], - "time": "2021-12-09T11:22:43+00:00" + "time": "2021-12-20T16:11:12+00:00" }, { "name": "symfony/deprecation-contracts", @@ -409,21 +409,24 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "30885182c981ab175d4d034db0f6f469898070ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", + "reference": "30885182c981ab175d4d034db0f6f469898070ab", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, @@ -468,7 +471,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0" }, "funding": [ { @@ -484,20 +487,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-10-20T20:35:02+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", "shasum": "" }, "require": { @@ -549,7 +552,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0" }, "funding": [ { @@ -565,11 +568,11 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2021-11-23T21:10:46+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -633,7 +636,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0" }, "funding": [ { @@ -653,21 +656,24 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, @@ -713,7 +719,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0" }, "funding": [ { @@ -729,20 +735,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2021-11-30T18:21:41+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", "shasum": "" }, "require": { @@ -792,7 +798,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0" }, "funding": [ { @@ -808,20 +814,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-06-05T21:20:04+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", "shasum": "" }, "require": { @@ -875,7 +881,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0" }, "funding": [ { @@ -891,7 +897,7 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2021-09-13T13:58:33+00:00" }, { "name": "symfony/service-contracts", @@ -978,16 +984,16 @@ }, { "name": "symfony/string", - "version": "v5.4.0", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d" + "reference": "e6a5d5ecf6589c5247d18e0e74e30b11dfd51a3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d", - "reference": "9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d", + "url": "https://api.github.com/repos/symfony/string/zipball/e6a5d5ecf6589c5247d18e0e74e30b11dfd51a3d", + "reference": "e6a5d5ecf6589c5247d18e0e74e30b11dfd51a3d", "shasum": "" }, "require": { @@ -1044,7 +1050,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.0" + "source": "https://github.com/symfony/string/tree/v5.4.2" }, "funding": [ { @@ -1060,16 +1066,2504 @@ "type": "tidelift" } ], - "time": "2021-11-24T10:02:00+00:00" + "time": "2021-12-16T21:52:00+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-11-10T18:47:58+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-11-13T09:40:50+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.13.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + }, + "time": "2021-11-30T19:35:32+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "bae7c545bef187884426f042434e561ab1ddb182" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, + "time": "2021-02-23T14:00:09+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0" + }, + "time": "2022-01-04T19:58:01+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.2", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0 || ^7.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + }, + "time": "2021-12-08T12:19:24+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687", + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.13.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.10" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-05T09:12:13+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "2406855036db1102126125537adb1406f7242fdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2406855036db1102126125537adb1406f7242fdd", + "reference": "2406855036db1102126125537adb1406f7242fdd", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.7", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^2.3.4", + "sebastian/version": "^3.0.2" + }, + "require-dev": { + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0.1" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ], + "files": [ + "src/Framework/Assert/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.11" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-25T07:07:57+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-latest", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "38da7ef14348ff26d7c415c4ed18b82db07fe199" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/38da7ef14348ff26d7c415c4ed18b82db07fe199", + "reference": "38da7ef14348ff26d7c415c4ed18b82db07fe199", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "akaunting/akaunting": "<2.1.13", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": "<4.5.4", + "billz/raspap-webgui": "<=2.6.6", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bolt/bolt": "<3.7.2", + "bolt/core": "<4.1.13", + "bottelet/flarepoint": "<2.2.1", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cachethq/cachet": "<2.5.1", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cardgate/magento2": "<2.0.33", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", + "centreon/centreon": "<20.10.7", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<=3.0.6", + "codeigniter4/framework": "<4.1.6", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.23|>=2-alpha.1,<2.1.9", + "concrete5/concrete5": "<8.5.5", + "concrete5/core": "<8.5.7", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", + "contao/listing-bundle": ">=4,<4.4.8", + "craftcms/cms": "<3.7.14", + "croogo/croogo": "<3.0.7", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "directmailteam/direct-mail": "<5.2.4", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<=14.0.4|>= 3.3.beta1, < 13.0.2", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "dweeves/magmi": "<=0.7.24", + "ecodev/newsletter": "<=4", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<=1.5.25", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=0.1.3", + "firebase/php-jwt": "<2", + "flarum/core": ">=1,<=1.0.1", + "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", + "flarum/tags": "<=0.1-beta.13", + "fluidtypo3/vhs": "<5.1.1", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<=5.9.2", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<8.1.1", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "froala/wysiwyg-editor": "<3.2.7", + "fuel/core": "<1.8.1", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "getgrav/grav": "<=1.7.24", + "getkirby/cms": "<3.5.8", + "getkirby/panel": "<2.5.14", + "gilacms/gila": "<=1.11.4", + "globalpayments/php-sdk": "<2", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<5.6.5", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "helloxz/imgurl": "<=2.31", + "hillelcoren/invoice-ninja": "<5.3.35", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "ibexa/post-install": "<=1.0.4", + "icecoder/icecoder": "<=8", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "impresscms/impresscms": "<=1.4.2", + "in2code/femanager": "<5.5.1|>=6,<6.3.1", + "intelliants/subrion": "<=4.2.1", + "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "joomla/archive": "<1.1.10", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kevinpapst/kimai2": "<1.16.7", + "kitodo/presentation": "<3.1.2", + "klaviyo/magento2-extension": ">=1,<3", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-http": "<2.14.2", + "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=5.8", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<=21.11", + "limesurvey/limesurvey": "<3.27.19", + "livewire/livewire": ">2.2.4,<2.2.6", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mautic/core": "<4|= 2.13.1", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "microweber/microweber": "<1.2.8", + "miniorange/miniorange-saml": "<1.4.3", + "mittwald/typo3_forum": "<1.2.1", + "modx/revolution": "<2.8", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10-beta,<3.10.2", + "namshi/jose": "<2.2", + "neoan3-apps/template": "<1.1.1", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<=2.1.27.36", + "nukeviet/nukeviet": "<4.3.4", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", + "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.473|>=1.1,<1.1.6|>=2.1,<2.1.12", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "opencart/opencart": "<=3.0.3.2", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", + "orchid/platform": ">=9,<9.4.4", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.14", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", + "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", + "phpservermon/phpservermon": "<=3.5.2", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<10.2.7", + "pocketmine/pocketmine-mp": "<4.0.6", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": ">=1.7.5,<=1.7.8.1", + "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<1.6.6", + "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6-beta", + "rainlab/debugbar-plugin": "<3.1", + "remdex/livehelperchat": "<3.91", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/core": "<=6.4.6", + "shopware/platform": "<=6.4.6", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<5.7.7", + "showdoc/showdoc": "<2.10", + "silverstripe/admin": ">=1,<1.8.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.7.4", + "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.43|>=4,<4.0.3", + "snipe/snipe-it": "<5.3.5", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<21.12.1", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.59", + "subrion/cms": "<=4.2.1", + "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0,<4", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5|>=5.2,<5.3.12", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11|>=5.3,<5.3.12", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": ">=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "tinymce/tinymce": "<5.10", + "titon/framework": ">=0,<9.9.99", + "topthink/framework": "<6.0.9", + "topthink/think": "<=6.0.9", + "topthink/thinkphp": "<=3.2.3", + "tribalsystems/zenario": "<8.8.53370", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "unisharp/laravel-filemanager": "<=2.3", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "vanilla/safecurl": "<0.9.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vrana/adminer": "<4.7.9", + "wallabag/tcpdf": "<6.2.22", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4", + "webcoast/deferred-image-processing": "<1.0.2", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "wp-cli/wp-cli": "<2.5", + "yetiforce/yetiforce-crm": "<=6.3", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.43", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" + }, + "default-branch": true, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2022-01-14T21:13:43+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:52:38+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-11-11T14:18:36+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-06-11T13:31:12+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-06-15T12:49:02+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "1b56c32c3679002b3a42384a580e16e2600f41c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1b56c32c3679002b3a42384a580e16e2600f41c1", + "reference": "1b56c32c3679002b3a42384a580e16e2600f41c1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.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": "2021-12-29T10:10:35+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" } ], - "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, - "platform": [], + "platform": { + "ext-json": "*" + }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.2.0" } diff --git a/content/documentation/api.md b/content/documentation/api.md deleted file mode 100644 index 22c814d..0000000 --- a/content/documentation/api.md +++ /dev/null @@ -1,1668 +0,0 @@ -+++ -title = "API" -weight = 110 -template = "page-api.html" -+++ - -## `%` - -```phel -(% dividend divisor) -``` -Return the remainder of `dividend` / `divisor`. - -## `*` - -```phel -(* & xs) -``` -Returns the product of all elements in `xs`. All elements in `xs` must be -numbers. If `xs` is empty, return 1. - -## `**` - -```phel -(** a x) -``` -Return `a` to the power of `x`. - -## `*compile-mode*` - - - -## `*ns*` - -Returns the namespace in the current scope. - -## `+` - -```phel -(+ & xs) -``` -Returns the sum of all elements in `xs`. All elements `xs` must be numbers. - If `xs` is empty, return 0. - -## `-` - -```phel -(- & xs) -``` -Returns the difference of all elements in `xs`. If `xs` is empty, return 0. If `xs` - has one element, return the negative value of that element. - -## `->` - -```phel -(-> x & forms) -``` -Threads the expr through the forms. Inserts `x` as the second item - in the first from, making a list of it if it is not a list already. - If there are more froms, inserts the first form as the second item in - the second form, etc. - -## `->>` - -```phel -(->> x & forms) -``` -Threads the expr through the forms. Inserts `x` as the - last item in the first form, making a list of it if it is not a - list already. If there are more forms, inserts the first form as the - last item in second form, etc. - -## `/` - -```phel -(/ & xs) -``` -Returns the nominator divided by all the denominators. If `xs` is empty, -returns 1. If `xs` has one value, returns the reciprocal of x. - -## `<` - -```phel -(< a & more) -``` -Checks if each argument is strictly less than the following argument. Returns a boolean. - -## `<=` - -```phel -(<= a & more) -``` -Checks if each argument is less than or equal to the following argument. Returns a boolean. - -## `<=>` - -```phel -(<=> a b) -``` -Alias for the spaceship PHP operator in ascending order. Returns an int. - -## `=` - -```phel -(= a & more) -``` -Checks if all values are equal. Same as `a == b` in PHP. - -## `>` - -```phel -(> a & more) -``` -Checks if each argument is strictly greater than the following argument. Returns a boolean. - -## `>=` - -```phel -(>= a & more) -``` -Checks if each argument is greater than or equal to the following argument. Returns a boolean. - -## `>=<` - -```phel -(>=< a b) -``` -Alias for the spaceship PHP operator in descending order. Returns an int. - -## `NAN` - -Constant for Not a Number (NAN) values. - -## `all?` - -```phel -(all? pred xs) -``` -Returns true if `(pred x)` is logical true for every `x` in `xs`, else false. - -## `and` - -```phel -(and & args) -``` -Evaluates each expression one at a time, from left to right. If a form -returns logical false, and returns that value and doesn't evaluate any of the -other expressions, otherwise it returns the value of the last expression. -Calling the and function without arguments returns true. - -## `argv` - -Array of arguments passed to script. - -## `array` - -```phel -(array & xs) -``` -Creates a new Array. If no argument is provided, an empty Array is created. - -## `array?` - -```phel -(array? x) -``` -Returns true if `x` is a array, false otherwise. - -## `as->` - -```phel -(as-> expr name & forms) -``` -Binds `name` to `expr`, evaluates the first form in the lexical context - of that binding, then binds name to that result, repeating for each - successive form, returning the result of the last form. - -## `associative?` - -```phel -(associative? x) -``` -Returns true if `x` is associative data structure, false otherwise. - -## `binding` - -```phel -(binding bindings & body) -``` -Temporary redefines definitions while executing the body. - The value will be reset after the body was executed. - -## `bit-and` - -```phel -(bit-and x y & args) -``` -Bitwise and - -## `bit-clear` - -```phel -(bit-clear x n) -``` -Clear bit an index `n` - -## `bit-flip` - -```phel -(bit-flip x n) -``` -Flip bit at index `n` - -## `bit-not` - -```phel -(bit-not x) -``` -Bitwise complement - -## `bit-or` - -```phel -(bit-or x y & args) -``` -Bitwise or - -## `bit-set` - -```phel -(bit-set x n) -``` -Set bit an index `n` - -## `bit-shift-left` - -```phel -(bit-shift-left x n) -``` -Bitwise shift left - -## `bit-shift-right` - -```phel -(bit-shift-right x n) -``` -Bitwise shift right - -## `bit-test` - -```phel -(bit-test x n) -``` -Test bit at index `n` - -## `bit-xor` - -```phel -(bit-xor x y & args) -``` -Bitwise xor - -## `boolean?` - -```phel -(boolean? x) -``` -Returns true if `x` is a boolean, false otherwise. - -## `case` - -```phel -(case e & pairs) -``` -Takes an expression `e` and a set of test-content/expression pairs. First - evaluates `e` and the then finds the first pair where the test-constant matches - the result of `e`. The associated expression is then evaluated and returned. - If no matches can be found a final last expression can be provided that is - than evaluated and return. Otherwise, nil is returned. - -## `comment` - -```phel -(comment &) -``` -Ignores the body of the comment. - -## `comp` - -```phel -(comp & fs) -``` -Takes a list of functions and returns a function that is the composition - of those functions. - -## `compare` - -```phel -(compare x y) -``` -An integer less than, equal to, or greater than zero when `x` is less than, - equal to, or greater than `y`, respectively. - -## `complement` - -```phel -(complement f) -``` -Returns a function that takes the same arguments as `f` and returns the opposite truth value. - -## `concat` - -```phel -(concat arr & xs) -``` -Concatenates multiple sequential data structures. - -## `cond` - -```phel -(cond & pairs) -``` -Takes a set of test/expression pairs. Evaluates each test one at a time. - If a test returns logically true, the expression is evaluated and return. - If no test matches a final last expression can be provided that is than - evaluated and return. Otherwise, nil is returned. - -## `cons` - -```phel -(cons x xs) -``` -Prepends `x` to the beginning of `xs`. - -## `contains?` - -```phel -(contains? coll key) -``` -Returns true if key is present in the given collection, otherwise returns false. - -## `count` - -```phel -(count xs) -``` -Counts the number of elements in a sequence. Can be used on everything that -implement the PHP Countable interface. - -## `dec` - -```phel -(dec x) -``` -Decrements `x` by one. - -## `declare` - -```phel -(declare name) -``` -Declare a global symbol before it is defined. - -## `def-` - -```phel -(def- name value) -``` -Define a private value that will not be exported. - -## `definterface` - -```phel -(definterface name & fns) -``` -Defines a interface - -## `defmacro` - -```phel -(defmacro name & fdecl) -``` -Define a macro. - -## `defmacro-` - -```phel -(defmacro- name & fdecl) -``` -Define a private macro that will not be exported. - -## `defn` - -```phel -(defn name & fdecl) -``` -Define a new global function. - -## `defn-` - -```phel -(defn- name & fdecl) -``` -Define a private function that will not be exported. - -## `defstruct` - -```phel -(defstruct name keys & implementations) -``` -Define a new struct. - -## `deref` - -```phel -(deref variable) -``` -Return the value inside the variable - -## `difference` - -```phel -(difference set & sets) -``` -Difference between multiple sets into a new one. - -## `difference-pair` - -```phel -(difference-pair s1 s2) -``` - - -## `distinct` - -```phel -(distinct xs) -``` -Returns an array with duplicated values removed in `xs`. - -## `dofor` - -```phel -(dofor head & body) -``` -Repeatedly executes body for side effects with bindings and modifiers as - provided by for. Returns nil. - -## `drop` - -```phel -(drop n xs) -``` -Drops the first `n` elements of `xs`. - -## `drop-while` - -```phel -(drop-while pred xs) -``` -Drops all elements at the front `xs` where `(pred x)` is true. - -## `empty?` - -```phel -(empty? x) -``` -Returns true if `(count x)` is zero, false otherwise. - -## `even?` - -```phel -(even? x) -``` -Checks if `x` is even. - -## `extreme` - -```phel -(extreme order args) -``` -Returns the most extreme value in `args` based on the binary `order` function. - -## `false?` - -```phel -(false? x) -``` -Checks if `x` is false. Same as `x === false` in PHP. - -## `ffirst` - -```phel -(ffirst xs) -``` -Same as `(first (first xs))` - -## `filter` - -```phel -(filter pred xs) -``` -Returns all elements of `xs` wher `(pred x)` is true. - -## `find` - -```phel -(find pred xs) -``` -Returns the first item in `xs` where `(pred item)` evaluates to true. - -## `find-index` - -```phel -(find-index pred xs) -``` -Returns the first item in `xs` where `(pred index item)` evaluates to true. - -## `first` - -```phel -(first xs) -``` -Returns the first element of an indexed sequence or nil. - -## `flatten` - -```phel -(flatten xs) -``` -Takes a nested sequential data structure (tree), and returns their contents - as a single, flat array. - -## `float?` - -```phel -(float? x) -``` -Returns true if `x` is float point number, false otherwise. - -## `for` - -```phel -(for head & body) -``` -List comprehension. The head of the loop is a vector that contains a - sequence of bindings and modifiers. A binding is a sequence of three - values `binding :verb expr`. Where `binding` is a binding as - in let and `:verb` is one of the following keywords: - - * :range loop over a range by using the range function. - * :in loops over all values of a collection. - * :keys loops over all keys/indexes of a collection. - * :pairs loops over all key value pairs of a collection. - - After each loop binding additional modifiers can be applied. Modifiers - have the form `:modifier argument`. The following modifiers are supported: - - * :while breaks the loop if the expression is falsy. - * :let defines additional bindings. - * :when only evaluates the loop body if the condition is true. - - The for loops returns a array with all evaluated elements of the body. - -## `format` - -```phel -(format fmt & xs) -``` -Returns a formatted string. See PHP's [sprintf](https://www.php.net/manual/en/function.sprintf.php) for more information. - -## `frequencies` - -```phel -(frequencies xs) -``` -Returns a table from distinct items in `xs` to the number of times they appear. - -## `function?` - -```phel -(function? x) -``` -Returns true if `x` is a function, false otherwise. - -## `gensym` - -```phel -(gensym ) -``` -Generates a new unique symbol. - -## `get` - -```phel -(get ds k & [opt]) -``` -Get the value mapped to `key` from the datastructure `ds`. - Returns `opt` or nil if the value cannot be found. - -## `get-in` - -```phel -(get-in ds ks & [opt]) -``` -Access a value in a nested data structure. Looks into the data structure via a sequence of keys. - -## `group-by` - -```phel -(group-by f xs) -``` -Returns a table of the elements of xs keyed by the result of - f on each element. - -## `hash-map` - -```phel -(hash-map & xs) -``` -Creates a new hash map. If no argument is provided, an empty hash map is created. The number of parameters must be even. - -## `hash-map?` - -```phel -(hash-map? x) -``` -Returns true if `x` is a hash map, false otherwise. - -## `http/create-response-from-map` - -```phel -(create-response-from-map {:status status :headers headers :body body :version version :reason reason}) -``` -Creates a response struct from a map. The map can have the following keys: - * `:status` The HTTP Status (default 200) - * `:headers` A map of HTTP Headers (default: empty map) - * `:body` The body of the response (default: empty string) - * `:version` The HTTP Version (default: 1.1) - * `:reason` The HTTP status reason. If not provided a common status reason is taken - -## `http/create-response-from-string` - -```phel -(create-response-from-string s) -``` -Create a response from a string. - -## `http/emit-response` - -```phel -(emit-response response) -``` -Emits the response. - -## `http/files-from-globals` - -```phel -(files-from-globals & [files]) -``` -Extracts the files from `$_FILES` and normalizes them to a map of "uploaded-file". - -## `http/headers-from-server` - -```phel -(headers-from-server & [server]) -``` -Extracts all headers from the `$_SERVER` variable. - -## `http/request` - -```phel -(request method uri headers parsed-body query-params cookie-params server-params uploaded-files version) -``` -Creates a new request struct - -## `http/request-from-globals` - -```phel -(request-from-globals ) -``` -Extracts a request from `$_SERVER`, `$_GET`, `$_POST`, `$_COOKIE` and `$_FILES`. - -## `http/request-from-globals-args` - -```phel -(request-from-globals-args server get-parameter post-parameter cookies files) -``` -Extracts a request from args. - -## `http/request?` - -```phel -(request? x) -``` -Checks if `x` is an instance of the request struct - -## `http/response` - -```phel -(response status headers body version reason) -``` -Creates a new response struct - -## `http/response?` - -```phel -(response? x) -``` -Checks if `x` is an instance of the response struct - -## `http/uploaded-file` - -```phel -(uploaded-file tmp-file size error-status client-filename client-media-type) -``` -Creates a new uploaded-file struct - -## `http/uploaded-file?` - -```phel -(uploaded-file? x) -``` -Checks if `x` is an instance of the uploaded-file struct - -## `http/uri` - -```phel -(uri scheme userinfo host port path query fragment) -``` -Creates a new uri struct - -## `http/uri-from-globals` - -```phel -(uri-from-globals & [server]) -``` -Extracts the URI from the `$_SERVER` variable. - -## `http/uri?` - -```phel -(uri? x) -``` -Checks if `x` is an instance of the uri struct - -## `id` - -```phel -(id a & more) -``` -Checks if all values are identically. Same as `a === b` in PHP. - -## `identity` - -```phel -(identity x) -``` -Returns its argument - -## `if-not` - -```phel -(if-not test then & [else]) -``` -Shorthand for `(if (not condition) else then)`. - -## `inc` - -```phel -(inc x) -``` -Increments `x` by one. - -## `indexed?` - -```phel -(indexed? x) -``` -Returns true if `x` is indexed sequence, false otherwise. - -## `int?` - -```phel -(int? x) -``` -Returns true if `x` is an integer number, false otherwise. - -## `interleave` - -```phel -(interleave & xs) -``` -Returns a array with the first items of each col, than the second items etc. - -## `interpose` - -```phel -(interpose sep xs) -``` -Returns an array of elements separated by `sep` - -## `intersection` - -```phel -(intersection set & sets) -``` -Intersect multiple sets into a new one. - -## `invert` - -```phel -(invert table) -``` -Returns a new table where the keys and values are swapped. If table has - duplicated values, some keys will be ignored. - -## `juxt` - -```phel -(juxt & fs) -``` -Takes a list of functions and returns a new function that is the juxtaposition of those functions. - `((juxt a b c) x) => [(a x) (b x) (c x)]` - -## `keep` - -```phel -(keep pred xs) -``` -Returns a list of non-nil results of `(pred x)`. - -## `keep-indexed` - -```phel -(keep-indexed pred xs) -``` -Returns a list of non-nil results of `(pred i x)`. - -## `keys` - -```phel -(keys xs) -``` -Gets the keys of an associative data structure. - -## `keyword` - -```phel -(keyword x) -``` -Creates a new Keyword from a given string. - -## `keyword?` - -```phel -(keyword? x) -``` -Returns true if `x` is a keyword, false otherwise. - -## `kvs` - -```phel -(kvs xs) -``` -Returns an array of key value pairs like [k1 v1 k2 v2 k3 v3 ...]. - -## `list` - -```phel -(list & xs) -``` -Creates a new list. If no argument is provided, an empty list is created. - -## `list?` - -```phel -(list? x) -``` -Returns true if `x` is a list, false otherwise. - -## `map` - -```phel -(map f & xs) -``` -Returns an array consisting of the result of applying `f` to all of the first items in each `xs`, - followed by applying `f` to all the second items in each `xs` until anyone of the `xs` is exhausted. - -## `map-indexed` - -```phel -(map-indexed f xs) -``` -Applies `f` to each element in `xs`. `f` is a two argument function. The first - argument is index of the element in the sequence and the second element is the - element itself. - -## `mapcat` - -```phel -(mapcat f & xs) -``` -Applies `f` on all `xs` and concatenate the result. - -## `max` - -```phel -(max & numbers) -``` -Returns the numeric maximum of all numbers. - -## `mean` - -```phel -(mean xs) -``` -Returns the mean of `xs`. - -## `merge` - -```phel -(merge & tables) -``` -Merges multiple tables into one new table. If a key appears in more than one - collection, then later values replace any previous ones. - -## `merge-into` - -```phel -(merge-into tab & tables) -``` -Merges multiple tables into first table. If a key appears in more than one - collection, then later values replace any previous ones. - -## `meta` - -```phel -(meta obj) -``` -Gets the meta of the give object - -## `min` - -```phel -(min & numbers) -``` -Returns the numeric minimum of all numbers. - -## `nan?` - -```phel -(nan? x) -``` -Checks if `x` is not a number. - -## `neg?` - -```phel -(neg? x) -``` -Checks if `x` is smaller than zero. - -## `next` - -```phel -(next xs) -``` -Returns the sequence of elements after the first element. If there are no -elements, returns nil. - -## `nfirst` - -```phel -(nfirst xs) -``` -Same as `(next (first xs))`. - -## `nil?` - -```phel -(nil? x) -``` -Returns true if `x` is nil, false otherwise. - -## `nnext` - -```phel -(nnext xs) -``` -Same as `(next (next xs))` - -## `not` - -```phel -(not x) -``` -The `not` function returns `true` if the given value is logical false and -`false` otherwise. - -## `not=` - -```phel -(not= a & more) -``` -Checks if all values are unequal. Same as `a != b` in PHP. - -## `number?` - -```phel -(number? x) -``` -Returns true if `x` is a number, false otherwise. - -## `odd?` - -```phel -(odd? x) -``` -Checks if `x` is odd. - -## `one?` - -```phel -(one? x) -``` -Checks if `x` is one. - -## `or` - -```phel -(or & args) -``` -Evaluates each expression one at a time, from left to right. If a form -returns a logical true value, or returns that value and doesn't evaluate any of -the other expressions, otherwise it returns the value of the last expression. -Calling or without arguments, returns nil. - -## `pairs` - -```phel -(pairs xs) -``` -Gets the pairs of an associative data structure. - -## `partial` - -```phel -(partial f & args) -``` -Takes a function `f` and fewer than normal arguments of `f` and returns a function - that a variable number of additional arguments. When call `f` will be called - with `args` and the additional arguments - -## `partition` - -```phel -(partition n xs) -``` -Partition an indexed data structure into vectors of maximum size n. Returns a new vector. - -## `peek` - -```phel -(peek xs) -``` -Returns the last element of a sequence. - -## `persistent` - -```phel -(persistent coll) -``` -Converts a transient collection to a persistent collection - -## `php-array-to-map` - -```phel -(php-array-to-map arr) -``` -Converts a PHP Array to a tables. - -## `php-array-to-table` - -```phel -(php-array-to-table arr) -``` -Converts a PHP Array to a tables. - -## `php-array?` - -```phel -(php-array? x) -``` -Returns true if `x` is a PHP Array, false otherwise. - -## `php-associative-array` - -```phel -(php-associative-array & xs) -``` -Creates a PHP associative array. An even number of parameters must be provided. - -## `php-indexed-array` - -```phel -(php-indexed-array & xs) -``` -Creates an PHP indexed array from the given values. - -## `php-object?` - -```phel -(php-object? x) -``` -Returns true if `x` is a PHP object, false otherwise. - -## `php-resource?` - -```phel -(php-resource? x) -``` -Returns true if `x` is a PHP resource, false otherwise. - -## `pop` - -```phel -(pop xs) -``` -Removes the last element of the array `xs`. If the array is empty - returns nil. - -## `pos?` - -```phel -(pos? x) -``` -Checks if `x` is greater than zero. - -## `print` - -```phel -(print & xs) -``` -Prints the given values to the default output stream. Returns nil. - -## `print-str` - -```phel -(print-str & xs) -``` -Same as print. But instead of writing it to a output stream, - The resulting string is returned. - -## `printf` - -```phel -(printf fmt & xs) -``` -Output a formatted string. See PHP's [printf](https://www.php.net/manual/en/function.printf.php) for more information. - -## `println` - -```phel -(println & xs) -``` -Same as print followed by a newline. - -## `push` - -```phel -(push xs x) -``` -Inserts `x` at the end of the sequence `xs`. - -## `put` - -```phel -(put ds key value) -``` -Puts `value` mapped to `key` on the datastructure `ds`. Returns `ds`. - -## `put-in` - -```phel -(put-in ds [k & ks] v) -``` -Puts a value into a nested data structure. - -## `rand` - -```phel -(rand ) -``` -Returns a random number between 0 and 1. - -## `rand-int` - -```phel -(rand-int n) -``` -Returns a random number between 0 and `n`. - -## `rand-nth` - -```phel -(rand-nth xs) -``` -Returns a random item from xs. - -## `range` - -```phel -(range a & rest) -``` -Create an array of values [start, end). If the function has one argument the - the range [0, end) is returned. With two arguments, returns [start, end). - The third argument is an optional step width (default 1). - -## `re-seq` - -```phel -(re-seq re s) -``` -Returns a sequence of successive matches of pattern in string. - -## `reduce` - -```phel -(reduce f init xs) -``` -Transforms an collection `xs` with a function `f` to produce a value by applying `f` to each element in order. - `f` is a function with two arguments. The first argument is the initial value and the second argument is - the element of `xs`. `f` returns a value that will be used as the initial value of the next call to `f`. The final - value of `f` is returned. - -## `reduce2` - -```phel -(reduce2 f [x & xs]) -``` -The 2-argument version of reduce that does not take a initialization value. - Instead the first argument of the list is used as initialization value. - -## `remove` - -```phel -(remove xs offset & [n]) -``` -Removes up to `n` element from array `xs` starting at index `offset`. - -## `repeat` - -```phel -(repeat n x) -``` -Returns an array of length n where every element is x. - -## `rest` - -```phel -(rest xs) -``` -Returns the sequence of elements after the first element. If there are no -elements, returns an empty sequence. - -## `reverse` - -```phel -(reverse xs) -``` -Reverses the order of the elements in the given sequence. - -## `second` - -```phel -(second xs) -``` -Returns the second element of an indexed sequence or nil. - -## `set` - -```phel -(set & xs) -``` -Creates a new Set. If no argument is provided, an empty Set is created. - -## `set!` - -```phel -(set! variable value) -``` -Sets a new value to the given variable - -## `set-meta!` - -```phel -(set-meta! obj) -``` -Sets the meta data to a given object - -## `set?` - -```phel -(set? x) -``` -Returns true if `x` is a set, false otherwise. - -## `shuffle` - -```phel -(shuffle xs) -``` -Returns a random permutation of xs. - -## `slice` - -```phel -(slice xs & [offset & [length]]) -``` -Extract a slice of `xs`. - -## `some?` - -```phel -(some? pred xs) -``` -Returns true if `(pred x)` is logical true for at least one `x` in `xs`, else false. - -## `sort` - -```phel -(sort xs & [comp]) -``` -Returns a sorted array. If no comparator is supplied compare is used. - -## `sort-by` - -```phel -(sort-by keyfn xs & [comp]) -``` -Returns a sorted array where the sort order is determined by comparing - (keyfn item). If no comparator is supplied compare is used. - -## `split-at` - -```phel -(split-at n xs) -``` -Returns a vector of [(take n coll) (drop n coll)]. - -## `split-with` - -```phel -(split-with f xs) -``` -Returns a vector of [(take-while pred coll) (drop-while pred coll)]. - -## `str` - -```phel -(str & args) -``` -Creates a string by concatenating values together. If no arguments are -provided an empty string is returned. Nil and false are represented as empty -string. True is represented as 1. Otherwise it tries to call `__toString`. -This is PHP equivalent to `$args[0] . $args[1] . $args[2] ...` - -## `str-contains?` - -```phel -(str-contains? str s) -``` -True if str contains s. - -## `string?` - -```phel -(string? x) -``` -Returns true if `x` is a string, false otherwise. - -## `struct?` - -```phel -(struct? x) -``` -Returns true if `x` is a struct, false otherwise. - -## `sum` - -```phel -(sum xs) -``` -Returns the sum of all elements is `xs`. - -## `swap!` - -```phel -(swap! variable f & args) -``` -Swaps the value of the variable to (apply f current-value args). Returns the values that is swapped in. - -## `symbol?` - -```phel -(symbol? x) -``` -Returns true if `x` is a symbol, false otherwise. - -## `symmetric-difference` - -```phel -(symmetric-difference set & sets) -``` -Symmetric difference between multiple sets into a new one. - -## `table` - -```phel -(table & xs) -``` -Creates a new Table. If no argument is provided, an empty Table is created. -The number of parameters must be even. - -## `table?` - -```phel -(table? x) -``` -Returns true if `x` is a table, false otherwise. - -## `take` - -```phel -(take n xs) -``` -Takes the first `n` elements of `xs`. - -## `take-last` - -```phel -(take-last n xs) -``` -Takes the last `n` elements of `xs`. - -## `take-nth` - -```phel -(take-nth n xs) -``` -Returns every nth item in `xs` - -## `take-while` - -```phel -(take-while pred xs) -``` -Takes alle elements at the front of `xs` where `(pred x)` is true. - -## `test/deftest` - -```phel -(deftest name & body) -``` -Defines a test function with no arguments - -## `test/is` - -```phel -(is form & [message]) -``` -Generic assertion macro. - -## `test/print-summary` - -```phel -(print-summary ) -``` -Prints the summary of the test suite - -## `test/report` - -```phel -(report data) -``` - - -## `test/run-tests` - -```phel -(run-tests options & namespaces) -``` -Runs all test functions in the given namespaces - -## `test/successful?` - -```phel -(successful? ) -``` -Checks if all tests have passed. - -## `to-php-array` - -```phel -(to-php-array xs) -``` -Create a PHP Array from a sequential data structure. - -## `transient` - -```phel -(transient coll) -``` -Converts a persistent collection to a transient collection - -## `tree-seq` - -```phel -(tree-seq branch? children root) -``` -Returns an array of the nodes in the tree, via a depth first walk. - branch? is a function with one argument that returns true if the given node - has children. - children must be a function with one argument that returns the children of the node. - root the root node of the tree. - -## `true?` - -```phel -(true? x) -``` -Checks if `x` is true. Same as `x === true` in PHP. - -## `truthy?` - -```phel -(truthy? x) -``` -Checks if `x` is truthy. Same as `x == true` in PHP. - -## `type` - -```phel -(type x) -``` -Returns the type of `x`. Following types can be returned: - -* `:vector` -* `:list` -* `:struct` -* `:hash-map` -* `:set` -* `:array` -* `:table` -* `:keyword` -* `:symbol` -* `:var` -* `:int` -* `:float` -* `:string` -* `:nil` -* `:boolean` -* `:function` -* `:php/array` -* `:php/resource` -* `:php/object` -* `:unknown` - -## `union` - -```phel -(union & sets) -``` -Union multiple sets into a new one. - -## `unset` - -```phel -(unset ds key) -``` -Returns `ds` without `key`. - -## `update` - -```phel -(update ds k f & args) -``` -Updates a value in a datastructure by applying `f` to the current element and replacing it with the result of `f`. - -## `update-in` - -```phel -(update-in ds [k & ks] f & args) -``` -Updates a value into a nested data structure. - -## `values` - -```phel -(values xs) -``` -Gets the values of an associative data structure. - -## `var` - -```phel -(var value) -``` -Creates a new variable with the give value - -## `var?` - -```phel -(var? x) -``` -Checks if the given value is a variable - -## `vector` - -```phel -(vetcor & xs) -``` -Creates a new vector. If no argument is provided, an empty list is created. - -## `vector?` - -```phel -(vector? x) -``` -Returns true if `x` is a vector, false otherwise. - -## `when` - -```phel -(when test & body) -``` -Evaluates `test` and if that is logical true, evaluates `body`. - -## `when-not` - -```phel -(when-not test & body) -``` -Evaluates `test` and if that is logical false, evaluates `body`. - -## `with-output-buffer` - -```phel -(with-output-buffer & body) -``` -Everything that is printed inside the body will be stored in a buffer. - The result of the buffer is returned. - -## `zero?` - -```phel -(zero? x) -``` -Checks if `x` is zero. - -## `zipcoll` - -```phel -(zipcoll a b) -``` -Creates a table from two sequential data structures. Return a new table. - diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..9bd7ad9 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,30 @@ + + + + + + + + + build/tests + + + + + + build/src + + + diff --git a/sass/_header.scss b/sass/_header.scss index 16b1fb0..b47227f 100644 --- a/sass/_header.scss +++ b/sass/_header.scss @@ -6,6 +6,7 @@ left: 0; right: 0; height: $header-height; + z-index: 1; .site-header__container { display: flex; @@ -58,11 +59,28 @@ } .site-header__logo { - .phel-logo { - max-height: 2.5em; - width: 3em; - stroke: white; - stroke-width: 5px; + a { + display: inline-block; + + .phel-logo { + max-height: 2.5em; + width: 3em; + stroke: white; + stroke-width: 5px; + } + } + } + + .site-header__search { + display: none; + + @include desktop { + display: block; + + input { + padding: 0.2rem; + font-size: initial; + } } } @@ -73,12 +91,17 @@ display: block; flex-grow: 2; + .top-navigation__item--github { + display: none; + } + ul { list-style: none; margin: 0; padding: 0; + margin-left: 2em; display: flex; - justify-content: flex-end; + justify-content: flex-start; li { a { @@ -96,6 +119,23 @@ } } } + + .site-header__github { + display: none; + + @include desktop { + display: block; + a { + display: inline-block; + color: white; + margin-left: 1em; + + svg { + vertical-align: middle; + } + } + } + } } } diff --git a/sass/_search.scss b/sass/_search.scss new file mode 100644 index 0000000..8c45435 --- /dev/null +++ b/sass/_search.scss @@ -0,0 +1,55 @@ +.search-results { + display: none; + position: absolute; + background: white; + color: black; + padding: 0.6rem; + box-shadow: 0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12); + margin-right: 5px; + overflow: auto; + max-height: calc(100vh - 4rem); + + @include desktop { + max-height: 500px; + } + + &__items { + list-style: none; + } + + li { + margin-top: 0.6rem; + border-bottom: 1px solid #ccc; + font-size: 0.9rem; + + &:first-of-type { + margin-top: 0; + } + + &:last-child { + border-bottom: none; + } + } + + &__item { + margin-bottom: 0.6rem; + + a { + font-size: 1.2rem; + display: inline-block; + } + + .fn-signature { + font-family: monospace; + font-size: 0.6em; + } + + .desc { + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + color: black; + } + } +} diff --git a/sass/site.scss b/sass/site.scss index 0bc76c1..a3112bd 100644 --- a/sass/site.scss +++ b/sass/site.scss @@ -8,6 +8,7 @@ @import 'two-column-layout'; @import 'site-navigation'; @import 'header'; +@import 'search'; @import 'page-toc'; body { diff --git a/static/elasticlunr.min.js b/static/elasticlunr.min.js new file mode 100644 index 0000000..94b20dd --- /dev/null +++ b/static/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o index.addDoc(item)); + + $searchInput.addEventListener("keyup", debounce(showResults(index), 150)); + // Hide results when user press on the 'x' placed inside the search field + $searchInput.addEventListener("search", () => $searchResults.style.display = ""); + $searchInput.addEventListener("focusin", function () { + if ($searchInput.value !== "") { + showResults(index)(); + } + }); + + window.addEventListener("click", function (e) { + if ($searchResults.style.display === "block") { + if (e.target !== $searchInput) { + $searchResults.style.display = ""; + } + } + }); +} + +function debounce(func, wait) { + let timeout; + + return function () { + const context = this; + const args = arguments; + clearTimeout(timeout); + + timeout = setTimeout(function () { + timeout = null; + func.apply(context, args); + }, wait); + }; +} + +function showResults(index) { + return function () { + const $searchInput = document.getElementById("search"); + const $searchResults = document.querySelector(".search-results"); + const $searchResultsItems = document.querySelector(".search-results__items"); + const MAX_ITEMS = 10; + + const term = $searchInput.value.trim(); + $searchResults.style.display = term === "" ? "" : "block"; + $searchResultsItems.innerHTML = ""; + if (term === "") { + $searchResults.style.display = ""; + return; + } + + const options = { + bool: "AND", + fields: { + fnName: {boost: 3}, + desc: {boost: 1}, + }, + expand: true + }; + const results = index.search(term, options); + if (results.length === 0) { + let emptyResult = { + fnName: "Symbol not found", + fnSignature: "", + desc: "Cannot provide any Phel symbol. Try something else", + anchor: "#", + }; + + createMenuItem(emptyResult); + return; + } + + const numberOfResults = Math.min(results.length, MAX_ITEMS); + for (let i = 0; i < numberOfResults; i++) { + createMenuItem(results[i].doc); + } + } +} + +function createMenuItem(result) { + const $searchInput = document.getElementById("search"); + const $searchResultsItems = document.querySelector(".search-results__items"); + + const item = document.createElement("li"); + item.innerHTML = formatSearchResultItem(result); + item.addEventListener('click', () => $searchInput.value = "") + $searchResultsItems.appendChild(item); +} + +function formatSearchResultItem(item) { + return `` + + `
${item.fnName} ` + + `${item.fnSignature}` + + `${item.desc}` + + `
`; +} diff --git a/templates/base.html b/templates/base.html index a21174c..0a45b94 100644 --- a/templates/base.html +++ b/templates/base.html @@ -24,6 +24,10 @@ {% block body %} {% endblock %} + + + + diff --git a/templates/header.html b/templates/header.html index e49722b..a869c4b 100644 --- a/templates/header.html +++ b/templates/header.html @@ -15,8 +15,25 @@ +
{% include "navigation/top-navigation.html" %}
+ + + + diff --git a/templates/navigation/top-navigation.html b/templates/navigation/top-navigation.html index 5d534d0..34c937e 100644 --- a/templates/navigation/top-navigation.html +++ b/templates/navigation/top-navigation.html @@ -8,7 +8,7 @@
  • Exercises
  • -
  • +
  • Github