@@ -17,7 +17,8 @@ import {findMarker, Marker, Markers} from "../markers";
1717import { randomId , UUID } from "../uuid" ;
1818import { asRef } from "../reference" ;
1919import { RpcCodecs , RpcReceiveQueue , RpcSendQueue } from "../rpc" ;
20- import { castDraft , createDraft , finishDraft } from "immer" ;
20+ import { castDraft } from "immer" ;
21+ import { updateIfChanged } from "../util" ;
2122import * as semver from "semver" ;
2223import * as fsp from "fs/promises" ;
2324import * as path from "path" ;
@@ -815,12 +816,11 @@ export namespace NodeResolutionResultQueries {
815816 */
816817RpcCodecs . registerCodec ( NpmrcKind , {
817818 async rpcReceive ( before : Npmrc , q : RpcReceiveQueue ) : Promise < Npmrc > {
818- const draft = createDraft ( before ) ;
819- draft . kind = NpmrcKind ;
820- draft . scope = await q . receive ( before . scope ) ;
821- draft . properties = await q . receive ( before . properties ) ;
822-
823- return finishDraft ( draft ) as Npmrc ;
819+ return updateIfChanged ( before , {
820+ kind : NpmrcKind ,
821+ scope : await q . receive ( before . scope ) ,
822+ properties : await q . receive ( before . properties ) ,
823+ } ) ;
824824 } ,
825825
826826 async rpcSend ( after : Npmrc , q : RpcSendQueue ) : Promise < void > {
@@ -834,13 +834,12 @@ RpcCodecs.registerCodec(NpmrcKind, {
834834 */
835835RpcCodecs . registerCodec ( DependencyKind , {
836836 async rpcReceive ( before : Dependency , q : RpcReceiveQueue ) : Promise < Dependency > {
837- const draft = createDraft ( before ) ;
838- draft . kind = DependencyKind ;
839- draft . name = await q . receive ( before . name ) ;
840- draft . versionConstraint = await q . receive ( before . versionConstraint ) ;
841- draft . resolved = await q . receive ( before . resolved ) ;
842-
843- return finishDraft ( draft ) as Dependency ;
837+ return updateIfChanged ( before , {
838+ kind : DependencyKind ,
839+ name : await q . receive ( before . name ) ,
840+ versionConstraint : await q . receive ( before . versionConstraint ) ,
841+ resolved : await q . receive ( before . resolved ) ,
842+ } ) ;
844843 } ,
845844
846845 async rpcSend ( after : Dependency , q : RpcSendQueue ) : Promise < void > {
@@ -855,18 +854,17 @@ RpcCodecs.registerCodec(DependencyKind, {
855854 */
856855RpcCodecs . registerCodec ( ResolvedDependencyKind , {
857856 async rpcReceive ( before : ResolvedDependency , q : RpcReceiveQueue ) : Promise < ResolvedDependency > {
858- const draft = createDraft ( before ) ;
859- draft . kind = ResolvedDependencyKind ;
860- draft . name = await q . receive ( before . name ) ;
861- draft . version = await q . receive ( before . version ) ;
862- draft . dependencies = ( await q . receiveList ( before . dependencies ) ) || undefined ;
863- draft . devDependencies = ( await q . receiveList ( before . devDependencies ) ) || undefined ;
864- draft . peerDependencies = ( await q . receiveList ( before . peerDependencies ) ) || undefined ;
865- draft . optionalDependencies = ( await q . receiveList ( before . optionalDependencies ) ) || undefined ;
866- draft . engines = await q . receive ( before . engines ) ;
867- draft . license = await q . receive ( before . license ) ;
868-
869- return finishDraft ( draft ) as ResolvedDependency ;
857+ return updateIfChanged ( before , {
858+ kind : ResolvedDependencyKind ,
859+ name : await q . receive ( before . name ) ,
860+ version : await q . receive ( before . version ) ,
861+ dependencies : ( await q . receiveList ( before . dependencies ) ) || undefined ,
862+ devDependencies : ( await q . receiveList ( before . devDependencies ) ) || undefined ,
863+ peerDependencies : ( await q . receiveList ( before . peerDependencies ) ) || undefined ,
864+ optionalDependencies : ( await q . receiveList ( before . optionalDependencies ) ) || undefined ,
865+ engines : await q . receive ( before . engines ) ,
866+ license : await q . receive ( before . license ) ,
867+ } ) ;
870868 } ,
871869
872870 async rpcSend ( after : ResolvedDependency , q : RpcSendQueue ) : Promise < void > {
@@ -888,29 +886,29 @@ RpcCodecs.registerCodec(ResolvedDependencyKind, {
888886/**
889887 * Register RPC codec for NodeResolutionResult marker.
890888 * This handles serialization/deserialization for communication between JS and Java.
889+ * Note: We avoid Immer here because the dependency graph can contain cycles
890+ * (e.g., Dependency -> ResolvedDependency -> Dependency[]), and Immer's proxies
891+ * don't handle cyclic structures correctly.
891892 */
892893RpcCodecs . registerCodec ( NodeResolutionResultKind , {
893894 async rpcReceive ( before : NodeResolutionResult , q : RpcReceiveQueue ) : Promise < NodeResolutionResult > {
894- const draft = createDraft ( before ) ;
895- draft . id = await q . receive ( before . id ) ;
896- draft . name = await q . receive ( before . name ) ;
897- draft . version = await q . receive ( before . version ) ;
898- draft . description = await q . receive ( before . description ) ;
899- draft . path = await q . receive ( before . path ) ;
900- draft . workspacePackagePaths = await q . receive ( before . workspacePackagePaths ) ;
901-
902- draft . dependencies = ( await q . receiveList ( before . dependencies ) ) || [ ] ;
903- draft . devDependencies = ( await q . receiveList ( before . devDependencies ) ) || [ ] ;
904- draft . peerDependencies = ( await q . receiveList ( before . peerDependencies ) ) || [ ] ;
905- draft . optionalDependencies = ( await q . receiveList ( before . optionalDependencies ) ) || [ ] ;
906- draft . bundledDependencies = ( await q . receiveList ( before . bundledDependencies ) ) || [ ] ;
907- draft . resolvedDependencies = ( await q . receiveList ( before . resolvedDependencies ) ) || [ ] ;
908-
909- draft . packageManager = await q . receive ( before . packageManager ) ;
910- draft . engines = await q . receive ( before . engines ) ;
911- draft . npmrcConfigs = ( await q . receiveList ( before . npmrcConfigs ) ) || undefined ;
912-
913- return finishDraft ( draft ) as NodeResolutionResult ;
895+ return updateIfChanged ( before , {
896+ id : await q . receive ( before . id ) ,
897+ name : await q . receive ( before . name ) ,
898+ version : await q . receive ( before . version ) ,
899+ description : await q . receive ( before . description ) ,
900+ path : await q . receive ( before . path ) ,
901+ workspacePackagePaths : await q . receive ( before . workspacePackagePaths ) ,
902+ dependencies : ( await q . receiveList ( before . dependencies ) ) || [ ] ,
903+ devDependencies : ( await q . receiveList ( before . devDependencies ) ) || [ ] ,
904+ peerDependencies : ( await q . receiveList ( before . peerDependencies ) ) || [ ] ,
905+ optionalDependencies : ( await q . receiveList ( before . optionalDependencies ) ) || [ ] ,
906+ bundledDependencies : ( await q . receiveList ( before . bundledDependencies ) ) || [ ] ,
907+ resolvedDependencies : ( await q . receiveList ( before . resolvedDependencies ) ) || [ ] ,
908+ packageManager : await q . receive ( before . packageManager ) ,
909+ engines : await q . receive ( before . engines ) ,
910+ npmrcConfigs : ( await q . receiveList ( before . npmrcConfigs ) ) || undefined ,
911+ } ) ;
914912 } ,
915913
916914 async rpcSend ( after : NodeResolutionResult , q : RpcSendQueue ) : Promise < void > {
0 commit comments