OutputFileFinder.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. const Path = require('path')
  2. const fs = require('fs')
  3. const { callbackifyMultiResult } = require('@overleaf/promise-utils')
  4. async function walkFolder(compileDir, d, files, allEntries) {
  5. const dirents = await fs.promises.readdir(Path.join(compileDir, d), {
  6. withFileTypes: true,
  7. })
  8. for (const dirent of dirents) {
  9. const p = Path.join(d, dirent.name)
  10. if (dirent.isDirectory()) {
  11. await walkFolder(compileDir, p, files, allEntries)
  12. allEntries.push(p + '/')
  13. } else if (dirent.isFile()) {
  14. files.push(p)
  15. allEntries.push(p)
  16. } else {
  17. allEntries.push(p)
  18. }
  19. }
  20. }
  21. async function findOutputFiles(resources, directory) {
  22. const files = []
  23. const allEntries = []
  24. await walkFolder(directory, '', files, allEntries)
  25. const incomingResources = new Set(resources.map(resource => resource.path))
  26. const outputFiles = []
  27. for (const path of files) {
  28. if (incomingResources.has(path)) continue
  29. if (path === '.project-sync-state') continue
  30. if (path === '.project-lock') continue
  31. outputFiles.push({
  32. path,
  33. type: Path.extname(path).replace(/^\./, '') || undefined,
  34. })
  35. }
  36. return {
  37. outputFiles,
  38. allEntries,
  39. }
  40. }
  41. module.exports = {
  42. findOutputFiles: callbackifyMultiResult(findOutputFiles, [
  43. 'outputFiles',
  44. 'allEntries',
  45. ]),
  46. promises: {
  47. findOutputFiles,
  48. },
  49. }