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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
import {
notImplemented,
intoCallbackAPIWithIntercept,
MaybeEmpty
} from "./_utils.ts";
const {
readFile: denoReadFile,
readFileSync: denoReadFileSync,
readlink: denoReadlink,
readlinkSync: denoReadlinkSync
} = Deno;
type ReadFileCallback = (
err: MaybeEmpty<Error>,
data: MaybeEmpty<string | Uint8Array>
) => void;
interface ReadFileOptions {
encoding?: string | null;
flag?: string;
}
type ReadlinkCallback = (
err: MaybeEmpty<Error>,
linkString: MaybeEmpty<string | Uint8Array>
) => void;
interface ReadlinkOptions {
encoding?: string | null;
}
function getEncoding(
optOrCallback?: ReadFileOptions | ReadFileCallback
): string | null {
if (!optOrCallback || typeof optOrCallback === "function") {
return null;
} else {
if (optOrCallback.encoding) {
if (
optOrCallback.encoding === "utf8" ||
optOrCallback.encoding === "utf-8"
) {
return "utf8";
} else if (optOrCallback.encoding === "buffer") {
return "buffer";
} else {
notImplemented();
}
}
return null;
}
}
function maybeDecode(
data: Uint8Array,
encoding: string | null
): string | Uint8Array {
if (encoding === "utf8") {
return new TextDecoder().decode(data);
}
return data;
}
function maybeEncode(
data: string,
encoding: string | null
): string | Uint8Array {
if (encoding === "buffer") {
return new TextEncoder().encode(data);
}
return data;
}
export function readFile(
path: string,
optOrCallback: ReadFileCallback | ReadFileOptions,
callback?: ReadFileCallback
): void {
let cb: ReadFileCallback | undefined;
if (typeof optOrCallback === "function") {
cb = optOrCallback;
} else {
cb = callback;
}
const encoding = getEncoding(optOrCallback);
intoCallbackAPIWithIntercept<Uint8Array, string | Uint8Array>(
denoReadFile,
(data: Uint8Array): string | Uint8Array => maybeDecode(data, encoding),
cb,
path
);
}
export function readFileSync(
path: string,
opt?: ReadFileOptions
): string | Uint8Array {
return maybeDecode(denoReadFileSync(path), getEncoding(opt));
}
export function readlink(
path: string,
optOrCallback: ReadlinkCallback | ReadlinkOptions,
callback?: ReadlinkCallback
): void {
let cb: ReadlinkCallback | undefined;
if (typeof optOrCallback === "function") {
cb = optOrCallback;
} else {
cb = callback;
}
const encoding = getEncoding(optOrCallback);
intoCallbackAPIWithIntercept<string, Uint8Array | string>(
denoReadlink,
(data: string): string | Uint8Array => maybeEncode(data, encoding),
cb,
path
);
}
export function readlinkSync(
path: string,
opt?: ReadlinkOptions
): string | Uint8Array {
return maybeEncode(denoReadlinkSync(path), getEncoding(opt));
}
|