@@ -61,6 +61,21 @@ jest.unstable_mockModule('node:path', () => ({
6161 resolve : jest . fn ( ) ,
6262 dirname : jest . fn ( ) ,
6363 sep : '/' ,
64+ relative : jest . fn ( ) . mockImplementation ( ( from , to ) => {
65+ const fromParts = from . split ( '/' ) ;
66+ const toParts = to . split ( '/' ) ;
67+
68+ let commonLength = 0 ;
69+ for ( let i = 0 ; i < Math . min ( fromParts . length , toParts . length ) ; i ++ ) {
70+ if ( fromParts [ i ] !== toParts [ i ] ) break ;
71+ commonLength ++ ;
72+ }
73+
74+ const up = fromParts . slice ( commonLength ) . map ( ( ) => '..' ) ;
75+ const down = toParts . slice ( commonLength ) ;
76+
77+ return [ ...up , ...down ] . join ( '/' ) || '.' ;
78+ } ) ,
6479 } ,
6580} ) ) ;
6681
@@ -1075,6 +1090,31 @@ describe('deploy.js', () => {
10751090 ) ;
10761091 } ) ;
10771092
1093+ it ( 'should return the ZkProgram when found in nested folders' , async ( ) => {
1094+ const projectRoot = '/some/path/' ;
1095+ const zkProgramNameArg = 'myZkProgram' ;
1096+ const zkProgramFile = 'proofs/file1.js' ;
1097+ const zkProgramMock = { name : 'myZkProgram' } ;
1098+ glob . mockResolvedValue ( [ '/some/path/file1.js' ] ) ;
1099+ fs . readFileSync . mockReturnValue (
1100+ `
1101+ const myVar = ZkProgram({
1102+ name: 'myZkProgram'
1103+ });
1104+ `
1105+ ) ;
1106+ jest . spyOn ( path , 'basename' ) . mockReturnValue ( 'proofs/file1.js' ) ;
1107+ dynamicImport . mockResolvedValue ( { myVar : zkProgramMock } ) ;
1108+ const { getZkProgram } = await import ( './deploy.js' ) ;
1109+
1110+ const result = await getZkProgram ( projectRoot , zkProgramNameArg ) ;
1111+
1112+ expect ( result ) . toBe ( zkProgramMock ) ;
1113+ expect ( dynamicImport ) . toHaveBeenCalledWith (
1114+ `${ projectRoot } /build/src/${ zkProgramFile } `
1115+ ) ;
1116+ } ) ;
1117+
10781118 it ( 'should handle Windows paths correctly' , async ( ) => {
10791119 const originalPlatform = process . platform ;
10801120 try {
0 commit comments