fs-extra.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import path from 'path';
  2. const fs: {
  3. __createMockFiles: typeof createMockFiles;
  4. __resetAllMocks: typeof resetAllMocks;
  5. readFileSync: typeof readFileSync;
  6. existsSync: typeof existsSync;
  7. writeFileSync: typeof writeFileSync;
  8. mkdirSync: typeof mkdirSync;
  9. rmSync: typeof rmSync;
  10. readdirSync: typeof readdirSync;
  11. copyFileSync: typeof copyFileSync;
  12. copySync: typeof copyFileSync;
  13. createFileSync: typeof createFileSync;
  14. unlinkSync: typeof unlinkSync;
  15. } = jest.genMockFromModule('fs-extra');
  16. let mockFiles = Object.create(null);
  17. const createMockFiles = (newMockFiles: Record<string, string>) => {
  18. mockFiles = Object.create(null);
  19. // Create folder tree
  20. for (const file in newMockFiles) {
  21. const dir = path.dirname(file);
  22. if (!mockFiles[dir]) {
  23. mockFiles[dir] = [];
  24. }
  25. mockFiles[dir].push(path.basename(file));
  26. mockFiles[file] = newMockFiles[file];
  27. }
  28. };
  29. const readFileSync = (p: string) => {
  30. return mockFiles[p];
  31. };
  32. const existsSync = (p: string) => {
  33. return mockFiles[p] !== undefined;
  34. };
  35. const writeFileSync = (p: string, data: any) => {
  36. mockFiles[p] = data;
  37. };
  38. const mkdirSync = (p: string) => {
  39. mockFiles[p] = Object.create(null);
  40. };
  41. const rmSync = (p: string) => {
  42. if (mockFiles[p] instanceof Array) {
  43. mockFiles[p].forEach((file: string) => {
  44. delete mockFiles[path.join(p, file)];
  45. });
  46. }
  47. delete mockFiles[p];
  48. };
  49. const readdirSync = (p: string) => {
  50. const files: string[] = [];
  51. const depth = p.split('/').length;
  52. Object.keys(mockFiles).forEach((file) => {
  53. if (file.startsWith(p)) {
  54. const fileDepth = file.split('/').length;
  55. if (fileDepth === depth + 1) {
  56. files.push(file.split('/').pop() || '');
  57. }
  58. }
  59. });
  60. return files;
  61. };
  62. const copyFileSync = (source: string, destination: string) => {
  63. mockFiles[destination] = mockFiles[source];
  64. };
  65. const copySync = (source: string, destination: string) => {
  66. mockFiles[destination] = mockFiles[source];
  67. if (mockFiles[source] instanceof Array) {
  68. mockFiles[source].forEach((file: string) => {
  69. mockFiles[destination + '/' + file] = mockFiles[source + '/' + file];
  70. });
  71. }
  72. };
  73. const createFileSync = (p: string) => {
  74. mockFiles[p] = '';
  75. };
  76. const resetAllMocks = () => {
  77. mockFiles = Object.create(null);
  78. };
  79. const unlinkSync = (p: string) => {
  80. if (mockFiles[p] instanceof Array) {
  81. mockFiles[p].forEach((file: string) => {
  82. delete mockFiles[path.join(p, file)];
  83. });
  84. }
  85. delete mockFiles[p];
  86. };
  87. fs.unlinkSync = unlinkSync;
  88. fs.readdirSync = readdirSync;
  89. fs.existsSync = existsSync;
  90. fs.readFileSync = readFileSync;
  91. fs.writeFileSync = writeFileSync;
  92. fs.mkdirSync = mkdirSync;
  93. fs.rmSync = rmSync;
  94. fs.copyFileSync = copyFileSync;
  95. fs.copySync = copySync;
  96. fs.createFileSync = createFileSync;
  97. fs.__createMockFiles = createMockFiles;
  98. fs.__resetAllMocks = resetAllMocks;
  99. module.exports = fs;