source: node_modules/fs-extra/lib/fs/index.js

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 3.4 KB
Line 
1'use strict'
2// This is adapted from https://github.com/normalize/mz
3// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
4const u = require('universalify').fromCallback
5const fs = require('graceful-fs')
6
7const api = [
8 'access',
9 'appendFile',
10 'chmod',
11 'chown',
12 'close',
13 'copyFile',
14 'fchmod',
15 'fchown',
16 'fdatasync',
17 'fstat',
18 'fsync',
19 'ftruncate',
20 'futimes',
21 'lchmod',
22 'lchown',
23 'link',
24 'lstat',
25 'mkdir',
26 'mkdtemp',
27 'open',
28 'opendir',
29 'readdir',
30 'readFile',
31 'readlink',
32 'realpath',
33 'rename',
34 'rm',
35 'rmdir',
36 'stat',
37 'symlink',
38 'truncate',
39 'unlink',
40 'utimes',
41 'writeFile'
42].filter(key => {
43 // Some commands are not available on some systems. Ex:
44 // fs.opendir was added in Node.js v12.12.0
45 // fs.rm was added in Node.js v14.14.0
46 // fs.lchown is not available on at least some Linux
47 return typeof fs[key] === 'function'
48})
49
50// Export all keys:
51Object.keys(fs).forEach(key => {
52 if (key === 'promises') {
53 // fs.promises is a getter property that triggers ExperimentalWarning
54 // Don't re-export it here, the getter is defined in "lib/index.js"
55 return
56 }
57 exports[key] = fs[key]
58})
59
60// Universalify async methods:
61api.forEach(method => {
62 exports[method] = u(fs[method])
63})
64
65// We differ from mz/fs in that we still ship the old, broken, fs.exists()
66// since we are a drop-in replacement for the native module
67exports.exists = function (filename, callback) {
68 if (typeof callback === 'function') {
69 return fs.exists(filename, callback)
70 }
71 return new Promise(resolve => {
72 return fs.exists(filename, resolve)
73 })
74}
75
76// fs.read(), fs.write(), & fs.writev() need special treatment due to multiple callback args
77
78exports.read = function (fd, buffer, offset, length, position, callback) {
79 if (typeof callback === 'function') {
80 return fs.read(fd, buffer, offset, length, position, callback)
81 }
82 return new Promise((resolve, reject) => {
83 fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
84 if (err) return reject(err)
85 resolve({ bytesRead, buffer })
86 })
87 })
88}
89
90// Function signature can be
91// fs.write(fd, buffer[, offset[, length[, position]]], callback)
92// OR
93// fs.write(fd, string[, position[, encoding]], callback)
94// We need to handle both cases, so we use ...args
95exports.write = function (fd, buffer, ...args) {
96 if (typeof args[args.length - 1] === 'function') {
97 return fs.write(fd, buffer, ...args)
98 }
99
100 return new Promise((resolve, reject) => {
101 fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
102 if (err) return reject(err)
103 resolve({ bytesWritten, buffer })
104 })
105 })
106}
107
108// fs.writev only available in Node v12.9.0+
109if (typeof fs.writev === 'function') {
110 // Function signature is
111 // s.writev(fd, buffers[, position], callback)
112 // We need to handle the optional arg, so we use ...args
113 exports.writev = function (fd, buffers, ...args) {
114 if (typeof args[args.length - 1] === 'function') {
115 return fs.writev(fd, buffers, ...args)
116 }
117
118 return new Promise((resolve, reject) => {
119 fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
120 if (err) return reject(err)
121 resolve({ bytesWritten, buffers })
122 })
123 })
124 }
125}
126
127// fs.realpath.native only available in Node v9.2+
128if (typeof fs.realpath.native === 'function') {
129 exports.realpath.native = u(fs.realpath.native)
130}
Note: See TracBrowser for help on using the repository browser.