马宇豪
2024-07-16 f591c27b57e2418c9495bc02ae8cfff84d35bc18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Tobias Koppers @sokra
*/
 
"use strict";
 
/** @typedef {import("./Resolver").FileSystem} FileSystem */
/** @typedef {import("./Resolver").SyncFileSystem} SyncFileSystem */
 
/**
 * @param {SyncFileSystem} fs file system implementation
 * @constructor
 */
function SyncAsyncFileSystemDecorator(fs) {
    this.fs = fs;
 
    /** @type {FileSystem["lstat"] | undefined} */
    this.lstat = undefined;
    /** @type {SyncFileSystem["lstatSync"] | undefined} */
    this.lstatSync = undefined;
    const lstatSync = fs.lstatSync;
    if (lstatSync) {
        this.lstat = (arg, options, callback) => {
            let result;
            try {
                result = lstatSync.call(fs, arg);
            } catch (e) {
                // @ts-ignore
                return (callback || options)(e);
            }
            // @ts-ignore
            (callback || options)(null, result);
        };
        this.lstatSync = (arg, options) => lstatSync.call(fs, arg, options);
    }
    // @ts-ignore
    this.stat = (arg, options, callback) => {
        let result;
        try {
            result = callback ? fs.statSync(arg, options) : fs.statSync(arg);
        } catch (e) {
            return (callback || options)(e);
        }
        (callback || options)(null, result);
    };
    /** @type {SyncFileSystem["statSync"]} */
    this.statSync = (arg, options) => fs.statSync(arg, options);
    // @ts-ignore
    this.readdir = (arg, options, callback) => {
        let result;
        try {
            result = fs.readdirSync(arg);
        } catch (e) {
            return (callback || options)(e);
        }
        (callback || options)(null, result);
    };
    /** @type {SyncFileSystem["readdirSync"]} */
    this.readdirSync = (arg, options) => fs.readdirSync(arg, options);
    // @ts-ignore
    this.readFile = (arg, options, callback) => {
        let result;
        try {
            result = fs.readFileSync(arg);
        } catch (e) {
            return (callback || options)(e);
        }
        (callback || options)(null, result);
    };
    /** @type {SyncFileSystem["readFileSync"]} */
    this.readFileSync = (arg, options) => fs.readFileSync(arg, options);
    // @ts-ignore
    this.readlink = (arg, options, callback) => {
        let result;
        try {
            result = fs.readlinkSync(arg);
        } catch (e) {
            return (callback || options)(e);
        }
        (callback || options)(null, result);
    };
    /** @type {SyncFileSystem["readlinkSync"]} */
    this.readlinkSync = (arg, options) => fs.readlinkSync(arg, options);
    /** @type {FileSystem["readJson"] | undefined} */
    this.readJson = undefined;
    /** @type {SyncFileSystem["readJsonSync"] | undefined} */
    this.readJsonSync = undefined;
    const readJsonSync = fs.readJsonSync;
    if (readJsonSync) {
        this.readJson = (arg, options, callback) => {
            let result;
            try {
                result = readJsonSync.call(fs, arg);
            } catch (e) {
                // @ts-ignore
                return (callback || options)(e);
            }
            (callback || options)(null, result);
        };
        this.readJsonSync = (arg, options) => readJsonSync.call(fs, arg, options);
    }
}
module.exports = SyncAsyncFileSystemDecorator;