{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":433408321,"defaultBranch":"master","name":"Valinor","ownerLogin":"romm","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2021-11-30T11:41:05.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/6342901?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1726689067.0","currentOid":""},"activityList":{"items":[{"before":"a9356b2918eff6d6503c227395cf1a7e01720760","after":null,"ref":"refs/heads/fix/cache-corruption-when-normalizing-enum","pushedAt":"2024-09-18T19:51:07.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":"8c05c4631cc43b772de6cbf16feb2981aedcc8e0","after":"a9356b2918eff6d6503c227395cf1a7e01720760","ref":"refs/heads/fix/cache-corruption-when-normalizing-enum","pushedAt":"2024-09-18T19:50:03.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":"fix: prevent cache corruption when normalizing and mapping to enum","shortMessageHtmlLink":"fix: prevent cache corruption when normalizing and mapping to enum"}},{"before":null,"after":"8c05c4631cc43b772de6cbf16feb2981aedcc8e0","ref":"refs/heads/fix/cache-corruption-when-normalizing-enum","pushedAt":"2024-09-18T19:48:01.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: prevent cache corruption when normalizing and mapping to enum","shortMessageHtmlLink":"fix: prevent cache corruption when normalizing and mapping to enum"}},{"before":"2ff1d021bb006d8f8db1b3f1e703ee55bcee2187","after":"e1142fec1d2980a528d260e318ee0ca4c2657766","ref":"refs/heads/master","pushedAt":"2024-09-02T12:46:29.000Z","pushType":"push","commitsCount":7,"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":"5ebcb276a699522f40f418026b5e1219be5fd73a","after":null,"ref":"refs/heads/fix/empty-iterable-object","pushedAt":"2024-07-22T20:31:47.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":null,"after":"5ebcb276a699522f40f418026b5e1219be5fd73a","ref":"refs/heads/fix/empty-iterable-object","pushedAt":"2024-07-22T20:30:34.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 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":"6fad94a46785dfb853c11c241e3f60bcf6a85ede","after":"2ff1d021bb006d8f8db1b3f1e703ee55bcee2187","ref":"refs/heads/master","pushedAt":"2024-06-06T17:28:12.000Z","pushType":"push","commitsCount":7,"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":"cfb125a2e188746c765ecb35e2c54b1cf29b2391","after":null,"ref":"refs/heads/fix/handle-interface-generics","pushedAt":"2024-04-24T12:14:14.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":"f8a1b9ebd710d68c427a97046f29ad9fde28f183","after":"cfb125a2e188746c765ecb35e2c54b1cf29b2391","ref":"refs/heads/fix/handle-interface-generics","pushedAt":"2024-04-24T12:08:59.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":"fix: handle interface generics","shortMessageHtmlLink":"fix: handle interface generics"}},{"before":"3fd352c5564739a0fb8dc78ee22bc4152aaaa93a","after":null,"ref":"refs/heads/fix/unresolvable-variadic-type","pushedAt":"2024-04-24T12:08:38.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":null,"after":"f8a1b9ebd710d68c427a97046f29ad9fde28f183","ref":"refs/heads/fix/handle-interface-generics","pushedAt":"2024-04-24T12:08:29.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: handle interface generics","shortMessageHtmlLink":"fix: handle interface generics"}},{"before":null,"after":"3fd352c5564739a0fb8dc78ee22bc4152aaaa93a","ref":"refs/heads/fix/unresolvable-variadic-type","pushedAt":"2024-04-24T11:50:06.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: do not override invalid variadic parameter type","shortMessageHtmlLink":"fix: do not override invalid variadic parameter type"}},{"before":"5a75ad873d1733a33215b97d0ff54057c95b0b31","after":null,"ref":"refs/heads/misc/exclude-unneeded-attributes","pushedAt":"2024-04-13T11:51:32.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":"028bac85dbb781951839866a75edb4ab284f171f","after":"c087e754a6f09e6758355c2601f8ef14205f89b4","ref":"refs/heads/feat/handle-datetimezone-in-datetime-constructor","pushedAt":"2024-04-12T15:38:16.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":"feat: add datetime constructor with timezone handling\n\nIt is now possible to use the following signature to map to a datetime:\n`array{datetime: non-empty-string|int, timezone: \\DateTimeZone}`.\n\n```php\n(new \\CuyZ\\Valinor\\MapperBuilder())\n ->mapper()\n ->map(\\DateTimeInterface::class, [\n 'datetime' => '2024-03-28T21:12:27+00:00',\n 'timezone' => 'America/New_York',\n ]);\n```","shortMessageHtmlLink":"feat: add datetime constructor with timezone handling"}},{"before":null,"after":"5a75ad873d1733a33215b97d0ff54057c95b0b31","ref":"refs/heads/misc/exclude-unneeded-attributes","pushedAt":"2024-04-12T15:31: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":"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":"86fb7b6303b15b54da6ac02ca8a7008b23c8bcff","after":"6fad94a46785dfb853c11c241e3f60bcf6a85ede","ref":"refs/heads/master","pushedAt":"2024-04-12T14:54:02.000Z","pushType":"push","commitsCount":3,"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":"80734051d1bdcf3df29fddce142e89a0ea6ca336","after":null,"ref":"refs/heads/fix/nested-type-alias","pushedAt":"2024-04-07T20:44:06.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":"60e0329e295774f0e488e22b3ec8a5218f0e265a","after":"80734051d1bdcf3df29fddce142e89a0ea6ca336","ref":"refs/heads/fix/nested-type-alias","pushedAt":"2024-04-07T20:42:58.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":"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":null,"after":"60e0329e295774f0e488e22b3ec8a5218f0e265a","ref":"refs/heads/fix/nested-type-alias","pushedAt":"2024-04-07T20:39:28.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 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 ->allowSuperfluousKeys()\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":"5742f57680b23b8647c355bf8577c7b80ec78898","after":null,"ref":"refs/heads/fix/allow-any-class-const","pushedAt":"2024-04-07T20:39: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":null,"after":"5742f57680b23b8647c355bf8577c7b80ec78898","ref":"refs/heads/fix/allow-any-class-const","pushedAt":"2024-04-07T20:37:32.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 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 ->allowSuperfluousKeys()\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":"5890797ed435fd8b74ff49e00e23bd8f44b3a75a","after":null,"ref":"refs/heads/fix/allow-any-class-const","pushedAt":"2024-04-07T15:26:39.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":null,"after":"5890797ed435fd8b74ff49e00e23bd8f44b3a75a","ref":"refs/heads/fix/allow-any-class-const","pushedAt":"2024-04-07T15:25:09.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: 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-07T15:12:40.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: 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":"c3e16f00eb5d56d73a17d45cb2d39c24569eb917","after":null,"ref":"refs/heads/misc/refactor-type-resolvers","pushedAt":"2024-04-07T12:59:20.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":null,"after":"c3e16f00eb5d56d73a17d45cb2d39c24569eb917","ref":"refs/heads/misc/refactor-type-resolvers","pushedAt":"2024-04-07T12:55:29.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":"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":"cd5df97d45b2687b4a79bf01e4b03d7deee28dfa","after":"d6616201e74e594f8e60ac7c5e070922584b3cad","ref":"refs/heads/master","pushedAt":"2024-04-05T10:24:34.000Z","pushType":"push","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 JSON decoding check for normalizer","shortMessageHtmlLink":"test: add JSON decoding check for normalizer"}},{"before":"2b6195f3fafe61085490077205261bf8eb8a8294","after":null,"ref":"refs/heads/test/add-json-decode-test","pushedAt":"2024-04-05T08:12:25.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":null,"after":"2b6195f3fafe61085490077205261bf8eb8a8294","ref":"refs/heads/test/add-json-decode-test","pushedAt":"2024-04-05T06:06:23.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":"test: add JSON decoding check for normalizer","shortMessageHtmlLink":"test: add JSON decoding check for normalizer"}},{"before":"e97c4f5d586fb10251215495bf56ba5c1aef0275","after":null,"ref":"refs/heads/release/1.12.0","pushedAt":"2024-04-04T16:42:56.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"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xOFQxOTo1MTowNy4wMDAwMDBazwAAAAS6GyYP","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xOFQxOTo1MTowNy4wMDAwMDBazwAAAAS6GyYP","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNC0wNFQxNjo0Mjo1Ni4wMDAwMDBazwAAAAQoBpQz"}},"title":"Activity · romm/Valinor"}