{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":432767611,"defaultBranch":"master","name":"Valinor","ownerLogin":"CuyZ","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2021-11-28T16:40:17.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/32244822?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1725293073.0","currentOid":""},"activityList":{"items":[{"before":"546c45887ca64605cfb2967cf1afe4d14298cdbc","after":"e695b29f06720368e471e1101381aa8414556be2","ref":"refs/heads/master","pushedAt":"2024-09-18T19:51:06.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: prevent cache corruption when normalizing and mapping to enum","shortMessageHtmlLink":"fix: prevent cache corruption when normalizing and mapping to enum"}},{"before":"8742b273f1bdd6e7037f1398b9d8822508ffda63","after":"546c45887ca64605cfb2967cf1afe4d14298cdbc","ref":"refs/heads/master","pushedAt":"2024-09-18T12:08:06.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: use `xxh128` hash algorithm for cache keys\n\nThis algorithm is way faster than the originally used `sha1`.\r\n\r\nThis commit also moves the hash logic into one place, saving even more\r\nprocessing time. \r\n\r\nReference: https://php.watch/versions/8.1/xxHash\r\n\r\nCo-authored-by: Romain Canon ","shortMessageHtmlLink":"misc: use xxh128 hash algorithm for cache keys"}},{"before":"ae0f5bd340d25bf741b4cedf0872f4baa9719b32","after":"f82591c77c6f17a211ec5d3745b39e397a1ecb62","ref":"refs/heads/fix/properly-handle-class-sharing-class-name-and-namespace-group-name","pushedAt":"2024-09-18T04:08:58.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"Merge remote-tracking branch 'refs/remotes/origin/master' into fix/properly-handle-class-sharing-class-name-and-namespace-group-name","shortMessageHtmlLink":"Merge remote-tracking branch 'refs/remotes/origin/master' into fix/pr…"}},{"before":"594d5cd5183061d3f886c9dbc76c26f92ae8a8d0","after":"ae0f5bd340d25bf741b4cedf0872f4baa9719b32","ref":"refs/heads/fix/properly-handle-class-sharing-class-name-and-namespace-group-name","pushedAt":"2024-09-18T04:08:45.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: simplify alias handling","shortMessageHtmlLink":"misc: simplify alias handling"}},{"before":"b9c6add856ba6b2ee2034deaaee312a99159e885","after":"8742b273f1bdd6e7037f1398b9d8822508ffda63","ref":"refs/heads/master","pushedAt":"2024-09-16T18:57:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: handle float type casting properly\n\nRegression fix for 0479532fbc96fca35dcbfb4c1f5a9ef63e7625c5","shortMessageHtmlLink":"fix: handle float type casting properly"}},{"before":"f3e8c1e09c0b947693cd40941d2ae5ab9b31bbd9","after":"b9c6add856ba6b2ee2034deaaee312a99159e885","ref":"refs/heads/master","pushedAt":"2024-09-16T17:45:04.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: fix typo in property type annotation","shortMessageHtmlLink":"misc: fix typo in property type annotation"}},{"before":"304db395bf1b16d1b8c4db3278f38fcac3f020d1","after":"f3e8c1e09c0b947693cd40941d2ae5ab9b31bbd9","ref":"refs/heads/master","pushedAt":"2024-09-16T17:26:41.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"feat: add support for `JSON_FORCE_OBJECT` option in JSON normalizer\n\n```php\r\n(new \\CuyZ\\Valinor\\MapperBuilder())\r\n ->normalizer(Format::json())\r\n ->withOptions(JSON_FORCE_OBJECT)\r\n ->normalize(['foo', 'bar']);\r\n\r\n// {\"0\":\"foo\",\"1\":\"bar\"}\r\n```","shortMessageHtmlLink":"feat: add support for JSON_FORCE_OBJECT option in JSON normalizer"}},{"before":"4e0bc8b6a9ca4ce5350a8206f7c8d81664806a01","after":"304db395bf1b16d1b8c4db3278f38fcac3f020d1","ref":"refs/heads/master","pushedAt":"2024-09-16T17:05:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: change implicitly nullable parameter types","shortMessageHtmlLink":"misc: change implicitly nullable parameter types"}},{"before":null,"after":"594d5cd5183061d3f886c9dbc76c26f92ae8a8d0","ref":"refs/heads/fix/properly-handle-class-sharing-class-name-and-namespace-group-name","pushedAt":"2024-09-02T16:04:33.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: properly handle class sharing class name and namespace group name","shortMessageHtmlLink":"fix: properly handle class sharing class name and namespace group name"}},{"before":"85787b54aab5964cad4b59ac24e17e726c56fe80","after":null,"ref":"refs/heads/release/1.13.0","pushedAt":"2024-09-02T12:57:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"}},{"before":"e1142fec1d2980a528d260e318ee0ca4c2657766","after":"4e0bc8b6a9ca4ce5350a8206f7c8d81664806a01","ref":"refs/heads/master","pushedAt":"2024-09-02T12:57:33.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"release: version 1.13.0","shortMessageHtmlLink":"release: version 1.13.0"}},{"before":null,"after":"85787b54aab5964cad4b59ac24e17e726c56fe80","ref":"refs/heads/release/1.13.0","pushedAt":"2024-09-02T12:56:31.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"release: version 1.13.0","shortMessageHtmlLink":"release: version 1.13.0"}},{"before":"2150dcad4ce821bfe36c3718346ccc412e37832a","after":"e1142fec1d2980a528d260e318ee0ca4c2657766","ref":"refs/heads/master","pushedAt":"2024-09-02T12:44:59.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"test: add test for non-intersecting hashmap type constructors\n\nIn this test, Valinor considers two disjoint input types as colliding.\r\n\r\nSimilar to https://github.com/CuyZ/Valinor/pull/487, this scenario was\r\ndetected while trying to map multiple constructors for XML structures\r\nthat may present different data depending on singular/plural entries\r\nfound:\r\n\r\n```xml\r\n\r\n \r\n \r\n 123\r\n \r\n \r\n \r\n 456\r\n 789\r\n \r\n\r\n```\r\n\r\nIn #487, we attempted to map a single constructor using\r\n`array{foo: T|list}`, while in this patch, we found the issue because\r\nwe attempted to attack the problem by declaring separate constructors\r\nthat would work on `array{foo: T}` and `array{foo: list}` disjointly,\r\nbut failed to do so due to aggressive collision detection logic.\r\n\r\nInitially discovered by @Tigerman55","shortMessageHtmlLink":"test: add test for non-intersecting hashmap type constructors"}},{"before":"b08b89030ce1101145ecc6a208eb23dd79f3fa7c","after":null,"ref":"refs/heads/feat/better-object-constructor-narrowing","pushedAt":"2024-09-02T12:37:05.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"}},{"before":"ba22b5233e80f0ffbbe9591a5099b9dd62715eb8","after":"2150dcad4ce821bfe36c3718346ccc412e37832a","ref":"refs/heads/master","pushedAt":"2024-09-02T12:37:04.000Z","pushType":"pr_merge","commitsCount":3,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"feat: improve object constructors parameters types inferring\n\nThe collision system that checks object constructors parameters types is\nnow way more clever, as it no longer checks for parameters' names only.\nTypes are now also checked, and only true collision will be detected,\nfor instance when two constructors share a parameter with the same name\nand type.\n\nNote that when two parameters share the same name, the following type\npriority operates:\n\n1. Non-scalar type\n2. Integer type\n3. Float type\n4. String type\n5. Boolean type\n\nWith this change, the code below is now valid:\n\n```php\nfinal readonly class Money\n{\n private function __construct(\n public int $value,\n ) {}\n\n #[\\CuyZ\\Valinor\\Mapper\\Object\\Constructor]\n public static function fromInt(int $value): self\n {\n return new self($value);\n }\n\n #[\\CuyZ\\Valinor\\Mapper\\Object\\Constructor]\n public static function fromString(string $value): self\n {\n if (! preg_match('/^\\d+€$/', $value)) {\n throw new \\InvalidArgumentException('Invalid money format');\n }\n\n return new self((int)rtrim($value, '€'));\n }\n}\n\n$mapper = (new \\CuyZ\\Valinor\\MapperBuilder())->mapper();\n\n$mapper->map(Money::class, 42); // ✅\n$mapper->map(Money::class, '42€'); // ✅\n```","shortMessageHtmlLink":"feat: improve object constructors parameters types inferring"}},{"before":null,"after":"b08b89030ce1101145ecc6a208eb23dd79f3fa7c","ref":"refs/heads/feat/better-object-constructor-narrowing","pushedAt":"2024-09-02T12:24:27.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"feat: improve object constructors parameters types inferring\n\nThe collision system that checks object constructors parameters types is\nnow way more clever, as it no longer checks for parameters' names only.\nTypes are now also checked, and only true collision will be detected,\nfor instance when two constructors share a parameter with the same name\nand type.\n\nNote that when two parameters share the same name, the following type\npriority operates:\n\n1. Non-scalar type\n2. Integer type\n3. Float type\n4. String type\n5. Boolean type\n\nWith this change, the code below is now valid:\n\n```php\nfinal readonly class Money\n{\n private function __construct(\n public int $value,\n ) {}\n\n #[\\CuyZ\\Valinor\\Mapper\\Object\\Constructor]\n public static function fromInt(int $value): self\n {\n return new self($value);\n }\n\n #[\\CuyZ\\Valinor\\Mapper\\Object\\Constructor]\n public static function fromString(string $value): self\n {\n if (! preg_match('/^\\d+€$/', $value)) {\n throw new \\InvalidArgumentException('Invalid money format');\n }\n\n return new self((int)rtrim($value, '€'));\n }\n}\n\n$mapper = (new \\CuyZ\\Valinor\\MapperBuilder())->mapper();\n\n$mapper->map(Money::class, 42); // ✅\n$mapper->map(Money::class, '42€'); // ✅\n```","shortMessageHtmlLink":"feat: improve object constructors parameters types inferring"}},{"before":"69e0e3a5f1de6a5eedcfa4125d8639be91f0c303","after":"ba22b5233e80f0ffbbe9591a5099b9dd62715eb8","ref":"refs/heads/master","pushedAt":"2024-07-22T20:31:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: properly format empty object with JSON normalizer\n\nObjects that yield no value or have no property will now properly be\nformatted into `{}` instead of `[]`.","shortMessageHtmlLink":"fix: properly format empty object with JSON normalizer"}},{"before":"b1017ce55729f0698c7629d57a3d3a30c0f9bff3","after":"69e0e3a5f1de6a5eedcfa4125d8639be91f0c303","ref":"refs/heads/master","pushedAt":"2024-07-19T14:56:36.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: allow docblock for transformer callable type","shortMessageHtmlLink":"fix: allow docblock for transformer callable type"}},{"before":"2ff1d021bb006d8f8db1b3f1e703ee55bcee2187","after":"b1017ce55729f0698c7629d57a3d3a30c0f9bff3","ref":"refs/heads/master","pushedAt":"2024-07-19T14:52:44.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"feat: add support for `value-of` type\n\nThis type can be used as follows:\r\n\r\n```php\r\nenum Suit: string\r\n{\r\n case Hearts = 'H';\r\n case Diamonds = 'D';\r\n case Clubs = 'C';\r\n case Spades = 'S';\r\n}\r\n\r\n$suit = (new \\CuyZ\\Valinor\\MapperBuilder())\r\n ->mapper()\r\n ->map(Suit::class, 'D');\r\n\r\n// $suit === Suit::Diamonds\r\n```","shortMessageHtmlLink":"feat: add support for value-of<BackedEnum> type"}},{"before":"02bd2e5e0f0e7d4daf234852464085bcdd1a0eb2","after":"2ff1d021bb006d8f8db1b3f1e703ee55bcee2187","ref":"refs/heads/master","pushedAt":"2024-06-06T17:17:06.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"doc: fix some typos","shortMessageHtmlLink":"doc: fix some typos"}},{"before":"c481b0720fc361a4b8caad76ccdcc856fe7177cc","after":"02bd2e5e0f0e7d4daf234852464085bcdd1a0eb2","ref":"refs/heads/master","pushedAt":"2024-06-06T17:15:34.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"feat: add microseconds support to timestamp format\n\nPrior to this patch, this would require a custom constructor in the form\nof:\n\n```php\nstatic fn(float | int $timestamp): DateTimeImmutable => new\nDateTimeImmutable(sprintf(\"@%d\", $timestamp)),\n```\n\nThis bypasses the datetime format support of Valinor entirely. This is\nrequired because the library does not support floats as valid\nDateTimeInterface input values.\n\nThis commit adds support for floats and registers timestamp.microseconds\n(U.u) as a valid default format.","shortMessageHtmlLink":"feat: add microseconds support to timestamp format"}},{"before":"40e6fa340819961068b8be178e312a99c06cede2","after":"c481b0720fc361a4b8caad76ccdcc856fe7177cc","ref":"refs/heads/master","pushedAt":"2024-06-06T17:07:10.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"test: add tests for `Ds\\Collection` normalization","shortMessageHtmlLink":"test: add tests for Ds\\Collection normalization"}},{"before":"c5860f0e5b3f59f49900bfbb20ca4493916eca7a","after":"40e6fa340819961068b8be178e312a99c06cede2","ref":"refs/heads/master","pushedAt":"2024-04-24T12:14:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: handle interface generics","shortMessageHtmlLink":"fix: handle interface generics"}},{"before":"1803d094f08b256c64535f4f86e32ab35a07bbf1","after":"c5860f0e5b3f59f49900bfbb20ca4493916eca7a","ref":"refs/heads/master","pushedAt":"2024-04-24T12:08:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: do not override invalid variadic parameter type","shortMessageHtmlLink":"fix: do not override invalid variadic parameter type"}},{"before":"6fad94a46785dfb853c11c241e3f60bcf6a85ede","after":"1803d094f08b256c64535f4f86e32ab35a07bbf1","ref":"refs/heads/master","pushedAt":"2024-04-13T11:51:31.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: exclude unneeded attributes in class/function definitions\n\nThis change aims to reduce the memory usage, as well as the compiled\ncache size for classes that heavily rely on attributes that are not used\nby this library, for instance `OpenAPI` attributes.","shortMessageHtmlLink":"misc: exclude unneeded attributes in class/function definitions"}},{"before":"1278392757a4e9dc9eee2ab642c5700e83ccf982","after":"6fad94a46785dfb853c11c241e3f60bcf6a85ede","ref":"refs/heads/master","pushedAt":"2024-04-12T12:49:27.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: improve mapping performance for nullable union type\n\nThis adds a check within the loop for union type mapping, which will\r\nskip `NullType` as it was already handled in `CasterProxyNodeBuilder`.\r\n\r\nThis greatly improves performance as it removes a useless call to the\r\nwhole node building process.","shortMessageHtmlLink":"misc: improve mapping performance for nullable union type"}},{"before":"6942755865f91c80af8ea97fde2faa390478a6b8","after":"1278392757a4e9dc9eee2ab642c5700e83ccf982","ref":"refs/heads/master","pushedAt":"2024-04-07T20:44:05.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: properly handle nested local type aliases\n\nThe following annotation now works properly:\n\n```php\n/**\n * @phpstan-type Address = array{street?: string, city: string}\n * @phpstan-type User = array{name: non-empty-string, address: Address}\n */\nfinal class SomeClass\n{\n public function __construct(\n /** @var User */\n public $value,\n ) {}\n}\n\n(new \\CuyZ\\Valinor\\MapperBuilder())\n ->mapper()\n ->map(SomeClass::class, [\n 'name' => 'John Doe',\n 'address' => [\n 'street' => 'Bron-Yr-Aur',\n 'city' => 'SY20 8QA, Machynlleth',\n ],\n ]);\n ```","shortMessageHtmlLink":"fix: properly handle nested local type aliases"}},{"before":"86fb7b6303b15b54da6ac02ca8a7008b23c8bcff","after":"6942755865f91c80af8ea97fde2faa390478a6b8","ref":"refs/heads/master","pushedAt":"2024-04-07T15:26:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"fix: allow any constant in class constant type\n\nThe following annotation is now allowed:\n\n ```php\n final class SomeClass\n {\n public const FOO = 'foo';\n public const BAR = 42;\n }\n\n (new \\CuyZ\\Valinor\\MapperBuilder())\n ->mapper()\n ->map('SomeClass::*', 'foo'); // ✅\n```","shortMessageHtmlLink":"fix: allow any constant in class constant type"}},{"before":"d6616201e74e594f8e60ac7c5e070922584b3cad","after":"86fb7b6303b15b54da6ac02ca8a7008b23c8bcff","ref":"refs/heads/master","pushedAt":"2024-04-07T12:59:20.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: reorganize type resolver services\n\nThis is a major refactor of the classes used to resolve types from all\nplaces: `@var`, `@param`, `@return`, `@extends`, `@template`,\n`@phpstan-type`, `@phpstan-import-type`.\n\nThe goal was to remove remaining usages of regex to resolve the types,\nand to move all parsing logic in dedicated classes instead of god\nclasses like the (now deleted) `ReflectionTypeResolver` and `DocParser`\nservices.","shortMessageHtmlLink":"misc: reorganize type resolver services"}},{"before":"3bc40798a5ff64aee8a28509b73f7f84d5c66ac9","after":"d6616201e74e594f8e60ac7c5e070922584b3cad","ref":"refs/heads/master","pushedAt":"2024-04-05T08:12:24.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"test: add JSON decoding check for normalizer","shortMessageHtmlLink":"test: add JSON decoding check for normalizer"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xOFQxOTo1MTowNi4wMDAwMDBazwAAAAS6GyVv","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xOFQxOTo1MTowNi4wMDAwMDBazwAAAAS6GyVv","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNC0wNVQwODoxMjoyNC4wMDAwMDBazwAAAAQonzf1"}},"title":"Activity · CuyZ/Valinor"}