@@ -555,6 +555,64 @@ test.it("installDependencies: writes a single flat lockfile containing all trans
555555 test .falsy (lde .Lockfile .open (path .join (middleDir , " lde.lock" )))
556556end )
557557
558+ test .it (" installDependencies: ignores sub-package lockfiles during transitive resolution" , function ()
559+ fs .mkdir (tmpBase )
560+
561+ -- A deep package that actually exists and will be the real transitive dep
562+ local deepA = path .join (tmpBase , " ignore-lockfile-deep-a" )
563+ fs .mkdir (deepA )
564+ fs .mkdir (path .join (deepA , " src" ))
565+ fs .write (path .join (deepA , " src" , " init.lua" ), " return { name = 'deep-a' }" )
566+ fs .write (path .join (deepA , " lde.json" ), json .encode ({
567+ name = " ignore-lockfile-deep-a" ,
568+ version = " 0.1.0" ,
569+ dependencies = {}
570+ }))
571+
572+ -- Middle package: lde.json says deep-a, but it has a stale lde.lock referencing deep-b (nonexistent)
573+ local middleDir = path .join (tmpBase , " ignore-lockfile-middle" )
574+ fs .mkdir (middleDir )
575+ fs .mkdir (path .join (middleDir , " src" ))
576+ fs .write (path .join (middleDir , " src" , " init.lua" ), " return {}" )
577+ fs .write (path .join (middleDir , " lde.json" ), json .encode ({
578+ name = " ignore-lockfile-middle" ,
579+ version = " 0.1.0" ,
580+ dependencies = {
581+ [" ignore-lockfile-deep-a" ] = { path = " ../ignore-lockfile-deep-a" }
582+ }
583+ }))
584+ -- Write a stale lockfile in the middle that points to a nonexistent deep-b
585+ -- If this lockfile were consulted, install would fail trying to resolve deep-b
586+ fs .write (path .join (middleDir , " lde.lock" ), json .encode ({
587+ version = " 1" ,
588+ dependencies = {
589+ [" ignore-lockfile-deep-b" ] = { path = path .join (tmpBase , " ignore-lockfile-deep-b" ) }
590+ }
591+ }))
592+
593+ -- Root depends only on middle
594+ local rootDir = path .join (tmpBase , " ignore-lockfile-root" )
595+ fs .mkdir (rootDir )
596+ fs .mkdir (path .join (rootDir , " src" ))
597+ fs .write (path .join (rootDir , " src" , " init.lua" ), " return {}" )
598+ fs .write (path .join (rootDir , " lde.json" ), json .encode ({
599+ name = " ignore-lockfile-root" ,
600+ version = " 0.1.0" ,
601+ dependencies = {
602+ [" ignore-lockfile-middle" ] = { path = " ../ignore-lockfile-middle" }
603+ }
604+ }))
605+
606+ local root = lde .Package .open (rootDir )
607+ root :installDependencies ()
608+
609+ -- Root lockfile must contain deep-a (from lde.json), NOT deep-b (from stale lockfile)
610+ local lockfile = root :readLockfile ()
611+ test .truthy (lockfile )
612+ test .truthy (lockfile :getDependency (" ignore-lockfile-deep-a" ))
613+ test .falsy (lockfile :getDependency (" ignore-lockfile-deep-b" ))
614+ end )
615+
558616-- It's undefined behavior for lde specifically to rely on transitive deps.
559617-- But regardless need to ensure it works at runtime for the actual dependencies that will use it.
560618test .it (" transitive dep: util is resolvable as a dependency of lde-core" , function ()
0 commit comments