@gjsify/fs 0.3.21 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/lib/esm/_virtual/_rolldown/runtime.js +1 -1
  2. package/lib/esm/callback.js +1 -1
  3. package/lib/esm/cp.js +1 -1
  4. package/lib/esm/dir.js +1 -1
  5. package/lib/esm/dirent.js +1 -1
  6. package/lib/esm/encoding.js +1 -1
  7. package/lib/esm/errors.js +1 -1
  8. package/lib/esm/fd-ops.js +1 -1
  9. package/lib/esm/file-handle.js +1 -1
  10. package/lib/esm/fs-watcher.js +1 -1
  11. package/lib/esm/glob.js +1 -1
  12. package/lib/esm/read-stream.js +1 -1
  13. package/lib/esm/stat-watcher.js +1 -1
  14. package/lib/esm/statfs.js +1 -1
  15. package/lib/esm/stats.js +1 -1
  16. package/lib/esm/sync.js +1 -1
  17. package/lib/esm/utils.js +1 -1
  18. package/lib/esm/utimes.js +1 -1
  19. package/lib/esm/write-stream.js +1 -1
  20. package/package.json +51 -48
  21. package/src/callback.spec.ts +0 -296
  22. package/src/callback.ts +0 -684
  23. package/src/cp.spec.ts +0 -181
  24. package/src/cp.ts +0 -328
  25. package/src/dir.spec.ts +0 -204
  26. package/src/dir.ts +0 -199
  27. package/src/dirent.ts +0 -165
  28. package/src/encoding.ts +0 -45
  29. package/src/errors.spec.ts +0 -389
  30. package/src/errors.ts +0 -19
  31. package/src/extended.spec.ts +0 -706
  32. package/src/fd-ops.spec.ts +0 -234
  33. package/src/fd-ops.ts +0 -251
  34. package/src/file-handle.spec.ts +0 -115
  35. package/src/file-handle.ts +0 -856
  36. package/src/fs-watcher.ts +0 -198
  37. package/src/glob.spec.ts +0 -201
  38. package/src/glob.ts +0 -205
  39. package/src/index.ts +0 -313
  40. package/src/new-apis.spec.ts +0 -505
  41. package/src/promises.spec.ts +0 -812
  42. package/src/promises.ts +0 -686
  43. package/src/read-stream.ts +0 -128
  44. package/src/stat-watcher.ts +0 -116
  45. package/src/stat.spec.ts +0 -87
  46. package/src/statfs.spec.ts +0 -67
  47. package/src/statfs.ts +0 -92
  48. package/src/stats.ts +0 -207
  49. package/src/streams.spec.ts +0 -513
  50. package/src/symlink.spec.ts +0 -188
  51. package/src/sync.spec.ts +0 -377
  52. package/src/sync.ts +0 -562
  53. package/src/test.mts +0 -27
  54. package/src/types/encoding-option.ts +0 -3
  55. package/src/types/file-read-options.ts +0 -15
  56. package/src/types/file-read-result.ts +0 -4
  57. package/src/types/flag-and-open-mode.ts +0 -6
  58. package/src/types/index.ts +0 -6
  59. package/src/types/open-flags.ts +0 -14
  60. package/src/types/read-options.ts +0 -9
  61. package/src/utils.ts +0 -31
  62. package/src/utimes.spec.ts +0 -113
  63. package/src/utimes.ts +0 -97
  64. package/src/watch.spec.ts +0 -171
  65. package/src/watchfile.spec.ts +0 -185
  66. package/src/write-stream.ts +0 -142
  67. package/test/file.txt +0 -1
  68. package/tsconfig.json +0 -29
  69. package/tsconfig.tsbuildinfo +0 -1
@@ -1,234 +0,0 @@
1
- // Ported from refs/node-test/parallel/test-fs-read-sync.js + test-fs-write-sync.js (behavior)
2
- // Original: MIT, Node.js contributors.
3
- // Rewritten for @gjsify/unit — behavior preserved, assertion dialect adapted.
4
-
5
- import { describe, it, expect } from '@gjsify/unit';
6
- import {
7
- openSync, closeSync,
8
- fstatSync, fstat,
9
- ftruncateSync,
10
- fdatasync, fsync,
11
- fchmodSync,
12
- readSync, writeSync,
13
- readv, writev,
14
- exists,
15
- openAsBlob,
16
- promises,
17
- writeFileSync, unlinkSync, readFileSync,
18
- } from 'node:fs';
19
- import { tmpdir } from 'node:os';
20
- import { join } from 'node:path';
21
-
22
- const TMP = tmpdir();
23
-
24
- function tmpFile(name: string, content = 'hello world'): string {
25
- const p = join(TMP, `gjsify-fdops-${name}-${process.pid}`);
26
- writeFileSync(p, content);
27
- return p;
28
- }
29
-
30
- export default async () => {
31
- await describe('fs fd-based operations', async () => {
32
- await it('fstatSync returns Stats with correct size', async () => {
33
- const f = tmpFile('fstat', 'hello');
34
- const fd = openSync(f, 'r');
35
- try {
36
- const st = fstatSync(fd);
37
- expect(st.size).toBe(5);
38
- expect(typeof st.mtime).toBe('object');
39
- } finally {
40
- closeSync(fd);
41
- unlinkSync(f);
42
- }
43
- });
44
-
45
- await it('fstat callback returns Stats', async () => {
46
- const f = tmpFile('fstat-cb', 'world');
47
- const fd = openSync(f, 'r');
48
- try {
49
- const st = await new Promise<any>((resolve, reject) => {
50
- fstat(fd, (err, s) => err ? reject(err) : resolve(s));
51
- });
52
- expect(st.size).toBe(5);
53
- } finally {
54
- closeSync(fd);
55
- unlinkSync(f);
56
- }
57
- });
58
-
59
- await it('promises.fstat returns Stats', async () => {
60
- const f = tmpFile('fstat-p', 'gjsify');
61
- const fh = await promises.open(f, 'r');
62
- try {
63
- const st = await fh.stat();
64
- expect(st.size).toBe(6);
65
- } finally {
66
- await fh.close();
67
- unlinkSync(f);
68
- }
69
- });
70
-
71
- await it('ftruncateSync truncates file', async () => {
72
- const f = tmpFile('ftrunc', '0123456789');
73
- const fd = openSync(f, 'r+');
74
- try {
75
- ftruncateSync(fd, 4);
76
- const data = readFileSync(f, 'utf8');
77
- expect(data).toBe('0123');
78
- } finally {
79
- closeSync(fd);
80
- unlinkSync(f);
81
- }
82
- });
83
-
84
- await it('fdatasync callback completes without error', async () => {
85
- const f = tmpFile('fdatasync', 'data');
86
- const fd = openSync(f, 'r+');
87
- try {
88
- await new Promise<void>((resolve, reject) => {
89
- fdatasync(fd, (err) => err ? reject(err) : resolve());
90
- });
91
- } finally {
92
- closeSync(fd);
93
- unlinkSync(f);
94
- }
95
- });
96
-
97
- await it('fsync callback completes without error', async () => {
98
- const f = tmpFile('fsync', 'data');
99
- const fd = openSync(f, 'r+');
100
- try {
101
- await new Promise<void>((resolve, reject) => {
102
- fsync(fd, (err) => err ? reject(err) : resolve());
103
- });
104
- } finally {
105
- closeSync(fd);
106
- unlinkSync(f);
107
- }
108
- });
109
-
110
- await it('fchmodSync changes file permissions', async () => {
111
- const f = tmpFile('fchmod', 'x');
112
- const fd = openSync(f, 'r');
113
- try {
114
- fchmodSync(fd, 0o600);
115
- const st = fstatSync(fd);
116
- expect(st.mode & 0o777).toBe(0o600);
117
- } finally {
118
- closeSync(fd);
119
- unlinkSync(f);
120
- }
121
- });
122
-
123
- await it('closeSync closes the fd', async () => {
124
- const f = tmpFile('close', 'c');
125
- const fd = openSync(f, 'r');
126
- closeSync(fd);
127
- expect(() => fstatSync(fd)).toThrow();
128
- unlinkSync(f);
129
- });
130
-
131
- await it('readSync reads bytes from position 0', async () => {
132
- const f = tmpFile('rsync', 'abcdef');
133
- const fd = openSync(f, 'r');
134
- try {
135
- const buf = Buffer.alloc(3);
136
- const n = readSync(fd, buf, 0, 3, 0);
137
- expect(n).toBe(3);
138
- expect(buf.toString()).toBe('abc');
139
- } finally {
140
- closeSync(fd);
141
- unlinkSync(f);
142
- }
143
- });
144
-
145
- await it('readSync reads into buffer at offset', async () => {
146
- const f = tmpFile('rsync-off', 'hello');
147
- const fd = openSync(f, 'r');
148
- try {
149
- const buf = Buffer.alloc(8);
150
- const n = readSync(fd, buf, 2, 5, 0);
151
- expect(n).toBe(5);
152
- expect(buf.slice(2, 7).toString()).toBe('hello');
153
- } finally {
154
- closeSync(fd);
155
- unlinkSync(f);
156
- }
157
- });
158
-
159
- await it('writeSync writes bytes to file', async () => {
160
- const f = tmpFile('wsync', '-----');
161
- const fd = openSync(f, 'r+');
162
- try {
163
- const n = writeSync(fd, Buffer.from('XYZ'), 0, 3, 0);
164
- expect(n).toBe(3);
165
- closeSync(fd);
166
- expect(readFileSync(f, 'utf8').slice(0, 3)).toBe('XYZ');
167
- } finally {
168
- unlinkSync(f);
169
- }
170
- });
171
-
172
- await it('readv reads into multiple buffers', async () => {
173
- const f = tmpFile('readv', 'abcdef');
174
- const fd = openSync(f, 'r');
175
- try {
176
- const b1 = Buffer.alloc(2);
177
- const b2 = Buffer.alloc(3);
178
- await new Promise<void>((resolve, reject) => {
179
- readv(fd, [b1, b2], 0, (err, bytesRead) => {
180
- if (err) return reject(err);
181
- expect(bytesRead).toBe(5);
182
- expect(b1.toString()).toBe('ab');
183
- expect(b2.toString()).toBe('cde');
184
- resolve();
185
- });
186
- });
187
- } finally {
188
- closeSync(fd);
189
- unlinkSync(f);
190
- }
191
- });
192
-
193
- await it('writev writes multiple buffers', async () => {
194
- const f = tmpFile('writev', '------');
195
- const fd = openSync(f, 'r+');
196
- try {
197
- const b1 = Buffer.from('AB');
198
- const b2 = Buffer.from('CDE');
199
- await new Promise<void>((resolve, reject) => {
200
- writev(fd, [b1, b2], 0, (err, bytesWritten) => {
201
- if (err) return reject(err);
202
- expect(bytesWritten).toBe(5);
203
- resolve();
204
- });
205
- });
206
- closeSync(fd);
207
- expect(readFileSync(f, 'utf8').slice(0, 5)).toBe('ABCDE');
208
- } finally {
209
- unlinkSync(f);
210
- }
211
- });
212
-
213
- await it('exists returns true for existing path, false for missing', async () => {
214
- const f = tmpFile('exists', 'e');
215
- const existing = await new Promise<boolean>((resolve) => {
216
- exists(f, (v) => resolve(v));
217
- });
218
- expect(existing).toBe(true);
219
- const missing = await new Promise<boolean>((resolve) => {
220
- exists(join(TMP, 'gjsify-nonexistent-xyz-123'), (v) => resolve(v));
221
- });
222
- expect(missing).toBe(false);
223
- unlinkSync(f);
224
- });
225
-
226
- await it('openAsBlob returns Blob with correct size', async () => {
227
- const f = tmpFile('blob', 'blobdata');
228
- const blob = await openAsBlob(f);
229
- expect(blob.size).toBe(8);
230
- expect(blob instanceof Blob).toBe(true);
231
- unlinkSync(f);
232
- });
233
- });
234
- };
package/src/fd-ops.ts DELETED
@@ -1,251 +0,0 @@
1
- // Reference: Node.js lib/fs.js (fd-based ops, readSync, writeSync, readv, writev, exists, openAsBlob)
2
- // Reimplemented for GJS using FileHandle + Gio streams
3
-
4
- import GLib from '@girs/glib-2.0';
5
- import Gio from '@girs/gio-2.0';
6
- import { FileHandle } from './file-handle.js';
7
- import { Stats, BigIntStats } from './stats.js';
8
- import { statSync, truncateSync, chmodSync, chownSync, readFileSync } from './sync.js';
9
- import { utimesSync } from './utimes.js';
10
- import { normalizePath } from './utils.js';
11
-
12
- import type { PathLike, TimeLike, StatOptions } from 'node:fs';
13
-
14
- function getFH(fd: number | FileHandle): FileHandle {
15
- if (fd instanceof FileHandle) return FileHandle.getInstance(fd.fd);
16
- return FileHandle.getInstance(fd as number);
17
- }
18
-
19
- // ─── fstat ────────────────────────────────────────────────────────────────────
20
-
21
- export function fstatSync(fd: number, options?: { bigint?: false }): Stats;
22
- export function fstatSync(fd: number, options: { bigint: true }): BigIntStats;
23
- export function fstatSync(fd: number, options?: { bigint?: boolean }): Stats | BigIntStats {
24
- return statSync(normalizePath(getFH(fd).options.path), options as any);
25
- }
26
-
27
- export function fstat(fd: number, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void;
28
- export function fstat(fd: number, options: StatOptions, callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void): void;
29
- export function fstat(fd: number, optionsOrCb: any, callback?: any): void {
30
- if (typeof optionsOrCb === 'function') { callback = optionsOrCb; optionsOrCb = {}; }
31
- Promise.resolve()
32
- .then(() => fstatSync(fd, optionsOrCb))
33
- .then(s => callback(null, s), callback);
34
- }
35
-
36
- export async function fstatAsync(fd: number, options?: StatOptions): Promise<Stats | BigIntStats> {
37
- return fstatSync(fd, options as any);
38
- }
39
-
40
- // ─── ftruncate ────────────────────────────────────────────────────────────────
41
-
42
- export function ftruncateSync(fd: number, len = 0): void {
43
- truncateSync(normalizePath(getFH(fd).options.path), len);
44
- }
45
-
46
- export function ftruncate(fd: number, callback: (err: NodeJS.ErrnoException | null) => void): void;
47
- export function ftruncate(fd: number, len: number, callback: (err: NodeJS.ErrnoException | null) => void): void;
48
- export function ftruncate(fd: number, lenOrCb: any, callback?: any): void {
49
- if (typeof lenOrCb === 'function') { callback = lenOrCb; lenOrCb = 0; }
50
- Promise.resolve()
51
- .then(() => ftruncateSync(fd, lenOrCb))
52
- .then(() => callback(null), callback);
53
- }
54
-
55
- export async function ftruncateAsync(fd: number, len = 0): Promise<void> {
56
- ftruncateSync(fd, len);
57
- }
58
-
59
- // ─── fdatasync / fsync ────────────────────────────────────────────────────────
60
- // Best-effort: flush the IOChannel write buffer (equivalent to fdatasync on GJS).
61
-
62
- export function fdatasyncSync(fd: number): void { getFH(fd)._flushSync(); }
63
- export function fdatasync(fd: number, callback: (err: NodeJS.ErrnoException | null) => void): void {
64
- Promise.resolve().then(() => fdatasyncSync(fd)).then(() => callback(null), callback);
65
- }
66
- export async function fdatasyncAsync(fd: number): Promise<void> { fdatasyncSync(fd); }
67
-
68
- export function fsyncSync(fd: number): void { getFH(fd)._flushSync(); }
69
- export function fsync(fd: number, callback: (err: NodeJS.ErrnoException | null) => void): void {
70
- Promise.resolve().then(() => fsyncSync(fd)).then(() => callback(null), callback);
71
- }
72
- export async function fsyncAsync(fd: number): Promise<void> { fsyncSync(fd); }
73
-
74
- // ─── fchmod / fchown / futimes ────────────────────────────────────────────────
75
-
76
- export function fchmodSync(fd: number, mode: number | string): void {
77
- chmodSync(normalizePath(getFH(fd).options.path), mode);
78
- }
79
- export function fchmod(fd: number, mode: number | string, callback: (err: NodeJS.ErrnoException | null) => void): void {
80
- Promise.resolve().then(() => fchmodSync(fd, mode)).then(() => callback(null), callback);
81
- }
82
- export async function fchmodAsync(fd: number, mode: number | string): Promise<void> { fchmodSync(fd, mode); }
83
-
84
- export function fchownSync(fd: number, uid: number, gid: number): void {
85
- chownSync(normalizePath(getFH(fd).options.path), uid, gid);
86
- }
87
- export function fchown(fd: number, uid: number, gid: number, callback: (err: NodeJS.ErrnoException | null) => void): void {
88
- Promise.resolve().then(() => fchownSync(fd, uid, gid)).then(() => callback(null), callback);
89
- }
90
- export async function fchownAsync(fd: number, uid: number, gid: number): Promise<void> { fchownSync(fd, uid, gid); }
91
-
92
- export function futimesSync(fd: number, atime: TimeLike, mtime: TimeLike): void {
93
- utimesSync(normalizePath(getFH(fd).options.path), atime, mtime);
94
- }
95
- export function futimes(fd: number, atime: TimeLike, mtime: TimeLike, callback: (err: NodeJS.ErrnoException | null) => void): void {
96
- Promise.resolve().then(() => futimesSync(fd, atime, mtime)).then(() => callback(null), callback);
97
- }
98
- export async function futimesAsync(fd: number, atime: TimeLike, mtime: TimeLike): Promise<void> { futimesSync(fd, atime, mtime); }
99
-
100
- // ─── closeSync ────────────────────────────────────────────────────────────────
101
-
102
- export function closeSync(fd: number): void {
103
- getFH(fd)._closeSync();
104
- }
105
-
106
- // ─── readSync ─────────────────────────────────────────────────────────────────
107
-
108
- export function readSync(
109
- fd: number,
110
- buffer: NodeJS.ArrayBufferView,
111
- offset?: number | null,
112
- length?: number | null,
113
- position?: number | null,
114
- ): number;
115
- export function readSync(
116
- fd: number,
117
- buffer: NodeJS.ArrayBufferView,
118
- options: { offset?: number; length?: number; position?: number | null },
119
- ): number;
120
- export function readSync(
121
- fd: number,
122
- buffer: NodeJS.ArrayBufferView,
123
- offsetOrOptions?: number | null | { offset?: number; length?: number; position?: number | null },
124
- length?: number | null,
125
- position?: number | null,
126
- ): number {
127
- let offset = 0;
128
- if (offsetOrOptions !== null && typeof offsetOrOptions === 'object') {
129
- offset = (offsetOrOptions as any).offset ?? 0;
130
- length = (offsetOrOptions as any).length ?? buffer.byteLength;
131
- position = (offsetOrOptions as any).position ?? null;
132
- } else {
133
- offset = (offsetOrOptions as number | null | undefined) ?? 0;
134
- length = length ?? buffer.byteLength - offset;
135
- }
136
- return getFH(fd)._readSync(buffer, offset, length!, position ?? null);
137
- }
138
-
139
- // ─── writeSync ────────────────────────────────────────────────────────────────
140
-
141
- export function writeSync(
142
- fd: number,
143
- buffer: NodeJS.ArrayBufferView,
144
- offset?: number | null,
145
- length?: number | null,
146
- position?: number | null,
147
- ): number;
148
- export function writeSync(
149
- fd: number,
150
- string: string,
151
- position?: number | null,
152
- encoding?: BufferEncoding | null,
153
- ): number;
154
- export function writeSync(
155
- fd: number,
156
- bufferOrString: NodeJS.ArrayBufferView | string,
157
- offsetOrPosition?: number | null,
158
- lengthOrEncoding?: number | string | null,
159
- position?: number | null,
160
- ): number {
161
- let data: Uint8Array;
162
- if (typeof bufferOrString === 'string') {
163
- data = new TextEncoder().encode(bufferOrString);
164
- if (typeof offsetOrPosition === 'number') position = offsetOrPosition;
165
- } else {
166
- const offset = (typeof offsetOrPosition === 'number' ? offsetOrPosition : 0);
167
- const len = (typeof lengthOrEncoding === 'number' ? lengthOrEncoding : bufferOrString.byteLength - offset);
168
- data = new Uint8Array((bufferOrString as any).buffer, (bufferOrString as any).byteOffset + offset, len);
169
- }
170
- return getFH(fd)._writeSync(data, position ?? null);
171
- }
172
-
173
- // ─── readvSync / readv ────────────────────────────────────────────────────────
174
-
175
- export function readvSync(fd: number, buffers: NodeJS.ArrayBufferView[], position?: number | null): number {
176
- let bytesRead = 0;
177
- for (const buf of buffers) {
178
- const n = readSync(fd, buf, 0, buf.byteLength, position != null ? position + bytesRead : null);
179
- bytesRead += n;
180
- if (n < buf.byteLength) break;
181
- }
182
- return bytesRead;
183
- }
184
-
185
- export function readv(
186
- fd: number,
187
- buffers: NodeJS.ArrayBufferView[],
188
- callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void,
189
- ): void;
190
- export function readv(
191
- fd: number,
192
- buffers: NodeJS.ArrayBufferView[],
193
- position: number | null,
194
- callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void,
195
- ): void;
196
- export function readv(fd: number, buffers: NodeJS.ArrayBufferView[], positionOrCb: any, callback?: any): void {
197
- if (typeof positionOrCb === 'function') { callback = positionOrCb; positionOrCb = null; }
198
- Promise.resolve()
199
- .then(() => ({ bytesRead: readvSync(fd, buffers, positionOrCb), buffers }))
200
- .then(r => callback(null, r.bytesRead, r.buffers), callback);
201
- }
202
-
203
- export async function readvAsync(fd: number, buffers: NodeJS.ArrayBufferView[], position?: number | null) {
204
- return { bytesRead: readvSync(fd, buffers, position), buffers };
205
- }
206
-
207
- // ─── writevSync / writev ──────────────────────────────────────────────────────
208
-
209
- export function writevSync(fd: number, buffers: NodeJS.ArrayBufferView[], position?: number | null): number {
210
- let bytesWritten = 0;
211
- for (const buf of buffers) {
212
- const n = writeSync(fd, buf, 0, buf.byteLength, position != null ? position + bytesWritten : null);
213
- bytesWritten += n;
214
- }
215
- return bytesWritten;
216
- }
217
-
218
- export function writev(
219
- fd: number,
220
- buffers: NodeJS.ArrayBufferView[],
221
- callback: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void,
222
- ): void;
223
- export function writev(
224
- fd: number,
225
- buffers: NodeJS.ArrayBufferView[],
226
- position: number | null,
227
- callback: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void,
228
- ): void;
229
- export function writev(fd: number, buffers: NodeJS.ArrayBufferView[], positionOrCb: any, callback?: any): void {
230
- if (typeof positionOrCb === 'function') { callback = positionOrCb; positionOrCb = null; }
231
- Promise.resolve()
232
- .then(() => ({ bytesWritten: writevSync(fd, buffers, positionOrCb), buffers }))
233
- .then(r => callback(null, r.bytesWritten, r.buffers), callback);
234
- }
235
-
236
- export async function writevAsync(fd: number, buffers: NodeJS.ArrayBufferView[], position?: number | null) {
237
- return { bytesWritten: writevSync(fd, buffers, position), buffers };
238
- }
239
-
240
- // ─── exists (deprecated) ──────────────────────────────────────────────────────
241
-
242
- export function exists(path: PathLike, callback: (exists: boolean) => void): void {
243
- try { statSync(normalizePath(path)); callback(true); } catch { callback(false); }
244
- }
245
-
246
- // ─── openAsBlob ───────────────────────────────────────────────────────────────
247
-
248
- export async function openAsBlob(path: PathLike, options?: { type?: string }): Promise<Blob> {
249
- const data = readFileSync(normalizePath(path)) as unknown as ArrayBuffer;
250
- return new Blob([data], { type: options?.type ?? '' });
251
- }
@@ -1,115 +0,0 @@
1
- // Ported from refs/node-test/parallel/test-fs-promises-file-handle-*.js
2
- // Original: MIT license, Node.js contributors
3
- import { describe, it, expect } from '@gjsify/unit';
4
- import { promises, mkdtempSync, rmdirSync } from 'node:fs';
5
- import { join } from 'node:path';
6
- import { tmpdir } from 'node:os';
7
- import { Buffer } from 'node:buffer';
8
-
9
- export default async () => {
10
- await describe('FileHandle', async () => {
11
- await it('should open a file for writing and return correct bytesWritten', async () => {
12
- const dir = mkdtempSync(join(tmpdir(), 'fs-fh-'));
13
- const path = join(dir, 'write.txt');
14
- const fh = await promises.open(path, 'w+', 0o666);
15
- const buf = Buffer.from('Hello World', 'utf8');
16
- const res = await fh.write(buf, 0, buf.length, 0);
17
- expect(res.bytesWritten).toBe(buf.length);
18
- expect(res.buffer).toBe(buf);
19
- await fh.close();
20
- await promises.rm(path);
21
- rmdirSync(dir);
22
- });
23
-
24
- await it('should read back written content via read()', async () => {
25
- const dir = mkdtempSync(join(tmpdir(), 'fs-fh-read-'));
26
- const path = join(dir, 'rw.txt');
27
- const fh = await promises.open(path, 'w+');
28
- const written = Buffer.from('Read back test');
29
- await fh.write(written, 0, written.length, 0);
30
-
31
- const readBuf = Buffer.alloc(written.length);
32
- const { bytesRead } = await fh.read(readBuf, 0, written.length, 0);
33
- expect(bytesRead).toBe(written.length);
34
- expect(readBuf.toString()).toBe('Read back test');
35
-
36
- await fh.close();
37
- await promises.rm(path);
38
- rmdirSync(dir);
39
- });
40
-
41
- await it('should read entire file via readFile()', async () => {
42
- const dir = mkdtempSync(join(tmpdir(), 'fs-fh-rf-'));
43
- const path = join(dir, 'rf.txt');
44
- await promises.writeFile(path, 'FileHandle readFile content');
45
- const fh = await promises.open(path, 'r');
46
- const content = await fh.readFile({ encoding: 'utf8' });
47
- expect(content).toBe('FileHandle readFile content');
48
- await fh.close();
49
- await promises.rm(path);
50
- rmdirSync(dir);
51
- });
52
-
53
- await it('should stat the opened file', async () => {
54
- const dir = mkdtempSync(join(tmpdir(), 'fs-fh-stat-'));
55
- const path = join(dir, 'stat.txt');
56
- await promises.writeFile(path, 'stat content');
57
- const fh = await promises.open(path, 'r');
58
- const s = await fh.stat();
59
- expect(s.isFile()).toBe(true);
60
- expect(s.size).toBeGreaterThan(0);
61
- await fh.close();
62
- await promises.rm(path);
63
- rmdirSync(dir);
64
- });
65
-
66
- await it('should truncate the file via truncate()', async () => {
67
- const dir = mkdtempSync(join(tmpdir(), 'fs-fh-trunc-'));
68
- const path = join(dir, 'trunc.txt');
69
- await promises.writeFile(path, 'Hello World Truncate');
70
- const fh = await promises.open(path, 'r+');
71
- await fh.truncate(5);
72
- await fh.close();
73
- const content = await promises.readFile(path, { encoding: 'utf8' });
74
- expect(content).toBe('Hello');
75
- await promises.rm(path);
76
- rmdirSync(dir);
77
- });
78
-
79
- await it('should append content via appendFile()', async () => {
80
- const dir = mkdtempSync(join(tmpdir(), 'fs-fh-app-'));
81
- const path = join(dir, 'append.txt');
82
- await promises.writeFile(path, 'start');
83
- const fh = await promises.open(path, 'a');
84
- await fh.appendFile(' appended');
85
- await fh.close();
86
- const content = await promises.readFile(path, { encoding: 'utf8' });
87
- expect(content).toBe('start appended');
88
- await promises.rm(path);
89
- rmdirSync(dir);
90
- });
91
-
92
- await it('should throw when opening a non-existent file for reading', async () => {
93
- let threw = false;
94
- try {
95
- await promises.open('/nonexistent/path/abc123.txt', 'r');
96
- } catch (e: unknown) {
97
- threw = true;
98
- expect((e as NodeJS.ErrnoException).code).toBe('ENOENT');
99
- }
100
- expect(threw).toBe(true);
101
- });
102
-
103
- await it('should writeFile via FileHandle', async () => {
104
- const dir = mkdtempSync(join(tmpdir(), 'fs-fh-wf-'));
105
- const path = join(dir, 'wf.txt');
106
- const fh = await promises.open(path, 'w');
107
- await fh.writeFile('written via FileHandle.writeFile');
108
- await fh.close();
109
- const content = await promises.readFile(path, { encoding: 'utf8' });
110
- expect(content).toBe('written via FileHandle.writeFile');
111
- await promises.rm(path);
112
- rmdirSync(dir);
113
- });
114
- });
115
- };