fs-extra.ts 2.4 KB

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