diff --git a/src/exporter.js b/src/exporter.js index 9b815a8..c1e03bf 100644 --- a/src/exporter.js +++ b/src/exporter.js @@ -8,15 +8,12 @@ const ArtifactExporter = { lines.forEach(line => { const trimmedLine = line.trim(); - // Check if this is a directory (ends with /) if (trimmedLine.endsWith('/')) { currentPath = trimmedLine; } else if (trimmedLine && !trimmedLine.startsWith('/')) { if (line.startsWith(' ')) { - // File is indented, so it's in the current directory pathMapping[trimmedLine] = currentPath + trimmedLine; } else { - // File is at root level pathMapping[trimmedLine] = trimmedLine; } } @@ -24,13 +21,58 @@ const ArtifactExporter = { return pathMapping; }, + + extractFilenamesFromFileMap(fileMap) { + const lines = fileMap.split('\n').filter(line => line.trim()); + const filenames = []; + + lines.forEach(line => { + const trimmedLine = line.trim(); + + if (trimmedLine.endsWith('/') || !trimmedLine || trimmedLine.startsWith('/')) { + return; + } + + const filename = trimmedLine.replace(/^\s+/, ''); + if (filename) { + filenames.push(filename); + } + }); + + return filenames.sort((a, b) => b.length - a.length); + }, + + extractFilenameFromArtifactName(artifactName, sortedFilenames) { + for (const filename of sortedFilenames) { + const lowerArtifactName = artifactName.toLowerCase(); + const lowerFilename = filename.toLowerCase(); + + if (lowerArtifactName.includes(lowerFilename)) { + return filename; + } + } + + return artifactName; + }, createFinalMapping(artifactCollection, pathMapping) { const finalMap = {}; - Object.entries(artifactCollection).forEach(([filename, content]) => { - const fullPath = pathMapping[filename] || filename; // Use filename as-is if not in mapping + + const sortedFilenames = this.extractFilenamesFromFileMap(Object.keys(pathMapping).join('\n')); + + Object.entries(artifactCollection).forEach(([artifactName, content]) => { + const extractedFilename = this.extractFilenameFromArtifactName(artifactName, sortedFilenames); + const fullPath = pathMapping[extractedFilename] || extractedFilename; + + if (artifactName !== extractedFilename) { + console.log(`Mapped artifact "${artifactName}" -> found filename "${extractedFilename}" -> "${fullPath}"`); + } else { + console.log(`Mapped artifact "${artifactName}" -> "${fullPath}"`); + } + finalMap[fullPath] = content; }); + return finalMap; }, @@ -44,17 +86,14 @@ const ArtifactExporter = { addFilesToZip(zip, finalMap) { Object.entries(finalMap).forEach(([fullPath, content]) => { - // Handle directory structure const pathParts = fullPath.split('/'); if (pathParts.length > 1) { - // File is in a directory const filename = pathParts.pop(); const folderPath = pathParts.join('/'); const folder = zip.folder(folderPath); folder.file(filename, content); } else { - // File is at root level zip.file(fullPath, content); } });