{"ScriptPreparationCode":"// Complex nested state structure (5 levels deep)\r\nconst createComplexState = () =\u003E ({\r\n user: {\r\n profile: {\r\n personal: {\r\n details: {\r\n info: {\r\n name: \u0027John Doe\u0027,\r\n age: 30,\r\n preferences: [\u0027reading\u0027, \u0027coding\u0027, \u0027music\u0027]\r\n }\r\n }\r\n }\r\n }\r\n },\r\n app: {\r\n ui: {\r\n theme: \u0027dark\u0027,\r\n layout: \u0027grid\u0027\r\n }\r\n },\r\n data: {\r\n items: [\r\n { id: 1, name: \u0027Item 1\u0027, meta: { category: \u0027A\u0027, tags: [\u0027tag1\u0027] } },\r\n { id: 2, name: \u0027Item 2\u0027, meta: { category: \u0027B\u0027, tags: [\u0027tag2\u0027] } }\r\n ]\r\n }\r\n});\r\n\r\n// Simple state structure (1-2 levels)\r\nconst createSimpleState = () =\u003E ({\r\n counter: 0,\r\n flag: true,\r\n items: [\u0027a\u0027, \u0027b\u0027, \u0027c\u0027]\r\n});\r\n\r\n// Store original references for comparison\r\nvar originalComplexState = createComplexState();\r\nvar originalSimpleState = createSimpleState();\r\n\r\n// States for manual mutation testing\r\nvar mutableComplexState = createComplexState();\r\nvar mutableSimpleState = createSimpleState();","TestCases":[{"Name":"immerJS and shallow","Code":"// Reset states for fair comparison\r\noriginalComplexState = createComplexState();\r\noriginalSimpleState = createSimpleState();\r\n\r\n// Create new immutable states with Immer\r\nconst newComplexState = immer.produce(originalComplexState, draft =\u003E {\r\n draft.user.profile.personal.details.info.age = 31;\r\n draft.app.ui.theme = \u0027light\u0027;\r\n draft.data.items[0].name = \u0027Modified Item 1\u0027;\r\n});\r\n\r\nconst newSimpleState = immer.produce(originalSimpleState, draft =\u003E {\r\n draft.counter = 1;\r\n draft.items.push(\u0027d\u0027);\r\n});\r\n\r\n// Shallow comparisons (reference equality) - should be fast\r\nconst complexChanged = originalComplexState !== newComplexState;\r\nconst simpleChanged = originalSimpleState !== newSimpleState;\r\nconst unchanged = originalComplexState === originalComplexState;\r\n\r\n// Simulate what useOnyx would do - check if references changed\r\nconst hasChanges = complexChanged || simpleChanged;","IsDeferred":false},{"Name":"Manual and deepEqual","Code":"const fastEquals = window[\u0027fast-equals\u0027];\r\n// Reset mutable states\r\nmutableComplexState = createComplexState();\r\nmutableSimpleState = createSimpleState();\r\n\r\n// Store original states for comparison\r\nconst beforeComplexState = JSON.parse(JSON.stringify(mutableComplexState));\r\nconst beforeSimpleState = JSON.parse(JSON.stringify(mutableSimpleState));\r\n\r\n// Mutate objects directly (like current approach might do)\r\nmutableComplexState.user.profile.personal.details.info.age = 31;\r\nmutableComplexState.app.ui.theme = \u0027light\u0027;\r\nmutableComplexState.data.items[0].name = \u0027Modified Item 1\u0027;\r\n\r\nmutableSimpleState.counter = 1;\r\nmutableSimpleState.items.push(\u0027d\u0027);\r\n\r\n// Deep equality checks to detect changes - should be slower\r\nconst complexChangedDeep = !fastEquals.deepEqual(beforeComplexState, mutableComplexState);\r\nconst simpleChangedDeep = !fastEquals.deepEqual(beforeSimpleState, mutableSimpleState);\r\nconst unchangedDeep = fastEquals.deepEqual(beforeComplexState, beforeComplexState);\r\n\r\n// Simulate what useOnyx currently does - deep equality checks\r\nconst hasChangesDeep = complexChangedDeep || simpleChangedDeep;","IsDeferred":false}]}