[{"data":1,"prerenderedAt":2034},["ShallowReactive",2],{"navigation_docs":3,"-testing":111,"-testing-surround":2029},[4,20,30,66,82,89,96],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15],{"title":11,"path":12,"stem":13,"icon":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":16,"path":17,"stem":18,"icon":19},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F2.quick-start","i-lucide-rocket",{"title":21,"icon":22,"path":23,"stem":24,"children":25,"page":6},"Concepts","i-lucide-compass","\u002Fconcepts","2.concepts",[26],{"title":27,"path":28,"stem":29,"icon":22},"How it works","\u002Fconcepts\u002Fhow-it-works","2.concepts\u002F1.how-it-works",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":6},"Essentials","i-lucide-book-open","\u002Fessentials","3.essentials",[36,41,46,51,56,61],{"title":37,"path":38,"stem":39,"icon":40},"Sources","\u002Fessentials\u002Fsources","3.essentials\u002F1.sources","i-lucide-layers",{"title":42,"path":43,"stem":44,"icon":45},"Filament UI","\u002Fessentials\u002Ffilament-ui","3.essentials\u002F2.filament-ui","i-lucide-layout-dashboard",{"title":47,"path":48,"stem":49,"icon":50},"Refining the timeline","\u002Fessentials\u002Frefining-the-timeline","3.essentials\u002F3.refining-the-timeline","i-lucide-filter",{"title":52,"path":53,"stem":54,"icon":55},"Customization","\u002Fessentials\u002Fcustomization","3.essentials\u002F4.customization","i-lucide-paintbrush",{"title":57,"path":58,"stem":59,"icon":60},"Caching","\u002Fessentials\u002Fcaching","3.essentials\u002F5.caching","i-lucide-database",{"title":62,"path":63,"stem":64,"icon":65},"Configuration","\u002Fessentials\u002Fconfiguration","3.essentials\u002F6.configuration","i-lucide-settings",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":6},"Recipes","i-lucide-chef-hat","\u002Frecipes","4.recipes",[72,77],{"title":73,"path":74,"stem":75,"icon":76},"CRM person feed","\u002Frecipes\u002Fcrm-person-feed","4.recipes\u002F1.crm-person-feed","i-lucide-users",{"title":78,"path":79,"stem":80,"icon":81},"Audit log for admins","\u002Frecipes\u002Faudit-log-for-admins","4.recipes\u002F2.audit-log-for-admins","i-lucide-shield",{"title":83,"path":84,"stem":85,"children":86,"icon":88},"Testing","\u002Ftesting","5.testing\u002F1.index",[87],{"title":83,"path":84,"stem":85,"icon":88},"i-lucide-flask-conical",{"title":90,"path":91,"stem":92,"children":93,"icon":95},"Troubleshooting","\u002Ftroubleshooting","6.troubleshooting\u002F1.index",[94],{"title":90,"path":91,"stem":92,"icon":95},"i-lucide-life-buoy",{"title":97,"path":98,"stem":99,"children":100,"page":6},"Community","\u002Fcommunity","7.community",[101,106],{"title":102,"path":103,"stem":104,"icon":105},"Contributing","\u002Fcommunity\u002Fcontributing","7.community\u002F1.contributing","i-lucide-heart-handshake",{"title":107,"path":108,"stem":109,"icon":110},"License","\u002Fcommunity\u002Flicense","7.community\u002F2.license","i-lucide-scale",{"id":112,"title":83,"body":113,"description":2020,"extension":2021,"links":2022,"meta":2023,"navigation":2024,"path":84,"seo":2025,"stem":85,"__hash__":2028},"docs\u002F5.testing\u002F1.index.md",{"type":114,"value":115,"toc":2009},"minimark",[116,139,144,147,266,273,399,406,421,618,628,632,646,826,840,844,854,1001,1012,1016,1022,1380,1420,1427,1436,1894,1914,1969,1973,2005],[117,118,119,120,124,125,128,129,138],"p",{},"The package's own test suite uses Pest 4 with ",[121,122,123],"code",{},"pest-plugin-laravel"," and ",[121,126,127],{},"pest-plugin-livewire"," — the same plugins your consumer app already has if it tests Filament. Nothing extra to install. This page covers patterns for testing the timeline inside your application; for testing the package itself, see ",[130,131,135],"a",{"href":132,"rel":133},"https:\u002F\u002Fgithub.com\u002FRelaticle\u002Factivity-log\u002Ftree\u002Fmain\u002Ftests\u002FFeature",[134],"nofollow",[121,136,137],{},"tests\u002FFeature\u002F"," in the repo.",[140,141,143],"h2",{"id":142},"setup","Setup",[117,145,146],{},"The base case in your consumer app is the standard Laravel test scaffold:",[148,149,154],"pre",{"className":150,"code":151,"language":152,"meta":153,"style":153},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F tests\u002FPest.php\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Tests\\TestCase;\n\nuses(TestCase::class, RefreshDatabase::class)->in('Feature');\n","php","",[121,155,156,165,195,210,217],{"__ignoreMap":153},[157,158,161],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"sHwdD","\u002F\u002F tests\u002FPest.php\n",[157,166,168,172,176,180,183,185,187,189,192],{"class":159,"line":167},2,[157,169,171],{"class":170},"sbssI","use",[157,173,175],{"class":174},"sTEyZ"," Illuminate",[157,177,179],{"class":178},"sMK4o","\\",[157,181,182],{"class":174},"Foundation",[157,184,179],{"class":178},[157,186,83],{"class":174},[157,188,179],{"class":178},[157,190,191],{"class":174},"RefreshDatabase",[157,193,194],{"class":178},";\n",[157,196,198,200,203,205,208],{"class":159,"line":197},3,[157,199,171],{"class":170},[157,201,202],{"class":174}," Tests",[157,204,179],{"class":178},[157,206,207],{"class":174},"TestCase",[157,209,194],{"class":178},[157,211,213],{"class":159,"line":212},4,[157,214,216],{"emptyLinePlaceholder":215},true,"\n",[157,218,220,224,227,230,233,236,239,242,244,246,249,252,254,257,261,263],{"class":159,"line":219},5,[157,221,223],{"class":222},"s2Zo4","uses",[157,225,226],{"class":178},"(",[157,228,207],{"class":229},"sBMFI",[157,231,232],{"class":178},"::",[157,234,235],{"class":170},"class",[157,237,238],{"class":178},",",[157,240,241],{"class":229}," RefreshDatabase",[157,243,232],{"class":178},[157,245,235],{"class":170},[157,247,248],{"class":178},")->",[157,250,251],{"class":222},"in",[157,253,226],{"class":178},[157,255,256],{"class":178},"'",[157,258,260],{"class":259},"sfazB","Feature",[157,262,256],{"class":178},[157,264,265],{"class":178},");\n",[117,267,268,269,272],{},"A typical ",[121,270,271],{},"beforeEach"," for any test that touches the timeline UI logs in an admin and creates the record under test:",[148,274,276],{"className":150,"code":275,"language":152,"meta":153,"style":153},"use App\\Models\\Person;\nuse App\\Models\\User;\n\nbeforeEach(function (): void {\n    $this->actingAs(User::factory()->admin()->create());\n    $this->record = Person::factory()->create();\n});\n",[121,277,278,297,314,318,337,368,393],{"__ignoreMap":153},[157,279,280,282,285,287,290,292,295],{"class":159,"line":160},[157,281,171],{"class":170},[157,283,284],{"class":174}," App",[157,286,179],{"class":178},[157,288,289],{"class":174},"Models",[157,291,179],{"class":178},[157,293,294],{"class":174},"Person",[157,296,194],{"class":178},[157,298,299,301,303,305,307,309,312],{"class":159,"line":167},[157,300,171],{"class":170},[157,302,284],{"class":174},[157,304,179],{"class":178},[157,306,289],{"class":174},[157,308,179],{"class":178},[157,310,311],{"class":174},"User",[157,313,194],{"class":178},[157,315,316],{"class":159,"line":197},[157,317,216],{"emptyLinePlaceholder":215},[157,319,320,322,324,328,331,334],{"class":159,"line":212},[157,321,271],{"class":222},[157,323,226],{"class":178},[157,325,327],{"class":326},"spNyl","function",[157,329,330],{"class":178}," ():",[157,332,333],{"class":170}," void",[157,335,336],{"class":178}," {\n",[157,338,339,342,345,347,349,351,354,357,360,362,365],{"class":159,"line":219},[157,340,341],{"class":178},"    $this->",[157,343,344],{"class":222},"actingAs",[157,346,226],{"class":178},[157,348,311],{"class":229},[157,350,232],{"class":178},[157,352,353],{"class":222},"factory",[157,355,356],{"class":178},"()->",[157,358,359],{"class":222},"admin",[157,361,356],{"class":178},[157,363,364],{"class":222},"create",[157,366,367],{"class":178},"());\n",[157,369,371,373,376,379,382,384,386,388,390],{"class":159,"line":370},6,[157,372,341],{"class":178},[157,374,375],{"class":174},"record ",[157,377,378],{"class":178},"=",[157,380,381],{"class":229}," Person",[157,383,232],{"class":178},[157,385,353],{"class":222},[157,387,356],{"class":178},[157,389,364],{"class":222},[157,391,392],{"class":178},"();\n",[157,394,396],{"class":159,"line":395},7,[157,397,398],{"class":178},"});\n",[140,400,402,403],{"id":401},"testing-the-infolist-via-livewire","Testing the infolist via ",[121,404,405],{},"livewire()",[117,407,408,409,412,413,416,417,420],{},"Mount the Filament ",[121,410,411],{},"ViewRecord"," page that hosts your ",[121,414,415],{},"ActivityLog::make()"," component, mutate the record so spatie writes an activity row, and assert the rendered output. The built-in ",[121,418,419],{},"ActivityLogRenderer"," emits the diff sentence, so assert against the new value:",[148,422,424],{"className":150,"code":423,"language":152,"meta":153,"style":153},"use App\\Filament\\Resources\\People\\Pages\\ViewPerson;\n\nuse function Pest\\Livewire\\livewire;\n\nit('renders an entry on the person view page after an update', function (): void {\n    $this->record->update(['name' => 'Updated name']);\n\n    livewire(ViewPerson::class, ['record' => $this->record->getKey()])\n        ->assertSeeHtml('Updated name');\n});\n",[121,425,426,459,463,485,489,513,550,554,594,613],{"__ignoreMap":153},[157,427,428,430,432,434,437,439,442,444,447,449,452,454,457],{"class":159,"line":160},[157,429,171],{"class":170},[157,431,284],{"class":174},[157,433,179],{"class":178},[157,435,436],{"class":174},"Filament",[157,438,179],{"class":178},[157,440,441],{"class":174},"Resources",[157,443,179],{"class":178},[157,445,446],{"class":174},"People",[157,448,179],{"class":178},[157,450,451],{"class":174},"Pages",[157,453,179],{"class":178},[157,455,456],{"class":174},"ViewPerson",[157,458,194],{"class":178},[157,460,461],{"class":159,"line":167},[157,462,216],{"emptyLinePlaceholder":215},[157,464,465,467,470,473,475,478,480,483],{"class":159,"line":197},[157,466,171],{"class":170},[157,468,469],{"class":326}," function",[157,471,472],{"class":174}," Pest",[157,474,179],{"class":178},[157,476,477],{"class":174},"Livewire",[157,479,179],{"class":178},[157,481,482],{"class":174},"livewire",[157,484,194],{"class":178},[157,486,487],{"class":159,"line":212},[157,488,216],{"emptyLinePlaceholder":215},[157,490,491,494,496,498,501,503,505,507,509,511],{"class":159,"line":219},[157,492,493],{"class":222},"it",[157,495,226],{"class":178},[157,497,256],{"class":178},[157,499,500],{"class":259},"renders an entry on the person view page after an update",[157,502,256],{"class":178},[157,504,238],{"class":178},[157,506,469],{"class":326},[157,508,330],{"class":178},[157,510,333],{"class":170},[157,512,336],{"class":178},[157,514,515,517,520,523,526,529,531,534,536,539,542,545,547],{"class":159,"line":370},[157,516,341],{"class":178},[157,518,519],{"class":174},"record",[157,521,522],{"class":178},"->",[157,524,525],{"class":222},"update",[157,527,528],{"class":178},"([",[157,530,256],{"class":178},[157,532,533],{"class":259},"name",[157,535,256],{"class":178},[157,537,538],{"class":178}," =>",[157,540,541],{"class":178}," '",[157,543,544],{"class":259},"Updated name",[157,546,256],{"class":178},[157,548,549],{"class":178},"]);\n",[157,551,552],{"class":159,"line":395},[157,553,216],{"emptyLinePlaceholder":215},[157,555,557,560,562,564,566,568,570,573,575,577,579,581,584,586,588,591],{"class":159,"line":556},8,[157,558,559],{"class":222},"    livewire",[157,561,226],{"class":178},[157,563,456],{"class":229},[157,565,232],{"class":178},[157,567,235],{"class":170},[157,569,238],{"class":178},[157,571,572],{"class":178}," [",[157,574,256],{"class":178},[157,576,519],{"class":259},[157,578,256],{"class":178},[157,580,538],{"class":178},[157,582,583],{"class":178}," $this->",[157,585,519],{"class":174},[157,587,522],{"class":178},[157,589,590],{"class":222},"getKey",[157,592,593],{"class":178},"()])\n",[157,595,597,600,603,605,607,609,611],{"class":159,"line":596},9,[157,598,599],{"class":178},"        ->",[157,601,602],{"class":222},"assertSeeHtml",[157,604,226],{"class":178},[157,606,256],{"class":178},[157,608,544],{"class":259},[157,610,256],{"class":178},[157,612,265],{"class":178},[157,614,616],{"class":159,"line":615},10,[157,617,398],{"class":178},[117,619,620,621,623,624,627],{},"If you've registered a custom renderer (see ",[130,622,53],{"href":53},"), assert against your specific markup instead — the ",[121,625,626],{},"assertSeeHtml()"," target should match what your renderer outputs, not the diff sentence.",[140,629,631],{"id":630},"testing-the-relation-manager","Testing the relation manager",[117,633,634,635,638,639,124,642,645],{},"The package's own ",[121,636,637],{},"RelationManagerTest.php"," asserts the static configuration surface; your consumer-app test should mount the relation manager against an owner record and a host page. Filament requires both ",[121,640,641],{},"ownerRecord",[121,643,644],{},"pageClass",":",[148,647,649],{"className":150,"code":648,"language":152,"meta":153,"style":153},"use App\\Filament\\Resources\\People\\Pages\\EditPerson;\nuse Relaticle\\ActivityLog\\Filament\\RelationManagers\\ActivityLogRelationManager;\n\nuse function Pest\\Livewire\\livewire;\n\nit('mounts the activity log relation manager for a record', function (): void {\n    livewire(ActivityLogRelationManager::class, [\n        'ownerRecord' => $this->record,\n        'pageClass' => EditPerson::class,\n    ])->assertSuccessful();\n});\n",[121,650,651,680,708,712,730,734,757,774,792,811,821],{"__ignoreMap":153},[157,652,653,655,657,659,661,663,665,667,669,671,673,675,678],{"class":159,"line":160},[157,654,171],{"class":170},[157,656,284],{"class":174},[157,658,179],{"class":178},[157,660,436],{"class":174},[157,662,179],{"class":178},[157,664,441],{"class":174},[157,666,179],{"class":178},[157,668,446],{"class":174},[157,670,179],{"class":178},[157,672,451],{"class":174},[157,674,179],{"class":178},[157,676,677],{"class":174},"EditPerson",[157,679,194],{"class":178},[157,681,682,684,687,689,692,694,696,698,701,703,706],{"class":159,"line":167},[157,683,171],{"class":170},[157,685,686],{"class":174}," Relaticle",[157,688,179],{"class":178},[157,690,691],{"class":174},"ActivityLog",[157,693,179],{"class":178},[157,695,436],{"class":174},[157,697,179],{"class":178},[157,699,700],{"class":174},"RelationManagers",[157,702,179],{"class":178},[157,704,705],{"class":174},"ActivityLogRelationManager",[157,707,194],{"class":178},[157,709,710],{"class":159,"line":197},[157,711,216],{"emptyLinePlaceholder":215},[157,713,714,716,718,720,722,724,726,728],{"class":159,"line":212},[157,715,171],{"class":170},[157,717,469],{"class":326},[157,719,472],{"class":174},[157,721,179],{"class":178},[157,723,477],{"class":174},[157,725,179],{"class":178},[157,727,482],{"class":174},[157,729,194],{"class":178},[157,731,732],{"class":159,"line":219},[157,733,216],{"emptyLinePlaceholder":215},[157,735,736,738,740,742,745,747,749,751,753,755],{"class":159,"line":370},[157,737,493],{"class":222},[157,739,226],{"class":178},[157,741,256],{"class":178},[157,743,744],{"class":259},"mounts the activity log relation manager for a record",[157,746,256],{"class":178},[157,748,238],{"class":178},[157,750,469],{"class":326},[157,752,330],{"class":178},[157,754,333],{"class":170},[157,756,336],{"class":178},[157,758,759,761,763,765,767,769,771],{"class":159,"line":395},[157,760,559],{"class":222},[157,762,226],{"class":178},[157,764,705],{"class":229},[157,766,232],{"class":178},[157,768,235],{"class":170},[157,770,238],{"class":178},[157,772,773],{"class":178}," [\n",[157,775,776,779,781,783,785,787,789],{"class":159,"line":556},[157,777,778],{"class":178},"        '",[157,780,641],{"class":259},[157,782,256],{"class":178},[157,784,538],{"class":178},[157,786,583],{"class":178},[157,788,519],{"class":174},[157,790,791],{"class":178},",\n",[157,793,794,796,798,800,802,805,807,809],{"class":159,"line":596},[157,795,778],{"class":178},[157,797,644],{"class":259},[157,799,256],{"class":178},[157,801,538],{"class":178},[157,803,804],{"class":229}," EditPerson",[157,806,232],{"class":178},[157,808,235],{"class":170},[157,810,791],{"class":178},[157,812,813,816,819],{"class":159,"line":615},[157,814,815],{"class":178},"    ])->",[157,817,818],{"class":222},"assertSuccessful",[157,820,392],{"class":178},[157,822,824],{"class":159,"line":823},11,[157,825,398],{"class":178},[117,827,828,829,831,832,835,836,839],{},"Adjust ",[121,830,644],{}," to whichever resource page hosts the relation manager (typically ",[121,833,834],{},"Edit*"," or ",[121,837,838],{},"View*",").",[140,841,843],{"id":842},"testing-the-header-action","Testing the header action",[117,845,846,847,850,851,645],{},"The default action name is ",[121,848,849],{},"'activityLog'"," — that's the string you pass to ",[121,852,853],{},"callAction()",[148,855,857],{"className":150,"code":856,"language":152,"meta":153,"style":153},"use App\\Filament\\Resources\\People\\Pages\\ViewPerson;\n\nuse function Pest\\Livewire\\livewire;\n\nit('opens the activity log slide-over', function (): void {\n    livewire(ViewPerson::class, ['record' => $this->record->getKey()])\n        ->callAction('activityLog')\n        ->assertSuccessful();\n});\n",[121,858,859,887,891,909,913,936,970,989,997],{"__ignoreMap":153},[157,860,861,863,865,867,869,871,873,875,877,879,881,883,885],{"class":159,"line":160},[157,862,171],{"class":170},[157,864,284],{"class":174},[157,866,179],{"class":178},[157,868,436],{"class":174},[157,870,179],{"class":178},[157,872,441],{"class":174},[157,874,179],{"class":178},[157,876,446],{"class":174},[157,878,179],{"class":178},[157,880,451],{"class":174},[157,882,179],{"class":178},[157,884,456],{"class":174},[157,886,194],{"class":178},[157,888,889],{"class":159,"line":167},[157,890,216],{"emptyLinePlaceholder":215},[157,892,893,895,897,899,901,903,905,907],{"class":159,"line":197},[157,894,171],{"class":170},[157,896,469],{"class":326},[157,898,472],{"class":174},[157,900,179],{"class":178},[157,902,477],{"class":174},[157,904,179],{"class":178},[157,906,482],{"class":174},[157,908,194],{"class":178},[157,910,911],{"class":159,"line":212},[157,912,216],{"emptyLinePlaceholder":215},[157,914,915,917,919,921,924,926,928,930,932,934],{"class":159,"line":219},[157,916,493],{"class":222},[157,918,226],{"class":178},[157,920,256],{"class":178},[157,922,923],{"class":259},"opens the activity log slide-over",[157,925,256],{"class":178},[157,927,238],{"class":178},[157,929,469],{"class":326},[157,931,330],{"class":178},[157,933,333],{"class":170},[157,935,336],{"class":178},[157,937,938,940,942,944,946,948,950,952,954,956,958,960,962,964,966,968],{"class":159,"line":370},[157,939,559],{"class":222},[157,941,226],{"class":178},[157,943,456],{"class":229},[157,945,232],{"class":178},[157,947,235],{"class":170},[157,949,238],{"class":178},[157,951,572],{"class":178},[157,953,256],{"class":178},[157,955,519],{"class":259},[157,957,256],{"class":178},[157,959,538],{"class":178},[157,961,583],{"class":178},[157,963,519],{"class":174},[157,965,522],{"class":178},[157,967,590],{"class":222},[157,969,593],{"class":178},[157,971,972,974,977,979,981,984,986],{"class":159,"line":395},[157,973,599],{"class":178},[157,975,976],{"class":222},"callAction",[157,978,226],{"class":178},[157,980,256],{"class":178},[157,982,983],{"class":259},"activityLog",[157,985,256],{"class":178},[157,987,988],{"class":178},")\n",[157,990,991,993,995],{"class":159,"line":556},[157,992,599],{"class":178},[157,994,818],{"class":222},[157,996,392],{"class":178},[157,998,999],{"class":159,"line":596},[157,1000,398],{"class":178},[117,1002,1003,1004,1007,1008,1011],{},"If you renamed the action via ",[121,1005,1006],{},"ActivityLogAction::make('history')",", pass ",[121,1009,1010],{},"'history'"," instead.",[140,1013,1015],{"id":1014},"asserting-timeline-entries-directly","Asserting timeline entries directly",[117,1017,1018,1019,645],{},"Skip the UI when you're testing source composition — call the builder and assert against its return value. This mirrors the package's own ",[121,1020,1021],{},"ActivityLogSourceTest.php",[148,1023,1025],{"className":150,"code":1024,"language":152,"meta":153,"style":153},"use Spatie\\Activitylog\\Models\\Activity;\n\nit('emits an entry per activity row', function (): void {\n    Activity::create([\n        'log_name' => 'default',\n        'description' => 'updated',\n        'event' => 'updated',\n        'subject_type' => $this->record->getMorphClass(),\n        'subject_id' => $this->record->getKey(),\n        'properties' => ['attributes' => ['name' => 'New'], 'old' => ['name' => 'Old']],\n    ]);\n\n    $entries = $this->record->timeline()->fromActivityLog()->get();\n\n    expect($entries)\n        ->toHaveCount(1)\n        ->and($entries->first()->event)->toBe('updated');\n});\n",[121,1026,1027,1050,1054,1077,1089,1109,1129,1148,1171,1192,1263,1268,1273,1305,1310,1324,1339,1375],{"__ignoreMap":153},[157,1028,1029,1031,1034,1036,1039,1041,1043,1045,1048],{"class":159,"line":160},[157,1030,171],{"class":170},[157,1032,1033],{"class":174}," Spatie",[157,1035,179],{"class":178},[157,1037,1038],{"class":174},"Activitylog",[157,1040,179],{"class":178},[157,1042,289],{"class":174},[157,1044,179],{"class":178},[157,1046,1047],{"class":174},"Activity",[157,1049,194],{"class":178},[157,1051,1052],{"class":159,"line":167},[157,1053,216],{"emptyLinePlaceholder":215},[157,1055,1056,1058,1060,1062,1065,1067,1069,1071,1073,1075],{"class":159,"line":197},[157,1057,493],{"class":222},[157,1059,226],{"class":178},[157,1061,256],{"class":178},[157,1063,1064],{"class":259},"emits an entry per activity row",[157,1066,256],{"class":178},[157,1068,238],{"class":178},[157,1070,469],{"class":326},[157,1072,330],{"class":178},[157,1074,333],{"class":170},[157,1076,336],{"class":178},[157,1078,1079,1082,1084,1086],{"class":159,"line":212},[157,1080,1081],{"class":229},"    Activity",[157,1083,232],{"class":178},[157,1085,364],{"class":222},[157,1087,1088],{"class":178},"([\n",[157,1090,1091,1093,1096,1098,1100,1102,1105,1107],{"class":159,"line":219},[157,1092,778],{"class":178},[157,1094,1095],{"class":259},"log_name",[157,1097,256],{"class":178},[157,1099,538],{"class":178},[157,1101,541],{"class":178},[157,1103,1104],{"class":259},"default",[157,1106,256],{"class":178},[157,1108,791],{"class":178},[157,1110,1111,1113,1116,1118,1120,1122,1125,1127],{"class":159,"line":370},[157,1112,778],{"class":178},[157,1114,1115],{"class":259},"description",[157,1117,256],{"class":178},[157,1119,538],{"class":178},[157,1121,541],{"class":178},[157,1123,1124],{"class":259},"updated",[157,1126,256],{"class":178},[157,1128,791],{"class":178},[157,1130,1131,1133,1136,1138,1140,1142,1144,1146],{"class":159,"line":395},[157,1132,778],{"class":178},[157,1134,1135],{"class":259},"event",[157,1137,256],{"class":178},[157,1139,538],{"class":178},[157,1141,541],{"class":178},[157,1143,1124],{"class":259},[157,1145,256],{"class":178},[157,1147,791],{"class":178},[157,1149,1150,1152,1155,1157,1159,1161,1163,1165,1168],{"class":159,"line":556},[157,1151,778],{"class":178},[157,1153,1154],{"class":259},"subject_type",[157,1156,256],{"class":178},[157,1158,538],{"class":178},[157,1160,583],{"class":178},[157,1162,519],{"class":174},[157,1164,522],{"class":178},[157,1166,1167],{"class":222},"getMorphClass",[157,1169,1170],{"class":178},"(),\n",[157,1172,1173,1175,1178,1180,1182,1184,1186,1188,1190],{"class":159,"line":596},[157,1174,778],{"class":178},[157,1176,1177],{"class":259},"subject_id",[157,1179,256],{"class":178},[157,1181,538],{"class":178},[157,1183,583],{"class":178},[157,1185,519],{"class":174},[157,1187,522],{"class":178},[157,1189,590],{"class":222},[157,1191,1170],{"class":178},[157,1193,1194,1196,1199,1201,1203,1205,1207,1210,1212,1214,1216,1218,1220,1222,1224,1226,1229,1231,1234,1236,1239,1241,1243,1245,1247,1249,1251,1253,1255,1258,1260],{"class":159,"line":615},[157,1195,778],{"class":178},[157,1197,1198],{"class":259},"properties",[157,1200,256],{"class":178},[157,1202,538],{"class":178},[157,1204,572],{"class":178},[157,1206,256],{"class":178},[157,1208,1209],{"class":259},"attributes",[157,1211,256],{"class":178},[157,1213,538],{"class":178},[157,1215,572],{"class":178},[157,1217,256],{"class":178},[157,1219,533],{"class":259},[157,1221,256],{"class":178},[157,1223,538],{"class":178},[157,1225,541],{"class":178},[157,1227,1228],{"class":259},"New",[157,1230,256],{"class":178},[157,1232,1233],{"class":178},"],",[157,1235,541],{"class":178},[157,1237,1238],{"class":259},"old",[157,1240,256],{"class":178},[157,1242,538],{"class":178},[157,1244,572],{"class":178},[157,1246,256],{"class":178},[157,1248,533],{"class":259},[157,1250,256],{"class":178},[157,1252,538],{"class":178},[157,1254,541],{"class":178},[157,1256,1257],{"class":259},"Old",[157,1259,256],{"class":178},[157,1261,1262],{"class":178},"]],\n",[157,1264,1265],{"class":159,"line":823},[157,1266,1267],{"class":178},"    ]);\n",[157,1269,1271],{"class":159,"line":1270},12,[157,1272,216],{"emptyLinePlaceholder":215},[157,1274,1276,1279,1282,1284,1286,1288,1290,1293,1295,1298,1300,1303],{"class":159,"line":1275},13,[157,1277,1278],{"class":178},"    $",[157,1280,1281],{"class":174},"entries ",[157,1283,378],{"class":178},[157,1285,583],{"class":178},[157,1287,519],{"class":174},[157,1289,522],{"class":178},[157,1291,1292],{"class":222},"timeline",[157,1294,356],{"class":178},[157,1296,1297],{"class":222},"fromActivityLog",[157,1299,356],{"class":178},[157,1301,1302],{"class":222},"get",[157,1304,392],{"class":178},[157,1306,1308],{"class":159,"line":1307},14,[157,1309,216],{"emptyLinePlaceholder":215},[157,1311,1313,1316,1319,1322],{"class":159,"line":1312},15,[157,1314,1315],{"class":222},"    expect",[157,1317,1318],{"class":178},"($",[157,1320,1321],{"class":174},"entries",[157,1323,988],{"class":178},[157,1325,1327,1329,1332,1334,1337],{"class":159,"line":1326},16,[157,1328,599],{"class":178},[157,1330,1331],{"class":222},"toHaveCount",[157,1333,226],{"class":178},[157,1335,1336],{"class":170},"1",[157,1338,988],{"class":178},[157,1340,1342,1344,1347,1349,1351,1353,1356,1358,1360,1362,1365,1367,1369,1371,1373],{"class":159,"line":1341},17,[157,1343,599],{"class":178},[157,1345,1346],{"class":222},"and",[157,1348,1318],{"class":178},[157,1350,1321],{"class":174},[157,1352,522],{"class":178},[157,1354,1355],{"class":222},"first",[157,1357,356],{"class":178},[157,1359,1135],{"class":174},[157,1361,248],{"class":178},[157,1363,1364],{"class":222},"toBe",[157,1366,226],{"class":178},[157,1368,256],{"class":178},[157,1370,1124],{"class":259},[157,1372,256],{"class":178},[157,1374,265],{"class":178},[157,1376,1378],{"class":159,"line":1377},18,[157,1379,398],{"class":178},[117,1381,1382,1383,1386,1387,1390,1391,1394,1395,1386,1398,1401,1402,1405,1406,1409,1410,1386,1413,1390,1416,1419],{},"The same shape works for ",[121,1384,1385],{},"fromRelation()",", ",[121,1388,1389],{},"fromActivityLogOf()",", and ",[121,1392,1393],{},"fromCustom()"," — drive the builder, collect the entries, assert against ",[121,1396,1397],{},"$entries->pluck('event')",[121,1399,1400],{},"->count()",", or any other property on ",[121,1403,1404],{},"TimelineEntry",". The package's ",[121,1407,1408],{},"BuilderFilteringTest.php"," is a good reference for ",[121,1411,1412],{},"between()",[121,1414,1415],{},"ofEvent()",[121,1417,1418],{},"sortByDateAsc()"," patterns.",[140,1421,1423,1424],{"id":1422},"factories-for-spatieactivitylogmodelsactivity","Factories for ",[121,1425,1426],{},"Spatie\\Activitylog\\Models\\Activity",[117,1428,1429,1430,1432,1433,645],{},"Spatie's ",[121,1431,1047],{}," model doesn't ship a factory. If you need one in your consumer app, drop this in ",[121,1434,1435],{},"database\u002Ffactories\u002F",[148,1437,1439],{"className":150,"code":1438,"language":152,"meta":153,"style":153},"namespace Database\\Factories\\Spatie;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Spatie\\Activitylog\\Models\\Activity;\n\n\u002F** @extends Factory\u003CActivity> *\u002F\nfinal class ActivityFactory extends Factory\n{\n    protected $model = Activity::class;\n\n    public function definition(): array\n    {\n        return [\n            'log_name' => 'default',\n            'description' => $this->faker->word(),\n            'event' => $this->faker->randomElement(['created', 'updated', 'deleted']),\n            'subject_type' => null,\n            'subject_id' => null,\n            'causer_type' => null,\n            'causer_id' => null,\n            'properties' => [],\n        ];\n    }\n\n    public function for(Model $subject): static\n    {\n        return $this->state([\n            'subject_type' => $subject->getMorphClass(),\n            'subject_id' => $subject->getKey(),\n        ]);\n    }\n}\n",[121,1440,1441,1461,1465,1492,1513,1533,1537,1542,1559,1564,1586,1590,1606,1611,1619,1638,1660,1708,1721,1734,1748,1762,1776,1782,1788,1793,1818,1823,1835,1856,1877,1883,1888],{"__ignoreMap":153},[157,1442,1443,1446,1449,1451,1454,1456,1459],{"class":159,"line":160},[157,1444,1445],{"class":170},"namespace",[157,1447,1448],{"class":229}," Database",[157,1450,179],{"class":178},[157,1452,1453],{"class":229},"Factories",[157,1455,179],{"class":178},[157,1457,1458],{"class":229},"Spatie",[157,1460,194],{"class":178},[157,1462,1463],{"class":159,"line":167},[157,1464,216],{"emptyLinePlaceholder":215},[157,1466,1467,1469,1471,1473,1476,1478,1481,1483,1485,1487,1490],{"class":159,"line":197},[157,1468,171],{"class":170},[157,1470,175],{"class":174},[157,1472,179],{"class":178},[157,1474,1475],{"class":174},"Database",[157,1477,179],{"class":178},[157,1479,1480],{"class":174},"Eloquent",[157,1482,179],{"class":178},[157,1484,1453],{"class":174},[157,1486,179],{"class":178},[157,1488,1489],{"class":174},"Factory",[157,1491,194],{"class":178},[157,1493,1494,1496,1498,1500,1502,1504,1506,1508,1511],{"class":159,"line":212},[157,1495,171],{"class":170},[157,1497,175],{"class":174},[157,1499,179],{"class":178},[157,1501,1475],{"class":174},[157,1503,179],{"class":178},[157,1505,1480],{"class":174},[157,1507,179],{"class":178},[157,1509,1510],{"class":174},"Model",[157,1512,194],{"class":178},[157,1514,1515,1517,1519,1521,1523,1525,1527,1529,1531],{"class":159,"line":219},[157,1516,171],{"class":170},[157,1518,1033],{"class":174},[157,1520,179],{"class":178},[157,1522,1038],{"class":174},[157,1524,179],{"class":178},[157,1526,289],{"class":174},[157,1528,179],{"class":178},[157,1530,1047],{"class":174},[157,1532,194],{"class":178},[157,1534,1535],{"class":159,"line":370},[157,1536,216],{"emptyLinePlaceholder":215},[157,1538,1539],{"class":159,"line":395},[157,1540,1541],{"class":163},"\u002F** @extends Factory\u003CActivity> *\u002F\n",[157,1543,1544,1547,1550,1553,1556],{"class":159,"line":556},[157,1545,1546],{"class":326},"final",[157,1548,1549],{"class":326}," class",[157,1551,1552],{"class":229}," ActivityFactory",[157,1554,1555],{"class":326}," extends",[157,1557,1558],{"class":229}," Factory\n",[157,1560,1561],{"class":159,"line":596},[157,1562,1563],{"class":178},"{\n",[157,1565,1566,1569,1572,1575,1577,1580,1582,1584],{"class":159,"line":615},[157,1567,1568],{"class":326},"    protected",[157,1570,1571],{"class":178}," $",[157,1573,1574],{"class":174},"model ",[157,1576,378],{"class":178},[157,1578,1579],{"class":229}," Activity",[157,1581,232],{"class":178},[157,1583,235],{"class":170},[157,1585,194],{"class":178},[157,1587,1588],{"class":159,"line":823},[157,1589,216],{"emptyLinePlaceholder":215},[157,1591,1592,1595,1597,1600,1603],{"class":159,"line":1270},[157,1593,1594],{"class":326},"    public",[157,1596,469],{"class":326},[157,1598,1599],{"class":222}," definition",[157,1601,1602],{"class":178},"():",[157,1604,1605],{"class":170}," array\n",[157,1607,1608],{"class":159,"line":1275},[157,1609,1610],{"class":178},"    {\n",[157,1612,1613,1617],{"class":159,"line":1307},[157,1614,1616],{"class":1615},"s7zQu","        return",[157,1618,773],{"class":178},[157,1620,1621,1624,1626,1628,1630,1632,1634,1636],{"class":159,"line":1312},[157,1622,1623],{"class":178},"            '",[157,1625,1095],{"class":259},[157,1627,256],{"class":178},[157,1629,538],{"class":178},[157,1631,541],{"class":178},[157,1633,1104],{"class":259},[157,1635,256],{"class":178},[157,1637,791],{"class":178},[157,1639,1640,1642,1644,1646,1648,1650,1653,1655,1658],{"class":159,"line":1326},[157,1641,1623],{"class":178},[157,1643,1115],{"class":259},[157,1645,256],{"class":178},[157,1647,538],{"class":178},[157,1649,583],{"class":178},[157,1651,1652],{"class":174},"faker",[157,1654,522],{"class":178},[157,1656,1657],{"class":222},"word",[157,1659,1170],{"class":178},[157,1661,1662,1664,1666,1668,1670,1672,1674,1676,1679,1681,1683,1686,1688,1690,1692,1694,1696,1698,1700,1703,1705],{"class":159,"line":1341},[157,1663,1623],{"class":178},[157,1665,1135],{"class":259},[157,1667,256],{"class":178},[157,1669,538],{"class":178},[157,1671,583],{"class":178},[157,1673,1652],{"class":174},[157,1675,522],{"class":178},[157,1677,1678],{"class":222},"randomElement",[157,1680,528],{"class":178},[157,1682,256],{"class":178},[157,1684,1685],{"class":259},"created",[157,1687,256],{"class":178},[157,1689,238],{"class":178},[157,1691,541],{"class":178},[157,1693,1124],{"class":259},[157,1695,256],{"class":178},[157,1697,238],{"class":178},[157,1699,541],{"class":178},[157,1701,1702],{"class":259},"deleted",[157,1704,256],{"class":178},[157,1706,1707],{"class":178},"]),\n",[157,1709,1710,1712,1714,1716,1718],{"class":159,"line":1377},[157,1711,1623],{"class":178},[157,1713,1154],{"class":259},[157,1715,256],{"class":178},[157,1717,538],{"class":178},[157,1719,1720],{"class":178}," null,\n",[157,1722,1724,1726,1728,1730,1732],{"class":159,"line":1723},19,[157,1725,1623],{"class":178},[157,1727,1177],{"class":259},[157,1729,256],{"class":178},[157,1731,538],{"class":178},[157,1733,1720],{"class":178},[157,1735,1737,1739,1742,1744,1746],{"class":159,"line":1736},20,[157,1738,1623],{"class":178},[157,1740,1741],{"class":259},"causer_type",[157,1743,256],{"class":178},[157,1745,538],{"class":178},[157,1747,1720],{"class":178},[157,1749,1751,1753,1756,1758,1760],{"class":159,"line":1750},21,[157,1752,1623],{"class":178},[157,1754,1755],{"class":259},"causer_id",[157,1757,256],{"class":178},[157,1759,538],{"class":178},[157,1761,1720],{"class":178},[157,1763,1765,1767,1769,1771,1773],{"class":159,"line":1764},22,[157,1766,1623],{"class":178},[157,1768,1198],{"class":259},[157,1770,256],{"class":178},[157,1772,538],{"class":178},[157,1774,1775],{"class":178}," [],\n",[157,1777,1779],{"class":159,"line":1778},23,[157,1780,1781],{"class":178},"        ];\n",[157,1783,1785],{"class":159,"line":1784},24,[157,1786,1787],{"class":178},"    }\n",[157,1789,1791],{"class":159,"line":1790},25,[157,1792,216],{"emptyLinePlaceholder":215},[157,1794,1796,1798,1800,1803,1805,1807,1809,1812,1815],{"class":159,"line":1795},26,[157,1797,1594],{"class":326},[157,1799,469],{"class":326},[157,1801,1802],{"class":222}," for",[157,1804,226],{"class":178},[157,1806,1510],{"class":229},[157,1808,1571],{"class":178},[157,1810,1811],{"class":174},"subject",[157,1813,1814],{"class":178},"):",[157,1816,1817],{"class":326}," static\n",[157,1819,1821],{"class":159,"line":1820},27,[157,1822,1610],{"class":178},[157,1824,1826,1828,1830,1833],{"class":159,"line":1825},28,[157,1827,1616],{"class":1615},[157,1829,583],{"class":178},[157,1831,1832],{"class":222},"state",[157,1834,1088],{"class":178},[157,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854],{"class":159,"line":1837},29,[157,1839,1623],{"class":178},[157,1841,1154],{"class":259},[157,1843,256],{"class":178},[157,1845,538],{"class":178},[157,1847,1571],{"class":178},[157,1849,1811],{"class":174},[157,1851,522],{"class":178},[157,1853,1167],{"class":222},[157,1855,1170],{"class":178},[157,1857,1859,1861,1863,1865,1867,1869,1871,1873,1875],{"class":159,"line":1858},30,[157,1860,1623],{"class":178},[157,1862,1177],{"class":259},[157,1864,256],{"class":178},[157,1866,538],{"class":178},[157,1868,1571],{"class":178},[157,1870,1811],{"class":174},[157,1872,522],{"class":178},[157,1874,590],{"class":222},[157,1876,1170],{"class":178},[157,1878,1880],{"class":159,"line":1879},31,[157,1881,1882],{"class":178},"        ]);\n",[157,1884,1886],{"class":159,"line":1885},32,[157,1887,1787],{"class":178},[157,1889,1891],{"class":159,"line":1890},33,[157,1892,1893],{"class":178},"}\n",[117,1895,1896,1897,1899,1900,1903,1904,1909,1910,1913],{},"Wire spatie's ",[121,1898,1047],{}," to the factory by overriding Laravel's factory resolver in a service provider's ",[121,1901,1902],{},"boot()"," method — see ",[130,1905,1908],{"href":1906,"rel":1907},"https:\u002F\u002Flaravel.com\u002Fdocs\u002Feloquent-factories#defining-model-factories",[134],"Laravel's factory docs"," for the canonical setup with ",[121,1911,1912],{},"Factory::guessFactoryNamesUsing()",". Then use it like any other factory:",[148,1915,1917],{"className":150,"code":1916,"language":152,"meta":153,"style":153},"use Database\\Factories\\Spatie\\ActivityFactory;\n\nActivityFactory::new()->for($this->record)->create();\n",[121,1918,1919,1940,1944],{"__ignoreMap":153},[157,1920,1921,1923,1925,1927,1929,1931,1933,1935,1938],{"class":159,"line":160},[157,1922,171],{"class":170},[157,1924,1448],{"class":174},[157,1926,179],{"class":178},[157,1928,1453],{"class":174},[157,1930,179],{"class":178},[157,1932,1458],{"class":174},[157,1934,179],{"class":178},[157,1936,1937],{"class":174},"ActivityFactory",[157,1939,194],{"class":178},[157,1941,1942],{"class":159,"line":167},[157,1943,216],{"emptyLinePlaceholder":215},[157,1945,1946,1948,1950,1953,1955,1958,1961,1963,1965,1967],{"class":159,"line":197},[157,1947,1937],{"class":229},[157,1949,232],{"class":178},[157,1951,1952],{"class":222},"new",[157,1954,356],{"class":178},[157,1956,1957],{"class":222},"for",[157,1959,1960],{"class":178},"($this->",[157,1962,519],{"class":174},[157,1964,248],{"class":178},[157,1966,364],{"class":222},[157,1968,392],{"class":178},[140,1970,1972],{"id":1971},"where-to-look-next","Where to look next",[1974,1975,1976,1985,1995],"ul",{},[1977,1978,634,1979,1984],"li",{},[130,1980,1982],{"href":132,"rel":1981},[134],[121,1983,137],{}," directory has working examples for every public surface.",[1977,1986,1987,1988,1991,1992,1994],{},"For UI-level assertions on grouping, pagination, and infinite scroll, mount ",[121,1989,1990],{},"ActivityLogLivewire"," directly — see ",[121,1993,637],{}," for the static-config approach.",[1977,1996,1997,1998,2001,2002,2004],{},"For end-to-end flows (action opens slide-over, scroll loads more entries), use Pest 4 browser tests with ",[121,1999,2000],{},"visit()"," instead of ",[121,2003,405],{},".",[2006,2007,2008],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":153,"searchDepth":167,"depth":167,"links":2010},[2011,2012,2014,2015,2016,2017,2019],{"id":142,"depth":167,"text":143},{"id":401,"depth":167,"text":2013},"Testing the infolist via livewire()",{"id":630,"depth":167,"text":631},{"id":842,"depth":167,"text":843},{"id":1014,"depth":167,"text":1015},{"id":1422,"depth":167,"text":2018},"Factories for Spatie\\Activitylog\\Models\\Activity",{"id":1971,"depth":167,"text":1972},"Test patterns for the timeline component, relation manager, action, and builder.","md",null,{},{"icon":88},{"description":2026,"ogImage":2027,"title":83},"Pest test patterns for relaticle\u002Factivity-log — infolist, relation manager, action, and direct builder assertions.","\u002Fpreview.png","E4eSfhens9pEOL1YFyOBv-rap-5b5WI8w9bow1Bd5H0",[2030,2032],{"title":78,"path":79,"stem":80,"description":2031,"icon":81,"children":-1},"Read-only admin audit trail — own log only, role-gated visibility, sensitive-field redaction.",{"title":90,"path":91,"stem":92,"description":2033,"icon":95,"children":-1},"Common pitfalls, known limitations, and how to work around them.",1780504149910]