index.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import fs from 'fs';
  2. import path from 'path';
  3. export async function readFile(path: string, encoding?): Promise<string> {
  4. return new Promise<string>((resolve, reject) => {
  5. fs.readFile(path, { encoding }, (err, data) => {
  6. if (err) return reject(err);
  7. try {
  8. resolve(data.toString());
  9. } catch (e) {
  10. reject(e);
  11. }
  12. });
  13. });
  14. }
  15. export async function readJsonFile<T>(path: string, encoding = 'utf-8'): Promise<T> {
  16. return new Promise<T>(async (resolve, reject) => {
  17. try {
  18. resolve(JSON.parse(
  19. await readFile(path, encoding)
  20. ) as T);
  21. } catch (e) {
  22. reject(e);
  23. }
  24. });
  25. }
  26. export function readDir(dir: string): Promise<fs.Dirent[]> {
  27. return new Promise<fs.Dirent[]>((resolve, reject) => {
  28. fs.readdir(dir, { withFileTypes: true }, (err, list) => {
  29. if (err) return reject(err);
  30. resolve(list);
  31. });
  32. });
  33. }
  34. export function readJsonDir<T>(dir: string, filenameProperty?: string): Promise<T[]> {
  35. return new Promise<T[]>((resolve, reject) => {
  36. fs.readdir(dir, { withFileTypes: true }, async (err, list) => {
  37. if (err) return reject(err);
  38. const arr: T[] = [];
  39. for (const e of list.filter(e => e.isFile() && e.name.match(/\.json$/))) {
  40. const json: T = await readJsonFile<T>(path.resolve(dir, e.name));
  41. if (typeof filenameProperty === 'string') {
  42. json[filenameProperty] = e.name;
  43. }
  44. arr.push(json);
  45. }
  46. resolve(arr);
  47. });
  48. });
  49. }
  50. export function getSubdirNames(dir: string): Promise<string[]> {
  51. return new Promise<string[]>((resolve, reject) => {
  52. fs.readdir(dir, { withFileTypes: true }, async (err, list) => {
  53. if (err) return reject(err);
  54. resolve(list.filter(e => e.isDirectory()).map(e => e.name));
  55. });
  56. });
  57. }