OutputFileFinder.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. outputFiles.push({
  31. path,
  32. type: Path.extname(path).replace(/^\./, '') || undefined,
  33. })
  34. }
  35. return {
  36. outputFiles,
  37. allEntries,
  38. }
  39. }
  40. module.exports = {
  41. findOutputFiles: callbackifyMultiResult(findOutputFiles, [
  42. 'outputFiles',
  43. 'allEntries',
  44. ]),
  45. promises: {
  46. findOutputFiles,
  47. },
  48. }