{"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:1712249131.0","currentOid":""},"activityList":{"items":[{"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"}},{"before":"cd5df97d45b2687b4a79bf01e4b03d7deee28dfa","after":"3bc40798a5ff64aee8a28509b73f7f84d5c66ac9","ref":"refs/heads/master","pushedAt":"2024-04-04T16:42:55.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.12.0","shortMessageHtmlLink":"release: version 1.12.0"}},{"before":"4e04201f2b52f0054ac18bce6ea50b5440645351","after":"cd5df97d45b2687b4a79bf01e4b03d7deee28dfa","ref":"refs/heads/master","pushedAt":"2024-04-04T16:31:35.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: allow JSON normalizer to set JSON formatting options\n\nBy default, the JSON normalizer will only use `JSON_THROW_ON_ERROR` to\r\nencode non-boolean scalar values. There might be use-cases where\r\nprojects will need flags like `JSON_JSON_PRESERVE_ZERO_FRACTION`.\r\n\r\nThis can be achieved by passing these flags to the new\r\n`JsonNormalizer::withOptions()` method:\r\n\r\n```php\r\nnamespace My\\App;\r\n\r\n$normalizer = (new \\CuyZ\\Valinor\\MapperBuilder())\r\n ->normalizer(\\CuyZ\\Valinor\\Normalizer\\Format::json())\r\n ->withOptions(\\JSON_PRESERVE_ZERO_FRACTION);\r\n\r\n$lowerManhattanAsJson = $normalizer->normalize(\r\n new \\My\\App\\Coordinates(\r\n longitude: 40.7128,\r\n latitude: -74.0000\r\n )\r\n);\r\n\r\n// `$lowerManhattanAsJson` is a valid JSON string representing the data:\r\n// {\"longitude\":40.7128,\"latitude\":-74.0000}\r\n```\r\n\r\nThe method accepts an int-mask of the following `JSON_*` constant\r\nrepresentations:\r\n\r\n- `JSON_HEX_QUOT`\r\n- `JSON_HEX_TAG`\r\n- `JSON_HEX_AMP`\r\n- `JSON_HEX_APOS`\r\n- `JSON_INVALID_UTF8_IGNORE`\r\n- `JSON_INVALID_UTF8_SUBSTITUTE`\r\n- `JSON_NUMERIC_CHECK`\r\n- `JSON_PRESERVE_ZERO_FRACTION`\r\n- `JSON_UNESCAPED_LINE_TERMINATORS`\r\n- `JSON_UNESCAPED_SLASHES`\r\n- `JSON_UNESCAPED_UNICODE`\r\n\r\n`JSON_THROW_ON_ERROR` is always enforced and thus is not accepted.\r\n\r\nSee official doc for more information:\r\nhttps://www.php.net/manual/en/json.constants.php","shortMessageHtmlLink":"feat: allow JSON normalizer to set JSON formatting options"}},{"before":"c4be75844bc71912fdbf34fac2523ca184d3c15f","after":"4e04201f2b52f0054ac18bce6ea50b5440645351","ref":"refs/heads/master","pushedAt":"2024-04-04T16:25:51.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":"qa: replace PHPStan ignore annotation by `phpstan-assert-if-true`","shortMessageHtmlLink":"qa: replace PHPStan ignore annotation by phpstan-assert-if-true"}},{"before":"c8174bfe46b23442f47f9954a04272eaf5757ea3","after":"c4be75844bc71912fdbf34fac2523ca184d3c15f","ref":"refs/heads/master","pushedAt":"2024-04-02T16:42:58.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 class tokens only when needed during lexing\n\nMajor refactor of how the lexer handles class/interface/enums, which\naims to avoid potentially expensive operations (like `class_exists`\nwhich can call the autoloader).\n\nThis results in a minor performance bump, and also fixes some issues\nconcerning shaped array keys matching class names.","shortMessageHtmlLink":"fix: handle class tokens only when needed during lexing"}},{"before":"4c62d87a68a7de4e60d070cb7298a19fd7ebad5a","after":"c8174bfe46b23442f47f9954a04272eaf5757ea3","ref":"refs/heads/master","pushedAt":"2024-04-02T16:12:20.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":"qa: add documentation comment on PHPStan extension","shortMessageHtmlLink":"qa: add documentation comment on PHPStan extension"}},{"before":"c8e204a4a3cdfc681e99f80e0c1632e663a32161","after":"4c62d87a68a7de4e60d070cb7298a19fd7ebad5a","ref":"refs/heads/master","pushedAt":"2024-04-01T13:56:33.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":"misc: rename internal class","shortMessageHtmlLink":"misc: rename internal class"}},{"before":"b5c460c3cdfe01f911c52e9e7a457742a0b11aa9","after":"c8e204a4a3cdfc681e99f80e0c1632e663a32161","ref":"refs/heads/master","pushedAt":"2024-03-30T17:52:15.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: load needed information only during interface inferring\n\nThis commit changes the way interface inferring is done.\n\nPreviously, the whole set of information for all interfaces was loaded\neverytime the library was used, which could lead to performance issue\nfor no reason.\n\nNow, when an interface must be inferred, only information about this\ninterface will be loaded.","shortMessageHtmlLink":"fix: load needed information only during interface inferring"}},{"before":"3af22d16f6a4034611859a5998e6d0317d61dc4f","after":"b5c460c3cdfe01f911c52e9e7a457742a0b11aa9","ref":"refs/heads/master","pushedAt":"2024-03-27T22:11:06.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 missing test for class declaring invalid type alias","shortMessageHtmlLink":"test: add missing test for class declaring invalid type alias"}},{"before":"5020d62e00e00fdb74ac26e83dd36b313e0a5ee1","after":"3af22d16f6a4034611859a5998e6d0317d61dc4f","ref":"refs/heads/master","pushedAt":"2024-03-27T20:35:49.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: handle type importation from interface\n\nAllows usage of `@phpstan-import-type` and `@psalm-import-type` from\ninterfaces:\n\n```php\n/**\n * @phpstan-type SomeAlias = array{foo: string, bar: int}\n */\ninterface InterfaceWithPhpStanLocalAlias { }\n\n/**\n * @phpstan-import-type SomeAlias from InterfaceWithPhpStanLocalAlias\n */\nfinal class SomeClass\n{\n /** @var SomeAlias */\n public $value;\n}\n\n(new \\CuyZ\\Valinor\\MapperBuilder())\n ->mapper()\n ->map(SomeClass::class, [\n 'foo' => 'bar',\n 'bar' => 42,\n ]);\n```","shortMessageHtmlLink":"feat: handle type importation from interface"}},{"before":"3f1d86f1bcb7f48f802e02cb50f449b589a68990","after":"5020d62e00e00fdb74ac26e83dd36b313e0a5ee1","ref":"refs/heads/master","pushedAt":"2024-03-27T20:12:54.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: allow mapping to `array-key` type","shortMessageHtmlLink":"feat: allow mapping to array-key type"}},{"before":"c9dc975357319ae77d352e17979888b08690ddbc","after":"3f1d86f1bcb7f48f802e02cb50f449b589a68990","ref":"refs/heads/master","pushedAt":"2024-03-27T13:22:48.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.11.0","shortMessageHtmlLink":"release: version 1.11.0"}},{"before":"19470614fa99b97341975a44fdf034ff6e9a6f6d","after":"c9dc975357319ae77d352e17979888b08690ddbc","ref":"refs/heads/master","pushedAt":"2024-03-27T13:00: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":"fix: strengthen type tokens extraction\n\nThis commit refactors the way tokens are extracted from a raw type\nstring, by using a better approach that consists in splitting first into\ntokens, and then detecting texts (aka string values).\n\nThis aims to fix edge cases like the following example, where the `$bar`\nannotation would previously have confused the lexer, leading to the type\nof `$foo` being used for `$bar` as well.\n\n```php\nfinal class SomeClass\n{\n /**\n * @param non-empty-string $foo Some description containing $bar\n * which is the next parameter name\n */\n public function __construct(\n public string $foo,\n public int $bar,\n ) {}\n}\n```","shortMessageHtmlLink":"fix: strengthen type tokens extraction"}},{"before":"0f5e96e6a7567465c623914d038342ba56875595","after":"19470614fa99b97341975a44fdf034ff6e9a6f6d","ref":"refs/heads/master","pushedAt":"2024-03-27T12:51:17.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 unresolvable type during mapping\n\nThis change brings two enhancements:\n\n- When mapping to a structure that contains a nested unresolvable type,\n for instance a doc-block type that does not match the native type, the\n mapper will detect it and throw a proper exception (it used to just\n crash on a badly designed assertion).\n- Unresolvable types that are not used during mapping, for instance\n parameters of methods that are not used by the mapper will no longer\n throw an exception even if not needed by the library. Instead, an\n unresolvable type is assigned to these invalid properties/parameters/\n return types.","shortMessageHtmlLink":"fix: properly handle nested unresolvable type during mapping"}},{"before":"37993b64a6eb04dc0aee79e03f2ddb4f86ff9c3a","after":"0f5e96e6a7567465c623914d038342ba56875595","ref":"refs/heads/master","pushedAt":"2024-03-24T18:43:10.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 class type with matching name and namespace","shortMessageHtmlLink":"fix: properly handle class type with matching name and namespace"}},{"before":"0f0e35e71925bfb31ecd916766aca5492f12863d","after":"37993b64a6eb04dc0aee79e03f2ddb4f86ff9c3a","ref":"refs/heads/master","pushedAt":"2024-03-17T21:53:29.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":"misc: separate native type and docblock type for property and parameter","shortMessageHtmlLink":"misc: separate native type and docblock type for property and parameter"}},{"before":"4f555d9bc9de996b5c577396076b674e17fbb429","after":"0f0e35e71925bfb31ecd916766aca5492f12863d","ref":"refs/heads/master","pushedAt":"2024-03-17T21:49:09.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: reduce number of calls to class autoloader during type parsing\n\nThis change aims to reduce the number of calls made to the global class\nautoloader, by limiting the class existence checks during type parsing.","shortMessageHtmlLink":"misc: reduce number of calls to class autoloader during type parsing"}},{"before":"f73158657c8e876e8b3142d6064878b6af1c3525","after":"4f555d9bc9de996b5c577396076b674e17fbb429","ref":"refs/heads/master","pushedAt":"2024-03-17T16:13:10.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 `ArrayObject` normalization","shortMessageHtmlLink":"fix: properly handle ArrayObject normalization"}},{"before":"79fc823088f5d1cf74bbfa8883ed60a771d215c8","after":null,"ref":"refs/heads/feat/better-union-narrowing","pushedAt":"2024-03-17T15:39:42.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":"86d021a2fdd9932554a2e41a08d19d8801371f6f","after":"f73158657c8e876e8b3142d6064878b6af1c3525","ref":"refs/heads/master","pushedAt":"2024-03-17T15:39: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: improve union type narrowing during mapping\n\nThe algorithm used by the mapper to narrow a union type has been greatly\r\nimproved, and should cover more edge-cases that would previously prevent\r\nthe mapper from performing well.\r\n\r\nIf an interface, a class or a shaped array is matched by the input, it\r\nwill take precedence over arrays or scalars.\r\n\r\n```php\r\n(new \\CuyZ\\Valinor\\MapperBuilder())\r\n    ->mapper()\r\n    ->map(\r\n        signature: 'array|' . Color::class,\r\n        source: [\r\n            'red' => 255,\r\n            'green' => 128,\r\n            'blue' => 64,\r\n        ],\r\n    ); // Returns an instance of `Color`\r\n```\r\n\r\nWhen superfluous keys are allowed, if the input matches several\r\ninterfaces, classes or shaped array, the one with the most children node\r\nwill be prioritized, as it is considered the most specific type:\r\n\r\n```php\r\n(new \\CuyZ\\Valinor\\MapperBuilder())\r\n    ->allowSuperfluousKeys()\r\n    ->mapper()\r\n    ->map(\r\n        // Even if the first shaped array matches the input, the second one is\r\n        // used because it's more specific.\r\n        signature: 'array{foo: int}|array{foo: int, bar: int}',\r\n        source: [\r\n            'foo' => 42,\r\n            'bar' => 1337,\r\n        ],\r\n    );\r\n```\r\n\r\nIf the input matches several types within the union, a collision will\r\noccur and cause the mapper to fail:\r\n\r\n```php\r\n(new \\CuyZ\\Valinor\\MapperBuilder())\r\n    ->mapper()\r\n    ->map(\r\n        // Even if the first shaped array matches the input, the second one is\r\n        // used because it's more specific.\r\n        signature: 'array{red: int, green: int, blue: int}|' . Color::class,\r\n        source: [\r\n            'red' => 255,\r\n            'green' => 128,\r\n            'blue' => 64,\r\n        ],\r\n    );\r\n\r\n// ⚠️ Invalid value array{red: 255, green: 128, blue: 64}, it matches at\r\n//    least two types from union.\r\n```","shortMessageHtmlLink":"feat: improve union type narrowing during mapping"}},{"before":"fb7463fd416a7ee84d9e234442e6bd4cecdadc18","after":"79fc823088f5d1cf74bbfa8883ed60a771d215c8","ref":"refs/heads/feat/better-union-narrowing","pushedAt":"2024-03-17T15:28:01.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":"test: add union mapping test case with superfluous key for http response\n\nSee #356","shortMessageHtmlLink":"test: add union mapping test case with superfluous key for http response"}},{"before":"59520c13258229401084fbc3accc721bff40c83e","after":"fb7463fd416a7ee84d9e234442e6bd4cecdadc18","ref":"refs/heads/feat/better-union-narrowing","pushedAt":"2024-03-17T15:17:31.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":"test: add union mapping test case for http response\n\nSee #356","shortMessageHtmlLink":"test: add union mapping test case for http response"}},{"before":"efd6267eb8e4388559fecb6ae9475429f3d1ca54","after":"59520c13258229401084fbc3accc721bff40c83e","ref":"refs/heads/feat/better-union-narrowing","pushedAt":"2024-03-17T15:13:02.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"romm","name":"Romain Canon","path":"/romm","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/6342901?s=80&v=4"},"commit":{"message":"misc: enhance union error message","shortMessageHtmlLink":"misc: enhance union error message"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEORcq4wA","startCursor":null,"endCursor":null}},"title":"Activity · CuyZ/Valinor"}