From 608018213359a8b93c7b22affb7c741e33f6b717 Mon Sep 17 00:00:00 2001 From: Shigoto-dev19 Date: Tue, 20 Aug 2024 14:14:18 +0300 Subject: [PATCH] Fix ZkProgram path to use basename if located outside the source directory --- src/lib/deploy.js | 13 +++++++++---- src/lib/deploy.test.js | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/lib/deploy.js b/src/lib/deploy.js index 0847bda9..11fdce9d 100644 --- a/src/lib/deploy.js +++ b/src/lib/deploy.js @@ -792,13 +792,18 @@ async function findZkProgramFile(buildPath, zkProgramNameArg) { // eslint-disable-next-line no-unused-vars const [_, zkProgramVarName, nameArg] = match; + const buildSrcPath = buildPath.replace('**/*.js', 'src'); + const relativePath = path.relative(buildSrcPath, file); + + const isNested = + !relativePath.startsWith('..') && !path.isAbsolute(relativePath); + + const zkProgramFile = isNested ? relativePath : path.basename(file); + if (nameArg === zkProgramNameArg) { return { zkProgramVarName, - zkProgramFile: path.relative( - buildPath.replace('**/*.js', 'src'), - file - ), + zkProgramFile, }; } } diff --git a/src/lib/deploy.test.js b/src/lib/deploy.test.js index 7f81054e..357a737b 100644 --- a/src/lib/deploy.test.js +++ b/src/lib/deploy.test.js @@ -61,6 +61,21 @@ jest.unstable_mockModule('node:path', () => ({ resolve: jest.fn(), dirname: jest.fn(), sep: '/', + relative: jest.fn().mockImplementation((from, to) => { + const fromParts = from.split('/'); + const toParts = to.split('/'); + + let commonLength = 0; + for (let i = 0; i < Math.min(fromParts.length, toParts.length); i++) { + if (fromParts[i] !== toParts[i]) break; + commonLength++; + } + + const up = fromParts.slice(commonLength).map(() => '..'); + const down = toParts.slice(commonLength); + + return [...up, ...down].join('/') || '.'; + }), }, })); @@ -1075,6 +1090,31 @@ describe('deploy.js', () => { ); }); + it('should return the ZkProgram when found in nested folders', async () => { + const projectRoot = '/some/path/'; + const zkProgramNameArg = 'myZkProgram'; + const zkProgramFile = 'proofs/file1.js'; + const zkProgramMock = { name: 'myZkProgram' }; + glob.mockResolvedValue(['/some/path/file1.js']); + fs.readFileSync.mockReturnValue( + ` + const myVar = ZkProgram({ + name: 'myZkProgram' + }); + ` + ); + jest.spyOn(path, 'basename').mockReturnValue('proofs/file1.js'); + dynamicImport.mockResolvedValue({ myVar: zkProgramMock }); + const { getZkProgram } = await import('./deploy.js'); + + const result = await getZkProgram(projectRoot, zkProgramNameArg); + + expect(result).toBe(zkProgramMock); + expect(dynamicImport).toHaveBeenCalledWith( + `${projectRoot}/build/src/${zkProgramFile}` + ); + }); + it('should handle Windows paths correctly', async () => { const originalPlatform = process.platform; try {