{"id":47709378,"url":"https://github.com/uuf6429/php-cs-fixer-blockstring","last_synced_at":"2026-04-02T18:25:57.948Z","repository":{"id":344923291,"uuid":"1182003437","full_name":"uuf6429/php-cs-fixer-blockstring","owner":"uuf6429","description":"🧹 A PHP-CS-Fixer extension for formatting the contents of PHP heredoc and nowdoc string blocks.","archived":false,"fork":false,"pushed_at":"2026-03-25T21:31:40.000Z","size":47,"stargazers_count":1,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T19:31:36.558Z","etag":null,"topics":["code-formatting","code-style","heredoc","nowdoc","php","php-cs-fixer","php-cs-fixer-custom-fixers"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/uuf6429.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["uuf6429"],"custom":["https://paypal.me/uuf6429"]}},"created_at":"2026-03-14T23:00:55.000Z","updated_at":"2026-03-25T21:29:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/uuf6429/php-cs-fixer-blockstring","commit_stats":null,"previous_names":["uuf6429/php-cs-fixer-blockstring"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/uuf6429/php-cs-fixer-blockstring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uuf6429%2Fphp-cs-fixer-blockstring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uuf6429%2Fphp-cs-fixer-blockstring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uuf6429%2Fphp-cs-fixer-blockstring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uuf6429%2Fphp-cs-fixer-blockstring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/uuf6429","download_url":"https://codeload.github.com/uuf6429/php-cs-fixer-blockstring/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uuf6429%2Fphp-cs-fixer-blockstring/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31312854,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-formatting","code-style","heredoc","nowdoc","php","php-cs-fixer","php-cs-fixer-custom-fixers"],"created_at":"2026-04-02T18:25:57.139Z","updated_at":"2026-04-02T18:25:57.940Z","avatar_url":"https://github.com/uuf6429.png","language":"PHP","funding_links":["https://github.com/sponsors/uuf6429","https://paypal.me/uuf6429"],"categories":[],"sub_categories":[],"readme":"# 🧹 PHP-CS-Fixer Heredoc/Nowdoc Content Formatter\n\n[![CI](https://github.com/uuf6429/php-cs-fixer-blockstring/actions/workflows/ci.yml/badge.svg)](https://github.com/uuf6429/php-cs-fixer-blockstring/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/uuf6429/php-cs-fixer-blockstring/branch/main/graph/badge.svg)](https://codecov.io/gh/uuf6429/php-cs-fixer-blockstring)\n[![Minimum PHP Version](https://img.shields.io/badge/php-%5E7.4%20%7C%7C%20%5E8-8892BF.svg)](https://php.net/)\n[![License](https://poser.pugx.org/uuf6429/php-cs-fixer-blockstring/license)](https://packagist.org/packages/uuf6429/php-cs-fixer-blockstring)\n[![Latest Stable Version](https://poser.pugx.org/uuf6429/php-cs-fixer-blockstring/v)](https://packagist.org/packages/uuf6429/php-cs-fixer-blockstring)\n[![Latest Unstable Version](https://poser.pugx.org/uuf6429/php-cs-fixer-blockstring/v/unstable)](https://packagist.org/packages/uuf6429/php-cs-fixer-blockstring)\n\nThis project extends [PHP-CS-Fixer] to be able to format the contents of PHP [Heredoc] and [Nowdoc] strings (aka\n_Block Strings_).\n\nNote that **no language-specific formatters** are provided by design - this project instead provides the capability to\nintegrate any type of formatters with minimal code (mainly in your PHP-CS-Fixer configuration file).\n\nWhile this might sound like a weakness, it in fact makes it possible to integrate virtually any formatter for any\nlanguage.\n\n## 🔌 Installation\n\nInstall via Composer:\n\n```shell\ncomposer require uuf6429/php-cs-fixer-blockstring --dev\n```\n\nFinally, register a custom fixer in your `.php-cs-fixer.php` config file (1️⃣) and then set up formatters (2️⃣):\n\n```php\n\u003c?php\n\nuse PhpCsFixer;\nuse uuf6429\\PhpCsFixerBlockstring\\Fixer\\BlockStringFixer;\n\nreturn (new PhpCsFixer\\Config())\n    -\u003eregisterCustomFixers([new BlockStringFixer()])  // 👈 1️⃣\n    -\u003esetRules([\n        BlockStringFixer::NAME =\u003e [\n            'formatters' =\u003e [],                       // 👈 2️⃣\n        ]\n    ])\n    -\u003esetFinder(...);\n```\n\n\u003e [!WARNING]\n\u003e If PHP CS Fixer is installed via [`php-cs-fixer/shim`](https://github.com/PHP-CS-Fixer/shim) package, you may have to\n\u003e require the bootstrap file:\n\u003e ```php\n\u003e require __DIR__ . '/vendor/uuf6429/php-cs-fixer-blockstring/bootstrap.php';\n\u003e ```\n\n## 💡 Before You Start\n\n\u003cdetails\u003e\n\u003csummary\u003eHow does the configuration look like?\u003c/summary\u003e\n\nThe configuration is made up of a map of block string delimiters and formatter pairs. A default formatter can be\nconfigured to run for any Block Strings that have other not been configured.\n\nFor example:\n\n```php\n\tBlockStringFixer::NAME =\u003e [\n\t\t'formatters' =\u003e [\n\t\t\tnew LineFormatter(),\n\t\t\t'JSON' =\u003e new JsonFormatter(),\n\t\t]\n\t]\n```\n\nIn that (fictitious) example, `LineFormatter` is applied to all block strings except `\u003c\u003c\u003cJSON` - that one will be\nhandled exclusively by the `JsonFormatter` one.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWhat's the deal with formatter versions?\u003c/summary\u003e\n\nYou might have noticed that the base formatter class requires having a version. In most cases, the version comes up\nquite often. The reason is that by supplying an up-to-date version, PHP-CS-Fixer cache can be skipped - which is\nimportant if the recently-updated external fixer is behaving differently - otherwise fixes become outdated because of\nan outdated cache. Note that the actual value of the version does not matter.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWhat about variable interpolation in Heredoc?\u003c/summary\u003e\n\nThey provide an interesting challenge, which this project solves with the concept of an [`InterpolationCodec`].\nThis concept essentially replaces interpolation 'segments' with tokens - ensuring that the content is valid during the\nformatting stage - and then they're rolled back to the original value.\nThe codec can be configured for most of the formatters - you should probably apply such configuration diligently if\nyou plan on having Heredoc strings.\n\nHere's an example illustration of the whole flow:\n\n```php\necho \u003c\u003c\u003cJSON\n\t{\"users\": $users}\n\tJSON;\n```\n\nThat JSON cannot be formatted properly because `$users` is not valid syntax. The [`GeneratedTokenCodec`] codec can be\nused; it will automatically replace the `$users` part with a token temporarily. By default, it will replace it with\n`__PHP_VAR_1__` in this specific case - which is still not valid(!) So instead, we configure it with a different token\npattern: `new GeneratedTokenCodec('\"__PHP_VAR_%d__\"')`. The double quotes ensure that the replaced token is valid JSON:\n\n```php\necho \u003c\u003c\u003cJSON\n\t{\"users\": \"__PHP_VAR_1__\"}\n\tJSON;\n```\n\nGiven that, the formatter will do its job without problems and then the codec will transform that token back with the\noriginal interpolation.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWhat about complex variable interpolation in Heredoc?\u003c/summary\u003e\n\nThe `GeneratedTokenCodec` codec additionally allows handling interpolations on a case-by-case basis by providing a\ncallback that acts as a token generation factory. If this callback returns null instead of a string token, the default\nfunctionality will be used instead.\n\nAdditionally, you can always build your own codec - you just need to implement [`CodecInterface`].\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eThe 3d-party formatter complains that the string has bad syntax.\u003c/summary\u003e\n\nThis is not at all unlikely - that's one reason why the interpolation codec concept came up - string interpolation often\ncauses broken syntax. Unfortunately, the codec concept won't help you if you're using some other sort of templating\nsystem, such as replacing placeholders with `str_replace()`, `preg_replace()`, `strtr()` or `sprintf()` or similar.\nYou can, however, implement a \"formatter\" that replaces such placeholders temporarily during formatting and then\nreverses them back, but since this seems like an uncommon usecase, there aren't any supporting implementations yet\n(you're welcome to suggest it though).\n\u003c/details\u003e\n\n## 🚀 Usage Example\n\n\u003cdetails\u003e\n\u003csummary\u003e1. Given the following PHP-CS-Fixer configuration:\u003c/summary\u003e\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse uuf6429\\PhpCsFixerBlockstring\\Fixer\\BlockStringFixer;\nuse uuf6429\\PhpCsFixerBlockstring\\Formatter;\nuse uuf6429\\PhpCsFixerBlockstring\\InterpolationCodec\\GeneratedTokenCodec;\n\nreturn (new PhpCsFixer\\Config())\n\t-\u003eregisterCustomFixers([new BlockStringFixer()])\n\t-\u003esetRiskyAllowed(true)\n\t-\u003esetRules([\n\t\tBlockStringFixer::NAME =\u003e [\n\t\t\t'formatters' =\u003e [\n\n\t\t\t\t// 1️⃣ SimpleLineFormatter\n\t\t\t\t// Normalizes indentation of any block not explicitly configured below\n\t\t\t\tnew Formatter\\SimpleLineFormatter(\n\t\t\t\t\t4,                // indentSize\n\t\t\t\t\t\"\\t\",             // indentChar\n\t\t\t\t\tnew GeneratedTokenCodec()   // interpolationCodec\n\t\t\t\t),\n\n\t\t\t\t// 2️⃣ CliPipeFormatter\n\t\t\t\t// Formats SQL using a CLI tool installed locally\n\t\t\t\t'SQL' =\u003e new Formatter\\CliPipeFormatter(\n\t\t\t\t\t['cmd' =\u003e ['php', __DIR__ . '/sqlformat.php', '--version']],      // versionValueOrCommand\n\t\t\t\t\t['cmd' =\u003e ['php', __DIR__ . '/sqlformat.php', '-']],              // formatCommand\n\t\t\t\t),\n\n\t\t\t\t// 3️⃣ ChainFormatter\n\t\t\t\t// Combines two formatters:\n\t\t\t\t// 1. A custom formatter that sorts object keys.\n\t\t\t\t// 2. A docker-based formatter that runs the json through jq.\n\t\t\t\t'JSON' =\u003e new Formatter\\ChainFormatter(\n\t\t\t\t\tnew class extends Formatter\\AbstractCodecFormatter {\n\t\t\t\t\t\tpublic function __construct()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparent::__construct('1.0', new GeneratedTokenCodec('\"__PHP_VAR_%d__\"'));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpublic function formatContent(string $original): string\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn json_encode(\n\t\t\t\t\t\t\t\t$this-\u003esortObjectKeysRecursively(\n\t\t\t\t\t\t\t\t\tjson_decode(\n\t\t\t\t\t\t\t\t\t\t$original,\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\t512,\n\t\t\t\t\t\t\t\t\t\tJSON_THROW_ON_ERROR\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tJSON_THROW_ON_ERROR\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * @param mixed $value\n\t\t\t\t\t\t * @return mixed\n\t\t\t\t\t\t */\n\t\t\t\t\t\tprivate function sortObjectKeysRecursively($value)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (is_object($value)) {\n\t\t\t\t\t\t\t\t$value = get_object_vars($value);\n\t\t\t\t\t\t\t\tksort($value);\n\t\t\t\t\t\t\t\treturn (object)$value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (is_array($value)) {\n\t\t\t\t\t\t\t\treturn array_map([$this, 'sortObjectKeysRecursively'], $value);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn $value;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tnew Formatter\\DockerPipeFormatter(\n\t\t\t\t\t\t'ghcr.io/jqlang/jq',                               // image\n\t\t\t\t\t\t[],                                                // options\n\t\t\t\t\t\t[],                                                // command\n\t\t\t\t\t\t'missing',                                         // pullMode\n\t\t\t\t\t\tnew GeneratedTokenCodec('\"__PHP_VAR_%d__\"')        // interpolationCodec\n\t\t\t\t\t),\n\t\t\t\t),\n\n\t\t\t],\n\t\t],\n\t]);\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e2. And the following source code file \u003ci\u003e(note that whitespace has been substituted to highlight it better)\u003c/i\u003e:\u003c/summary\u003e\n\n```php\n\u003c?php·declare(strict_types=1);\n\n/**\n·*·Demo:·fetch·users·from·DB·and·generate·a·JS·snippet·with·JSON·data\n·*/\n\n$sql·=·\u003c\u003c\u003c'SQL'\nSELECT·id,·name,·email·from·users\n········WHERE·status·=·'active'\n····ORDER·by·created_at·desc\nSQL;\n\n/**·@var·PDO·$pdo·*/\n$stmt·=·$pdo-\u003equery($sql);\n$users·=·$stmt-\u003efetchAll(PDO::FETCH_ASSOC);\n$jsonUsers·=·json_encode($users);\n\n$json·=·\u003c\u003c\u003c\"JSON\"\n---→{·····\"users\":{$jsonUsers},\n---→····\"ascending\":···false··}\n---→JSON;\n\necho·\u003c\u003c\u003cJS\n(function(){·····\n····const·userData={$json};\n---→console.log(\"Active·users:\",·userData.users);\n})();·····\nJS;\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e3. PHP-CS-Fixer will format it to \u003ci\u003e(whitespace also substituted)\u003c/i\u003e:\u003c/summary\u003e\n\n```php\n\u003c?php·declare(strict_types=1);\n\n/**\n·*·Demo:·fetch·users·from·DB·and·generate·a·JS·snippet·with·JSON·data\n·*/\n\n$sql·=·\u003c\u003c\u003c'SQL'\nSELECT·id,·name,·email\nFROM·users\nWHERE·status·=·'active'\nORDER·BY·created_at·DESC\nSQL;\n\n/**·@var·PDO·$pdo·*/\n$stmt·=·$pdo-\u003equery($sql);\n$users·=·$stmt-\u003efetchAll(PDO::FETCH_ASSOC);\n$jsonUsers·=·json_encode($users);\n\n$json·=·\u003c\u003c\u003c\"JSON\"\n---→{\n---→··\"ascending\":·false,\n---→··\"users\":·{$jsonUsers}\n---→}\n---→JSON;\n\necho·\u003c\u003c\u003cJS\n(function(){\n---→const·userData={$json};\n---→console.log(\"Active·users:\",·userData.users);\n})();\nJS;\n\n```\n\n\u003c/details\u003e\n\n## ⭐️ Formatters\n\n### [AbstractCodecFormatter](./src/Formatter/AbstractCodecFormatter.php)\n\nThis formatter base class is aware of string interpolation - it passes content through a codec before and after\nformatting (to properly handle string interpolation).\n\nAdditionally, it keeps an in-memory cache of formatted content to avoid unnecessary work within the same process.\n\nIt can be used to embed any kind of formatter, including (native) PHP-based ones.\n\nExample with your own custom class:\n\n```php\nfinal class MyFormatter extends AbstractCodecFormatter\n{\n    protected function formatContent(string $original): string\n    {\n        return 'new content';\n    }\n}\n\n['formatters' =\u003e [ new MyFormatter('1.0', new PlainStringCodec()) ]]\n```\n\nExample with an anonymous class:\n\n```php\n['formatters' =\u003e [\n    new class ('1.0', new PlainStringCodec()) extends AbstractCodecFormatter\n    {\n        protected function formatContent(string $original): string\n        {\n            return 'new content';\n        }\n    }\n]]\n```\n\n### [AbstractFormatter](./src/Formatter/AbstractFormatter.php)\n\nThis is the base class of all formatters. In most cases you don't really want to extend this class, since it does\nnot handle string interpolation at all - check out [`AbstractCodecFormatter`] instead.\n\nExtending this class makes sense in two situations:\n\n1. If your class is infrastructural, and you don't really need to handle string interpolation - just like\n   [`ChainFormatter`]\n2. Or if, for whatever reason, the [`CodecInterface`] concept does not work for you and you want to write\n   something from scratch.\n\n### [ChainFormatter](./src/Formatter/ChainFormatter.php)\n\nThis formatter allows multiple formatters to be applied sequentially - the output of each formatter becomes the\ninput of the next one.\n\nExample:\n\n ```php\n ['formatters' =\u003e [ new ChainFormatter(\n     new FirstFormatter(),\n     new SecondFormatter(),\n ) ]]\n ```\n\n### [CliPipeFormatter](./src/Formatter/CliPipeFormatter.php)\n\nIt's no secret that the best formatting tools are not directly available in PHP. This formatter off-loads formatting\nto such external executables.\n\nExample:\n\n```php\n['formatters' =\u003e [ new CliPipeFormatter(\n    versionValueOrCommand: '1.0',               // Either a version as a string, or the command to get the version (as an array).\n    formatCommand: ['cmd' =\u003e 'jfmt -'],         // An array defining the external command to do the formatting.\n    interpolationCodec: new PlainStringCodec(), // A codec for handling interpolations; depends on the content being formatted.\n    stripLastNewLine: true,                     // Remove last line from cli output - you might need this, depending on the platform/shell.\n) ]]\n```\n\nThe command definition (for version detection or formatting) is an array with the following structure:\n\n- `cmd` - array/string - The command line e.g. `'jfmt --format'` or `['jfmt', '--format']`.\n- `cwd` - (optional) string - The current working directory of the command.\n- `env` - (optional) array of string keys and values - Environment variables to pass to the command.\n\n### [DockerPipeFormatter](./src/Formatter/DockerPipeFormatter.php)\n\nThe minimal setup, stable repeatability, and a rich ecosystem makes Docker images an ideal source of formatting\ntools. This formatter exists to take advantage of that.\n\nExample:\n\n```php\n['formatters' =\u003e [ new DockerPipeFormatter(\n    image: 'ghcr.io/jqlang/jq',                 // The docker image; might contain url, tag or even the digest.\n    options: ['-e', 'SOME_ENV=value'],          // Optional docker arguments, such as for setting env vars.\n    command: ['bin/tool', '--dry-run', '-'],    // The command to run within the container, including any arguments.\n    pullMode: 'always',                         // How/when the image should be pulled: 'never', 'always' or 'missing'.\n    interpolationCodec: new PlainStringCodec(), // A codec for handling interpolations; depends on the content being formatted.\n    stripLastNewLine: true,                     // Remove last line from docker output - typically needed.\n) ]]\n```\n\n### [SimpleLineFormatter](./src/Formatter/SimpleLineFormatter.php)\n\nA formatter that normalizes indentation and removes any trailing whitespace at the end of lines.\n\nExample:\n\n```php\n['formatters' =\u003e [ new SimpleLineFormatter(\n    indentSize: 4,                              // The number of spaces defining one indentation level in your project.\n    indentChar: \"\\t\",                           // The actual character used for indentation (space or tab).\n    interpolationCodec: new PlainStringCodec(), // A codec for handling interpolations; depends on the content being formatted.\n) ]]\n```\n\n### [WslPipeFormatter](./src/Formatter/WslPipeFormatter.php)\n\nA formatter making use of Windows Subsystem for Linux (WSL). Of course you will need to be running on Windows and WSL\nneeds to be enabled and set up. Configuration is otherwise almost identical to [`CliPipeFormatter`].\n\n[PHP-CS-Fixer]: https://github.com/PHP-CS-Fixer/PHP-CS-Fixer\n\n[Heredoc]: https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc\n\n[Nowdoc]: https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc\n\n[`GeneratedTokenCodec`]: ./src/InterpolationCodec/GeneratedTokenCodec.php\n\n[`CodecInterface`]: ./src/InterpolationCodec/CodecInterface.php\n\n[`AbstractCodecFormatter`]: ./src/Formatter/AbstractCodecFormatter.php\n\n[`ChainFormatter`]: ./src/Formatter/ChainFormatter.php\n\n[`InterpolationCodec`]: ./src/InterpolationCodec\n\n[`CliPipeFormatter`]: ./src/Formatter/CliPipeFormatter.php\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuuf6429%2Fphp-cs-fixer-blockstring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuuf6429%2Fphp-cs-fixer-blockstring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuuf6429%2Fphp-cs-fixer-blockstring/lists"}