@appium/support 2.61.0 → 3.0.0
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.
- package/build/lib/console.d.ts +1 -1
- package/build/lib/console.js +169 -105
- package/build/lib/console.js.map +1 -1
- package/build/lib/env.js +142 -117
- package/build/lib/env.js.map +1 -1
- package/build/lib/fs.d.ts +9 -2
- package/build/lib/fs.d.ts.map +1 -1
- package/build/lib/fs.js +358 -246
- package/build/lib/fs.js.map +1 -1
- package/build/lib/image-util.js +139 -124
- package/build/lib/image-util.js.map +1 -1
- package/build/lib/index.js +64 -103
- package/build/lib/index.js.map +1 -1
- package/build/lib/log-internal.d.ts +4 -27
- package/build/lib/log-internal.d.ts.map +1 -1
- package/build/lib/log-internal.js +141 -123
- package/build/lib/log-internal.js.map +1 -1
- package/build/lib/logger.d.ts +1 -1
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +5 -14
- package/build/lib/logger.js.map +1 -1
- package/build/lib/logging.d.ts +3 -4
- package/build/lib/logging.d.ts.map +1 -1
- package/build/lib/logging.js +139 -110
- package/build/lib/logging.js.map +1 -1
- package/build/lib/mjpeg.js +169 -141
- package/build/lib/mjpeg.js.map +1 -1
- package/build/lib/mkdirp.js +7 -13
- package/build/lib/mkdirp.js.map +1 -1
- package/build/lib/net.d.ts.map +1 -1
- package/build/lib/net.js +278 -254
- package/build/lib/net.js.map +1 -1
- package/build/lib/node.js +203 -192
- package/build/lib/node.js.map +1 -1
- package/build/lib/npm.d.ts +19 -4
- package/build/lib/npm.d.ts.map +1 -1
- package/build/lib/npm.js +277 -228
- package/build/lib/npm.js.map +1 -1
- package/build/lib/plist.js +145 -136
- package/build/lib/plist.js.map +1 -1
- package/build/lib/process.js +41 -42
- package/build/lib/process.js.map +1 -1
- package/build/lib/system.js +39 -56
- package/build/lib/system.js.map +1 -1
- package/build/lib/tempdir.js +112 -73
- package/build/lib/tempdir.js.map +1 -1
- package/build/lib/timing.js +99 -84
- package/build/lib/timing.js.map +1 -1
- package/build/lib/util.js +454 -356
- package/build/lib/util.js.map +1 -1
- package/build/lib/zip.js +469 -423
- package/build/lib/zip.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/fs.js +15 -1
- package/lib/log-internal.js +12 -16
- package/lib/logging.js +2 -3
- package/lib/net.js +15 -6
- package/lib/npm.js +28 -18
- package/package.json +20 -19
package/build/lib/fs.js
CHANGED
|
@@ -1,254 +1,366 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
var _readPkg = _interopRequireDefault(require("read-pkg"));
|
|
31
|
-
|
|
32
|
-
var _rimraf = _interopRequireDefault(require("rimraf"));
|
|
33
|
-
|
|
34
|
-
var _sanitizeFilename = _interopRequireDefault(require("sanitize-filename"));
|
|
35
|
-
|
|
36
|
-
var _which = _interopRequireDefault(require("which"));
|
|
37
|
-
|
|
38
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
39
|
-
|
|
40
|
-
var _timing = _interopRequireDefault(require("./timing"));
|
|
41
|
-
|
|
42
|
-
var _system = require("./system");
|
|
43
|
-
|
|
44
|
-
var _util = require("./util");
|
|
45
|
-
|
|
46
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
47
|
-
|
|
48
|
-
const ncpAsync = _bluebird.default.promisify(_ncp.default);
|
|
49
|
-
|
|
50
|
-
const findRootCached = _lodash.default.memoize(_pkgDir.default.sync);
|
|
51
|
-
|
|
2
|
+
// @ts-check
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.fs = void 0;
|
|
8
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
9
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const glob_1 = __importDefault(require("glob"));
|
|
12
|
+
const klaw_1 = __importDefault(require("klaw"));
|
|
13
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
14
|
+
const mv_1 = __importDefault(require("mv"));
|
|
15
|
+
const ncp_1 = __importDefault(require("ncp"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const pkg_dir_1 = __importDefault(require("pkg-dir"));
|
|
18
|
+
const read_pkg_1 = __importDefault(require("read-pkg"));
|
|
19
|
+
const rimraf_1 = __importDefault(require("rimraf"));
|
|
20
|
+
const sanitize_filename_1 = __importDefault(require("sanitize-filename"));
|
|
21
|
+
const which_1 = __importDefault(require("which"));
|
|
22
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
23
|
+
const timing_1 = __importDefault(require("./timing"));
|
|
24
|
+
const system_1 = require("./system");
|
|
25
|
+
const util_1 = require("./util");
|
|
26
|
+
const ncpAsync =
|
|
27
|
+
/** @type {(source: string, dest: string, opts: ncp.Options|undefined) => B<void>} */ (bluebird_1.default.promisify(ncp_1.default));
|
|
28
|
+
const findRootCached = lodash_1.default.memoize(pkg_dir_1.default.sync);
|
|
52
29
|
const fs = {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Resolves `true` if `path` is _readable_, which differs from Node.js' default behavior of "can we see it?"
|
|
32
|
+
*
|
|
33
|
+
* On Windows, ACLs are not supported, so this becomes a simple check for existence.
|
|
34
|
+
*
|
|
35
|
+
* This function will never reject.
|
|
36
|
+
* @param {PathLike} path
|
|
37
|
+
* @returns {Promise<boolean>}
|
|
38
|
+
*/
|
|
39
|
+
async hasAccess(path) {
|
|
40
|
+
try {
|
|
41
|
+
await fs_1.promises.access(path, fs_1.constants.R_OK);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* Resolves `true` if `path` is executable; `false` otherwise.
|
|
50
|
+
*
|
|
51
|
+
* On Windows, this function delegates to {@linkcode fs.hasAccess}.
|
|
52
|
+
*
|
|
53
|
+
* This function will never reject.
|
|
54
|
+
* @param {PathLike} path
|
|
55
|
+
* @returns {Promise<boolean>}
|
|
56
|
+
*/
|
|
57
|
+
async isExecutable(path) {
|
|
58
|
+
try {
|
|
59
|
+
if ((0, system_1.isWindows)()) {
|
|
60
|
+
return await fs.hasAccess(path);
|
|
61
|
+
}
|
|
62
|
+
await fs_1.promises.access(path, fs_1.constants.R_OK | fs_1.constants.X_OK);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
},
|
|
69
|
+
/**
|
|
70
|
+
* Alias for {@linkcode fs.hasAccess}
|
|
71
|
+
* @param {PathLike} path
|
|
72
|
+
*/
|
|
73
|
+
async exists(path) {
|
|
66
74
|
return await fs.hasAccess(path);
|
|
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
|
-
which: _which.default,
|
|
108
|
-
glob: _bluebird.default.promisify(_glob.default),
|
|
109
|
-
sanitizeName: _sanitizeFilename.default,
|
|
110
|
-
|
|
111
|
-
async hash(filePath, algorithm = 'sha1') {
|
|
112
|
-
return await new _bluebird.default((resolve, reject) => {
|
|
113
|
-
const fileHash = _crypto.default.createHash(algorithm);
|
|
114
|
-
|
|
115
|
-
const readStream = (0, _fs.createReadStream)(filePath);
|
|
116
|
-
readStream.on('error', e => reject(new Error(`Cannot calculate ${algorithm} hash for '${filePath}'. Original error: ${e.message}`)));
|
|
117
|
-
readStream.on('data', chunk => fileHash.update(chunk));
|
|
118
|
-
readStream.on('end', () => resolve(fileHash.digest('hex')));
|
|
119
|
-
});
|
|
120
|
-
},
|
|
121
|
-
|
|
122
|
-
walk(dir, opts) {
|
|
123
|
-
return (0, _klaw.default)(dir, opts);
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
async mkdirp(dir) {
|
|
127
|
-
return await fs.mkdir(dir, {
|
|
128
|
-
recursive: true
|
|
129
|
-
});
|
|
130
|
-
},
|
|
131
|
-
|
|
132
|
-
async walkDir(dir, recursive, callback) {
|
|
133
|
-
let isValidRoot = false;
|
|
134
|
-
let errMsg = null;
|
|
135
|
-
|
|
136
|
-
try {
|
|
137
|
-
isValidRoot = (await fs.stat(dir)).isDirectory();
|
|
138
|
-
} catch (e) {
|
|
139
|
-
errMsg = e.message;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (!isValidRoot) {
|
|
143
|
-
throw Error(`'${dir}' is not a valid root directory` + (errMsg ? `. Original error: ${errMsg}` : ''));
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
let walker;
|
|
147
|
-
let fileCount = 0;
|
|
148
|
-
let directoryCount = 0;
|
|
149
|
-
const timer = new _timing.default().start();
|
|
150
|
-
return await new _bluebird.default(function (resolve, reject) {
|
|
151
|
-
let lastFileProcessed = _bluebird.default.resolve();
|
|
152
|
-
|
|
153
|
-
walker = (0, _klaw.default)(dir, {
|
|
154
|
-
depthLimit: recursive ? -1 : 0
|
|
155
|
-
});
|
|
156
|
-
walker.on('data', function (item) {
|
|
157
|
-
walker.pause();
|
|
158
|
-
|
|
159
|
-
if (!item.stats.isDirectory()) {
|
|
160
|
-
fileCount++;
|
|
161
|
-
} else {
|
|
162
|
-
directoryCount++;
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* Remove a directory and all its contents, recursively
|
|
78
|
+
* @todo Replace with `rm()` from `fs.promises` when Node.js v12 support is dropped.
|
|
79
|
+
*/
|
|
80
|
+
rimraf: /** @type {(dirpath: string, opts?: import('rimraf').Options) => Promise<void>} */ (bluebird_1.default.promisify(rimraf_1.default)),
|
|
81
|
+
/**
|
|
82
|
+
* Alias of {@linkcode rimrafIdx.sync}
|
|
83
|
+
* @todo Replace with `rmSync()` from `fs` when Node.js v12 support is dropped.
|
|
84
|
+
*/
|
|
85
|
+
rimrafSync: rimraf_1.default.sync,
|
|
86
|
+
/**
|
|
87
|
+
* Like Node.js' `fsPromises.mkdir()`, but will _not_ reject if the directory already exists.
|
|
88
|
+
*
|
|
89
|
+
* @param {string|Buffer|URL} filepath
|
|
90
|
+
* @param {import('fs').MakeDirectoryOptions} [opts]
|
|
91
|
+
* @returns {Promise<string|undefined>}
|
|
92
|
+
* @see https://nodejs.org/api/fs.html#fspromisesmkdirpath-options
|
|
93
|
+
*/
|
|
94
|
+
async mkdir(filepath, opts = {}) {
|
|
95
|
+
try {
|
|
96
|
+
return await fs_1.promises.mkdir(filepath, opts);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
if (err?.code !== 'EEXIST') {
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
/**
|
|
105
|
+
* Copies files _and entire directories_
|
|
106
|
+
* @param {string} source - Source to copy
|
|
107
|
+
* @param {string} destination - Destination to copy to
|
|
108
|
+
* @param {ncp.Options} [opts] - Additional arguments to pass to `ncp`
|
|
109
|
+
* @see https://npm.im/ncp
|
|
110
|
+
* @returns {Promise<void>}
|
|
111
|
+
*/
|
|
112
|
+
async copyFile(source, destination, opts = {}) {
|
|
113
|
+
if (!(await fs.hasAccess(source))) {
|
|
114
|
+
throw new Error(`The file at '${source}' does not exist or is not accessible`);
|
|
163
115
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
116
|
+
return await ncpAsync(source, destination, opts);
|
|
117
|
+
},
|
|
118
|
+
/**
|
|
119
|
+
* Create an MD5 hash of a file.
|
|
120
|
+
* @param {PathLike} filePath
|
|
121
|
+
* @returns {Promise<string>}
|
|
122
|
+
*/
|
|
123
|
+
async md5(filePath) {
|
|
124
|
+
return await fs.hash(filePath, 'md5');
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* Move a file
|
|
128
|
+
*/
|
|
129
|
+
mv: /** @type {(from: string, to: string, opts?: mv.Options) => B<void>} */ (bluebird_1.default.promisify(mv_1.default)),
|
|
130
|
+
/**
|
|
131
|
+
* Find path to an executable in system `PATH`
|
|
132
|
+
* @see https://github.com/npm/node-which
|
|
133
|
+
*/
|
|
134
|
+
which: which_1.default,
|
|
135
|
+
/**
|
|
136
|
+
* Given a glob pattern, resolve with list of files matching that pattern
|
|
137
|
+
* @see https://github.com/isaacs/node-glob
|
|
138
|
+
*/
|
|
139
|
+
glob: /** @type {(pattern: string, opts?: glob.IOptions) => B<string[]>} */ (bluebird_1.default.promisify(glob_1.default)),
|
|
140
|
+
/**
|
|
141
|
+
* Sanitize a filename
|
|
142
|
+
* @see https://github.com/parshap/node-sanitize-filename
|
|
143
|
+
*/
|
|
144
|
+
sanitizeName: sanitize_filename_1.default,
|
|
145
|
+
/**
|
|
146
|
+
* Create a hex digest of some file at `filePath`
|
|
147
|
+
* @param {PathLike} filePath
|
|
148
|
+
* @param {string} [algorithm]
|
|
149
|
+
* @returns {Promise<string>}
|
|
150
|
+
*/
|
|
151
|
+
async hash(filePath, algorithm = 'sha1') {
|
|
152
|
+
return await new bluebird_1.default((resolve, reject) => {
|
|
153
|
+
const fileHash = crypto_1.default.createHash(algorithm);
|
|
154
|
+
const readStream = (0, fs_1.createReadStream)(filePath);
|
|
155
|
+
readStream.on('error', (e) => reject(new Error(`Cannot calculate ${algorithm} hash for '${filePath}'. Original error: ${e.message}`)));
|
|
156
|
+
readStream.on('data', (chunk) => fileHash.update(chunk));
|
|
157
|
+
readStream.on('end', () => resolve(fileHash.digest('hex')));
|
|
158
|
+
});
|
|
159
|
+
},
|
|
160
|
+
/**
|
|
161
|
+
* Returns an `Walker` instance, which is a readable stream (and thusly an async iterator).
|
|
162
|
+
*
|
|
163
|
+
* @param {string} dir - Dir to start walking at
|
|
164
|
+
* @param {import('klaw').Options} [opts]
|
|
165
|
+
* @returns {import('klaw').Walker}
|
|
166
|
+
* @see https://www.npmjs.com/package/klaw
|
|
167
|
+
*/
|
|
168
|
+
walk(dir, opts) {
|
|
169
|
+
return (0, klaw_1.default)(dir, opts);
|
|
170
|
+
},
|
|
171
|
+
/**
|
|
172
|
+
* Recursively create a directory.
|
|
173
|
+
* @param {PathLike} dir
|
|
174
|
+
* @returns {Promise<string|undefined>}
|
|
175
|
+
*/
|
|
176
|
+
async mkdirp(dir) {
|
|
177
|
+
return await fs.mkdir(dir, { recursive: true });
|
|
178
|
+
},
|
|
179
|
+
/**
|
|
180
|
+
* Walks a directory given according to the parameters given. The callback will be invoked with a path joined with the dir parameter
|
|
181
|
+
* @param {string} dir Directory path where we will start walking
|
|
182
|
+
* @param {boolean} recursive Set it to true if you want to continue walking sub directories
|
|
183
|
+
* @param {WalkDirCallback} callback The callback to be called when a new path is found
|
|
184
|
+
* @throws {Error} If the `dir` parameter contains a path to an invalid folder
|
|
185
|
+
* @returns {Promise<string?>} returns the found path or null if the item was not found
|
|
186
|
+
*/
|
|
187
|
+
async walkDir(dir, recursive, callback) {
|
|
188
|
+
//eslint-disable-line promise/prefer-await-to-callbacks
|
|
189
|
+
let isValidRoot = false;
|
|
190
|
+
let errMsg = null;
|
|
191
|
+
try {
|
|
192
|
+
isValidRoot = (await fs.stat(dir)).isDirectory();
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
errMsg = e.message;
|
|
179
196
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
197
|
+
if (!isValidRoot) {
|
|
198
|
+
throw Error(`'${dir}' is not a valid root directory` + (errMsg ? `. Original error: ${errMsg}` : ''));
|
|
199
|
+
}
|
|
200
|
+
let walker;
|
|
201
|
+
let fileCount = 0;
|
|
202
|
+
let directoryCount = 0;
|
|
203
|
+
const timer = new timing_1.default().start();
|
|
204
|
+
return await new bluebird_1.default(function (resolve, reject) {
|
|
205
|
+
let lastFileProcessed = bluebird_1.default.resolve();
|
|
206
|
+
walker = (0, klaw_1.default)(dir, {
|
|
207
|
+
depthLimit: recursive ? -1 : 0,
|
|
208
|
+
});
|
|
209
|
+
walker
|
|
210
|
+
.on('data', function (item) {
|
|
211
|
+
walker.pause();
|
|
212
|
+
if (!item.stats.isDirectory()) {
|
|
213
|
+
fileCount++;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
directoryCount++;
|
|
217
|
+
}
|
|
218
|
+
// eslint-disable-next-line promise/prefer-await-to-callbacks
|
|
219
|
+
lastFileProcessed = bluebird_1.default.try(async () => await callback(item.path, item.stats.isDirectory()))
|
|
220
|
+
.then(function (done = false) {
|
|
221
|
+
if (done) {
|
|
222
|
+
resolve(item.path);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
walker.resume();
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
.catch(reject);
|
|
229
|
+
})
|
|
230
|
+
.on('error', function (err, item) {
|
|
231
|
+
logger_1.default.warn(`Got an error while walking '${item.path}': ${err.message}`);
|
|
232
|
+
// klaw cannot get back from an ENOENT error
|
|
233
|
+
if (err.code === 'ENOENT') {
|
|
234
|
+
logger_1.default.warn('All files may not have been accessed');
|
|
235
|
+
reject(err);
|
|
236
|
+
}
|
|
237
|
+
})
|
|
238
|
+
.on('end', function () {
|
|
239
|
+
lastFileProcessed
|
|
240
|
+
.then((file) => {
|
|
241
|
+
resolve(/** @type {string|undefined} */ (file) ?? null);
|
|
242
|
+
})
|
|
243
|
+
.catch(function (err) {
|
|
244
|
+
logger_1.default.warn(`Unexpected error: ${err.message}`);
|
|
245
|
+
reject(err);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
}).finally(function () {
|
|
249
|
+
logger_1.default.debug(`Traversed ${(0, util_1.pluralize)('directory', directoryCount, true)} ` +
|
|
250
|
+
`and ${(0, util_1.pluralize)('file', fileCount, true)} ` +
|
|
251
|
+
`in ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
252
|
+
if (walker) {
|
|
253
|
+
walker.destroy();
|
|
254
|
+
}
|
|
187
255
|
});
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
256
|
+
},
|
|
257
|
+
/**
|
|
258
|
+
* Reads the closest `package.json` file from absolute path `dir`.
|
|
259
|
+
* @param {string} dir - Directory to search from
|
|
260
|
+
* @param {import('read-pkg').Options} [opts] - Additional options for `read-pkg`
|
|
261
|
+
* @throws {Error} If there were problems finding or reading a `package.json` file
|
|
262
|
+
* @returns {object} A parsed `package.json`
|
|
263
|
+
*/
|
|
264
|
+
readPackageJsonFrom(dir, opts = {}) {
|
|
265
|
+
const cwd = fs.findRoot(dir);
|
|
266
|
+
try {
|
|
267
|
+
return read_pkg_1.default.sync({ ...opts, cwd });
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
err.message = `Failed to read a \`package.json\` from dir \`${dir}\`:\n\n${err.message}`;
|
|
271
|
+
throw err;
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
/**
|
|
275
|
+
* Finds the project root directory from `dir`.
|
|
276
|
+
* @param {string} dir - Directory to search from
|
|
277
|
+
* @throws {TypeError} If `dir` is not a nonempty string or relative path
|
|
278
|
+
* @throws {Error} If there were problems finding the project root
|
|
279
|
+
* @returns {string} The closeset parent dir containing `package.json`
|
|
280
|
+
*/
|
|
281
|
+
findRoot(dir) {
|
|
282
|
+
if (!dir || !path_1.default.isAbsolute(dir)) {
|
|
283
|
+
throw new TypeError('`findRoot()` must be provided a non-empty, absolute path');
|
|
284
|
+
}
|
|
285
|
+
const result = findRootCached(dir);
|
|
286
|
+
if (!result) {
|
|
287
|
+
throw new Error(`\`findRoot()\` could not find \`package.json\` from ${dir}`);
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
},
|
|
291
|
+
// add the supported `fs` functions
|
|
292
|
+
access: fs_1.promises.access,
|
|
293
|
+
appendFile: fs_1.promises.appendFile,
|
|
294
|
+
chmod: fs_1.promises.chmod,
|
|
295
|
+
close: bluebird_1.default.promisify(fs_1.close),
|
|
296
|
+
constants: fs_1.constants,
|
|
297
|
+
createWriteStream: fs_1.createWriteStream,
|
|
298
|
+
createReadStream: fs_1.createReadStream,
|
|
299
|
+
lstat: fs_1.promises.lstat,
|
|
300
|
+
/**
|
|
301
|
+
* Warning: this is a promisified {@linkcode open fs.open}.
|
|
302
|
+
* It resolves w/a file descriptor instead of a {@linkcode fsPromises.FileHandle FileHandle} object, as {@linkcode fsPromises.open} does. Use {@linkcode fs.openFile} if you want a `FileHandle`.
|
|
303
|
+
* @type {(path: PathLike, flags: import('fs').OpenMode, mode?: import('fs').Mode) => Promise<number>}
|
|
304
|
+
*/
|
|
305
|
+
open: bluebird_1.default.promisify(fs_1.open),
|
|
306
|
+
openFile: fs_1.promises.open,
|
|
307
|
+
readdir: fs_1.promises.readdir,
|
|
308
|
+
read: /**
|
|
309
|
+
* @type {ReadFn<NodeJS.ArrayBufferView>}
|
|
310
|
+
*/ ( /** @type {unknown} */(bluebird_1.default.promisify(fs_1.read))),
|
|
311
|
+
readFile: fs_1.promises.readFile,
|
|
312
|
+
readlink: fs_1.promises.readlink,
|
|
313
|
+
realpath: fs_1.promises.realpath,
|
|
314
|
+
rename: fs_1.promises.rename,
|
|
315
|
+
stat: fs_1.promises.stat,
|
|
316
|
+
symlink: fs_1.promises.symlink,
|
|
317
|
+
unlink: fs_1.promises.unlink,
|
|
318
|
+
write: bluebird_1.default.promisify(fs_1.write),
|
|
319
|
+
writeFile: fs_1.promises.writeFile,
|
|
320
|
+
// deprecated props
|
|
321
|
+
/**
|
|
322
|
+
* Use `constants.F_OK` instead.
|
|
323
|
+
* @deprecated
|
|
324
|
+
*/
|
|
325
|
+
F_OK: fs_1.constants.F_OK,
|
|
326
|
+
/**
|
|
327
|
+
* Use `constants.R_OK` instead.
|
|
328
|
+
* @deprecated
|
|
329
|
+
*/
|
|
330
|
+
R_OK: fs_1.constants.R_OK,
|
|
331
|
+
/**
|
|
332
|
+
* Use `constants.W_OK` instead.
|
|
333
|
+
* @deprecated
|
|
334
|
+
*/
|
|
335
|
+
W_OK: fs_1.constants.W_OK,
|
|
336
|
+
/**
|
|
337
|
+
* Use `constants.X_OK` instead.
|
|
338
|
+
* @deprecated
|
|
339
|
+
*/
|
|
340
|
+
X_OK: fs_1.constants.X_OK,
|
|
250
341
|
};
|
|
251
342
|
exports.fs = fs;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJuY3BBc3luYyIsIkIiLCJwcm9taXNpZnkiLCJuY3AiLCJmaW5kUm9vdENhY2hlZCIsIl8iLCJtZW1vaXplIiwicGtnRGlyIiwic3luYyIsImZzIiwiaGFzQWNjZXNzIiwicGF0aCIsImZzUHJvbWlzZXMiLCJhY2Nlc3MiLCJjb25zdGFudHMiLCJSX09LIiwiaXNFeGVjdXRhYmxlIiwiaXNXaW5kb3dzIiwiWF9PSyIsImV4aXN0cyIsInJpbXJhZiIsInJpbXJhZklkeCIsInJpbXJhZlN5bmMiLCJta2RpciIsImZpbGVwYXRoIiwib3B0cyIsImVyciIsImNvZGUiLCJjb3B5RmlsZSIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwiRXJyb3IiLCJtZDUiLCJmaWxlUGF0aCIsImhhc2giLCJtdiIsIndoaWNoIiwiZ2xvYiIsInNhbml0aXplTmFtZSIsInNhbml0aXplIiwiYWxnb3JpdGhtIiwicmVzb2x2ZSIsInJlamVjdCIsImZpbGVIYXNoIiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsInJlYWRTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwib24iLCJlIiwibWVzc2FnZSIsImNodW5rIiwidXBkYXRlIiwiZGlnZXN0Iiwid2FsayIsImRpciIsImtsYXciLCJta2RpcnAiLCJyZWN1cnNpdmUiLCJ3YWxrRGlyIiwiY2FsbGJhY2siLCJpc1ZhbGlkUm9vdCIsImVyck1zZyIsInN0YXQiLCJpc0RpcmVjdG9yeSIsIndhbGtlciIsImZpbGVDb3VudCIsImRpcmVjdG9yeUNvdW50IiwidGltZXIiLCJUaW1lciIsInN0YXJ0IiwibGFzdEZpbGVQcm9jZXNzZWQiLCJkZXB0aExpbWl0IiwiaXRlbSIsInBhdXNlIiwic3RhdHMiLCJ0cnkiLCJ0aGVuIiwiZG9uZSIsInJlc3VtZSIsImNhdGNoIiwibG9nIiwid2FybiIsImZpbGUiLCJmaW5hbGx5IiwiZGVidWciLCJwbHVyYWxpemUiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsImRlc3Ryb3kiLCJyZWFkUGFja2FnZUpzb25Gcm9tIiwiY3dkIiwiZmluZFJvb3QiLCJyZWFkUGtnIiwiaXNBYnNvbHV0ZSIsIlR5cGVFcnJvciIsInJlc3VsdCIsImFwcGVuZEZpbGUiLCJjaG1vZCIsImNsb3NlIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJsc3RhdCIsIm9wZW4iLCJvcGVuRmlsZSIsInJlYWRkaXIiLCJyZWFkIiwicmVhZEZpbGUiLCJyZWFkbGluayIsInJlYWxwYXRoIiwicmVuYW1lIiwic3ltbGluayIsInVubGluayIsIndyaXRlIiwid3JpdGVGaWxlIiwiRl9PSyIsIldfT0siXSwic291cmNlcyI6WyIuLi8uLi9saWIvZnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7XG4gIGNsb3NlLFxuICBjb25zdGFudHMsXG4gIGNyZWF0ZVJlYWRTdHJlYW0sXG4gIGNyZWF0ZVdyaXRlU3RyZWFtLFxuICBwcm9taXNlcyBhcyBmc1Byb21pc2VzLFxuICByZWFkLFxuICB3cml0ZSxcbiAgb3Blbixcbn0gZnJvbSAnZnMnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZ2xvYic7XG5pbXBvcnQga2xhdyBmcm9tICdrbGF3JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbXYgZnJvbSAnbXYnO1xuaW1wb3J0IG5jcCBmcm9tICduY3AnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgcGtnRGlyIGZyb20gJ3BrZy1kaXInO1xuaW1wb3J0IHJlYWRQa2cgZnJvbSAncmVhZC1wa2cnO1xuaW1wb3J0IHJpbXJhZklkeCBmcm9tICdyaW1yYWYnO1xuaW1wb3J0IHNhbml0aXplIGZyb20gJ3Nhbml0aXplLWZpbGVuYW1lJztcbmltcG9ydCB3aGljaCBmcm9tICd3aGljaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBUaW1lciBmcm9tICcuL3RpbWluZyc7XG5pbXBvcnQge2lzV2luZG93c30gZnJvbSAnLi9zeXN0ZW0nO1xuaW1wb3J0IHtwbHVyYWxpemV9IGZyb20gJy4vdXRpbCc7XG5cbmNvbnN0IG5jcEFzeW5jID1cbiAgLyoqIEB0eXBlIHsoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZywgb3B0czogbmNwLk9wdGlvbnN8dW5kZWZpbmVkKSA9PiBCPHZvaWQ+fSAqLyAoXG4gICAgQi5wcm9taXNpZnkobmNwKVxuICApO1xuY29uc3QgZmluZFJvb3RDYWNoZWQgPSBfLm1lbW9pemUocGtnRGlyLnN5bmMpO1xuXG5jb25zdCBmcyA9IHtcbiAgLyoqXG4gICAqIFJlc29sdmVzIGB0cnVlYCBpZiBgcGF0aGAgaXMgX3JlYWRhYmxlXywgd2hpY2ggZGlmZmVycyBmcm9tIE5vZGUuanMnIGRlZmF1bHQgYmVoYXZpb3Igb2YgXCJjYW4gd2Ugc2VlIGl0P1wiXG4gICAqXG4gICAqIE9uIFdpbmRvd3MsIEFDTHMgYXJlIG5vdCBzdXBwb3J0ZWQsIHNvIHRoaXMgYmVjb21lcyBhIHNpbXBsZSBjaGVjayBmb3IgZXhpc3RlbmNlLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgKiBAcGFyYW0ge1BhdGhMaWtlfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzQWNjZXNzKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnNQcm9taXNlcy5hY2Nlc3MocGF0aCwgY29uc3RhbnRzLlJfT0spO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogUmVzb2x2ZXMgYHRydWVgIGlmIGBwYXRoYCBpcyBleGVjdXRhYmxlOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogT24gV2luZG93cywgdGhpcyBmdW5jdGlvbiBkZWxlZ2F0ZXMgdG8ge0BsaW5rY29kZSBmcy5oYXNBY2Nlc3N9LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgKiBAcGFyYW0ge1BhdGhMaWtlfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaXNFeGVjdXRhYmxlKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGlzV2luZG93cygpKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5oYXNBY2Nlc3MocGF0aCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBmc1Byb21pc2VzLmFjY2VzcyhwYXRoLCBjb25zdGFudHMuUl9PSyB8IGNvbnN0YW50cy5YX09LKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB7QGxpbmtjb2RlIGZzLmhhc0FjY2Vzc31cbiAgICogQHBhcmFtIHtQYXRoTGlrZX0gcGF0aFxuICAgKi9cbiAgYXN5bmMgZXhpc3RzKHBhdGgpIHtcbiAgICByZXR1cm4gYXdhaXQgZnMuaGFzQWNjZXNzKHBhdGgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMsIHJlY3Vyc2l2ZWx5XG4gICAqIEB0b2RvIFJlcGxhY2Ugd2l0aCBgcm0oKWAgZnJvbSBgZnMucHJvbWlzZXNgIHdoZW4gTm9kZS5qcyB2MTIgc3VwcG9ydCBpcyBkcm9wcGVkLlxuICAgKi9cbiAgcmltcmFmOiAvKiogQHR5cGUgeyhkaXJwYXRoOiBzdHJpbmcsIG9wdHM/OiBpbXBvcnQoJ3JpbXJhZicpLk9wdGlvbnMpID0+IFByb21pc2U8dm9pZD59ICovIChcbiAgICBCLnByb21pc2lmeShyaW1yYWZJZHgpXG4gICksXG5cbiAgLyoqXG4gICAqIEFsaWFzIG9mIHtAbGlua2NvZGUgcmltcmFmSWR4LnN5bmN9XG4gICAqIEB0b2RvIFJlcGxhY2Ugd2l0aCBgcm1TeW5jKClgIGZyb20gYGZzYCB3aGVuIE5vZGUuanMgdjEyIHN1cHBvcnQgaXMgZHJvcHBlZC5cbiAgICovXG4gIHJpbXJhZlN5bmM6IHJpbXJhZklkeC5zeW5jLFxuXG4gIC8qKlxuICAgKiBMaWtlIE5vZGUuanMnIGBmc1Byb21pc2VzLm1rZGlyKClgLCBidXQgd2lsbCBfbm90XyByZWplY3QgaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfFVSTH0gZmlsZXBhdGhcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2ZzJykuTWFrZURpcmVjdG9yeU9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmd8dW5kZWZpbmVkPn1cbiAgICogQHNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNwcm9taXNlc21rZGlycGF0aC1vcHRpb25zXG4gICAqL1xuICBhc3luYyBta2RpcihmaWxlcGF0aCwgb3B0cyA9IHt9KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmc1Byb21pc2VzLm1rZGlyKGZpbGVwYXRoLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnI/LmNvZGUgIT09ICdFRVhJU1QnKSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb3BpZXMgZmlsZXMgX2FuZCBlbnRpcmUgZGlyZWN0b3JpZXNfXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBTb3VyY2UgdG8gY29weVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb24gLSBEZXN0aW5hdGlvbiB0byBjb3B5IHRvXG4gICAqIEBwYXJhbSB7bmNwLk9wdGlvbnN9IFtvcHRzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYG5jcGBcbiAgICogQHNlZSBodHRwczovL25wbS5pbS9uY3BcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjb3B5RmlsZShzb3VyY2UsIGRlc3RpbmF0aW9uLCBvcHRzID0ge30pIHtcbiAgICBpZiAoIShhd2FpdCBmcy5oYXNBY2Nlc3Moc291cmNlKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgJyR7c291cmNlfScgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IG5jcEFzeW5jKHNvdXJjZSwgZGVzdGluYXRpb24sIG9wdHMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gTUQ1IGhhc2ggb2YgYSBmaWxlLlxuICAgKiBAcGFyYW0ge1BhdGhMaWtlfSBmaWxlUGF0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgbWQ1KGZpbGVQYXRoKSB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLmhhc2goZmlsZVBhdGgsICdtZDUnKTtcbiAgfSxcblxuICAvKipcbiAgICogTW92ZSBhIGZpbGVcbiAgICovXG4gIG12OiAvKiogQHR5cGUgeyhmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9wdHM/OiBtdi5PcHRpb25zKSA9PiBCPHZvaWQ+fSAqLyAoQi5wcm9taXNpZnkobXYpKSxcblxuICAvKipcbiAgICogRmluZCBwYXRoIHRvIGFuIGV4ZWN1dGFibGUgaW4gc3lzdGVtIGBQQVRIYFxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vbm9kZS13aGljaFxuICAgKi9cbiAgd2hpY2gsXG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZ2xvYiBwYXR0ZXJuLCByZXNvbHZlIHdpdGggbGlzdCBvZiBmaWxlcyBtYXRjaGluZyB0aGF0IHBhdHRlcm5cbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ2xvYlxuICAgKi9cbiAgZ2xvYjogLyoqIEB0eXBlIHsocGF0dGVybjogc3RyaW5nLCBvcHRzPzogZ2xvYi5JT3B0aW9ucykgPT4gQjxzdHJpbmdbXT59ICovIChCLnByb21pc2lmeShnbG9iKSksXG5cbiAgLyoqXG4gICAqIFNhbml0aXplIGEgZmlsZW5hbWVcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGFyc2hhcC9ub2RlLXNhbml0aXplLWZpbGVuYW1lXG4gICAqL1xuICBzYW5pdGl6ZU5hbWU6IHNhbml0aXplLFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBoZXggZGlnZXN0IG9mIHNvbWUgZmlsZSBhdCBgZmlsZVBhdGhgXG4gICAqIEBwYXJhbSB7UGF0aExpa2V9IGZpbGVQYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxnb3JpdGhtXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgaGFzaChmaWxlUGF0aCwgYWxnb3JpdGhtID0gJ3NoYTEnKSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVIYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goYWxnb3JpdGhtKTtcbiAgICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBjcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcbiAgICAgIHJlYWRTdHJlYW0ub24oJ2Vycm9yJywgKGUpID0+XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGNhbGN1bGF0ZSAke2FsZ29yaXRobX0gaGFzaCBmb3IgJyR7ZmlsZVBhdGh9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZWFkU3RyZWFtLm9uKCdkYXRhJywgKGNodW5rKSA9PiBmaWxlSGFzaC51cGRhdGUoY2h1bmspKTtcbiAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUoZmlsZUhhc2guZGlnZXN0KCdoZXgnKSkpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGBXYWxrZXJgIGluc3RhbmNlLCB3aGljaCBpcyBhIHJlYWRhYmxlIHN0cmVhbSAoYW5kIHRodXNseSBhbiBhc3luYyBpdGVyYXRvcikuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgLSBEaXIgdG8gc3RhcnQgd2Fsa2luZyBhdFxuICAgKiBAcGFyYW0ge2ltcG9ydCgna2xhdycpLk9wdGlvbnN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdrbGF3JykuV2Fsa2VyfVxuICAgKiBAc2VlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2tsYXdcbiAgICovXG4gIHdhbGsoZGlyLCBvcHRzKSB7XG4gICAgcmV0dXJuIGtsYXcoZGlyLCBvcHRzKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgY3JlYXRlIGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge1BhdGhMaWtlfSBkaXJcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nfHVuZGVmaW5lZD59XG4gICAqL1xuICBhc3luYyBta2RpcnAoZGlyKSB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLm1rZGlyKGRpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXYWxrcyBhIGRpcmVjdG9yeSBnaXZlbiBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgZ2l2ZW4uIFRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgd2l0aCBhIHBhdGggam9pbmVkIHdpdGggdGhlIGRpciBwYXJhbWV0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpciBEaXJlY3RvcnkgcGF0aCB3aGVyZSB3ZSB3aWxsIHN0YXJ0IHdhbGtpbmdcbiAgICogQHBhcmFtIHtib29sZWFufSByZWN1cnNpdmUgU2V0IGl0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gY29udGludWUgd2Fsa2luZyBzdWIgZGlyZWN0b3JpZXNcbiAgICogQHBhcmFtIHtXYWxrRGlyQ2FsbGJhY2t9IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIG5ldyBwYXRoIGlzIGZvdW5kXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYGRpcmAgcGFyYW1ldGVyIGNvbnRhaW5zIGEgcGF0aCB0byBhbiBpbnZhbGlkIGZvbGRlclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc/Pn0gcmV0dXJucyB0aGUgZm91bmQgcGF0aCBvciBudWxsIGlmIHRoZSBpdGVtIHdhcyBub3QgZm91bmRcbiAgICovXG4gIGFzeW5jIHdhbGtEaXIoZGlyLCByZWN1cnNpdmUsIGNhbGxiYWNrKSB7XG4gICAgLy9lc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICAgIGxldCBpc1ZhbGlkUm9vdCA9IGZhbHNlO1xuICAgIGxldCBlcnJNc2cgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBpc1ZhbGlkUm9vdCA9IChhd2FpdCBmcy5zdGF0KGRpcikpLmlzRGlyZWN0b3J5KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyTXNnID0gZS5tZXNzYWdlO1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRSb290KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYCcke2Rpcn0nIGlzIG5vdCBhIHZhbGlkIHJvb3QgZGlyZWN0b3J5YCArIChlcnJNc2cgPyBgLiBPcmlnaW5hbCBlcnJvcjogJHtlcnJNc2d9YCA6ICcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgd2Fsa2VyO1xuICAgIGxldCBmaWxlQ291bnQgPSAwO1xuICAgIGxldCBkaXJlY3RvcnlDb3VudCA9IDA7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgVGltZXIoKS5zdGFydCgpO1xuICAgIHJldHVybiBhd2FpdCBuZXcgQihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBsZXQgbGFzdEZpbGVQcm9jZXNzZWQgPSBCLnJlc29sdmUoKTtcbiAgICAgIHdhbGtlciA9IGtsYXcoZGlyLCB7XG4gICAgICAgIGRlcHRoTGltaXQ6IHJlY3Vyc2l2ZSA/IC0xIDogMCxcbiAgICAgIH0pO1xuICAgICAgd2Fsa2VyXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgd2Fsa2VyLnBhdXNlKCk7XG5cbiAgICAgICAgICBpZiAoIWl0ZW0uc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpcmVjdG9yeUNvdW50Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICAgICAgICAgIGxhc3RGaWxlUHJvY2Vzc2VkID0gQi50cnkoYXN5bmMgKCkgPT4gYXdhaXQgY2FsbGJhY2soaXRlbS5wYXRoLCBpdGVtLnN0YXRzLmlzRGlyZWN0b3J5KCkpKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRvbmUgPSBmYWxzZSkge1xuICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoaXRlbS5wYXRoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3YWxrZXIucmVzdW1lKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2gocmVqZWN0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIsIGl0ZW0pIHtcbiAgICAgICAgICBsb2cud2FybihgR290IGFuIGVycm9yIHdoaWxlIHdhbGtpbmcgJyR7aXRlbS5wYXRofSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgLy8ga2xhdyBjYW5ub3QgZ2V0IGJhY2sgZnJvbSBhbiBFTk9FTlQgZXJyb3JcbiAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICBsb2cud2FybignQWxsIGZpbGVzIG1heSBub3QgaGF2ZSBiZWVuIGFjY2Vzc2VkJyk7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxhc3RGaWxlUHJvY2Vzc2VkXG4gICAgICAgICAgICAudGhlbigoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi8gKGZpbGUpID8/IG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKGBVbmV4cGVjdGVkIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFRyYXZlcnNlZCAke3BsdXJhbGl6ZSgnZGlyZWN0b3J5JywgZGlyZWN0b3J5Q291bnQsIHRydWUpfSBgICtcbiAgICAgICAgICBgYW5kICR7cGx1cmFsaXplKCdmaWxlJywgZmlsZUNvdW50LCB0cnVlKX0gYCArXG4gICAgICAgICAgYGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYFxuICAgICAgKTtcbiAgICAgIGlmICh3YWxrZXIpIHtcbiAgICAgICAgd2Fsa2VyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBjbG9zZXN0IGBwYWNrYWdlLmpzb25gIGZpbGUgZnJvbSBhYnNvbHV0ZSBwYXRoIGBkaXJgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGlyIC0gRGlyZWN0b3J5IHRvIHNlYXJjaCBmcm9tXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdyZWFkLXBrZycpLk9wdGlvbnN9IFtvcHRzXSAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgYHJlYWQtcGtnYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2VyZSBwcm9ibGVtcyBmaW5kaW5nIG9yIHJlYWRpbmcgYSBgcGFja2FnZS5qc29uYCBmaWxlXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGFyc2VkIGBwYWNrYWdlLmpzb25gXG4gICAqL1xuICByZWFkUGFja2FnZUpzb25Gcm9tKGRpciwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgY3dkID0gZnMuZmluZFJvb3QoZGlyKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlYWRQa2cuc3luYyh7Li4ub3B0cywgY3dkfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGBGYWlsZWQgdG8gcmVhZCBhIFxcYHBhY2thZ2UuanNvblxcYCBmcm9tIGRpciBcXGAke2Rpcn1cXGA6XFxuXFxuJHtlcnIubWVzc2FnZX1gO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IGZyb20gYGRpcmAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgLSBEaXJlY3RvcnkgdG8gc2VhcmNoIGZyb21cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBgZGlyYCBpcyBub3QgYSBub25lbXB0eSBzdHJpbmcgb3IgcmVsYXRpdmUgcGF0aFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2VyZSBwcm9ibGVtcyBmaW5kaW5nIHRoZSBwcm9qZWN0IHJvb3RcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNsb3Nlc2V0IHBhcmVudCBkaXIgY29udGFpbmluZyBgcGFja2FnZS5qc29uYFxuICAgKi9cbiAgZmluZFJvb3QoZGlyKSB7XG4gICAgaWYgKCFkaXIgfHwgIXBhdGguaXNBYnNvbHV0ZShkaXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZmluZFJvb3QoKWAgbXVzdCBiZSBwcm92aWRlZCBhIG5vbi1lbXB0eSwgYWJzb2x1dGUgcGF0aCcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmaW5kUm9vdENhY2hlZChkaXIpO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGZpbmRSb290KClcXGAgY291bGQgbm90IGZpbmQgXFxgcGFja2FnZS5qc29uXFxgIGZyb20gJHtkaXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgLy8gYWRkIHRoZSBzdXBwb3J0ZWQgYGZzYCBmdW5jdGlvbnNcbiAgYWNjZXNzOiBmc1Byb21pc2VzLmFjY2VzcyxcbiAgYXBwZW5kRmlsZTogZnNQcm9taXNlcy5hcHBlbmRGaWxlLFxuICBjaG1vZDogZnNQcm9taXNlcy5jaG1vZCxcbiAgY2xvc2U6IEIucHJvbWlzaWZ5KGNsb3NlKSxcbiAgY29uc3RhbnRzLFxuICBjcmVhdGVXcml0ZVN0cmVhbSxcbiAgY3JlYXRlUmVhZFN0cmVhbSxcbiAgbHN0YXQ6IGZzUHJvbWlzZXMubHN0YXQsXG4gIC8qKlxuICAgKiBXYXJuaW5nOiB0aGlzIGlzIGEgcHJvbWlzaWZpZWQge0BsaW5rY29kZSBvcGVuIGZzLm9wZW59LlxuICAgKiBJdCByZXNvbHZlcyB3L2EgZmlsZSBkZXNjcmlwdG9yIGluc3RlYWQgb2YgYSB7QGxpbmtjb2RlIGZzUHJvbWlzZXMuRmlsZUhhbmRsZSBGaWxlSGFuZGxlfSBvYmplY3QsIGFzIHtAbGlua2NvZGUgZnNQcm9taXNlcy5vcGVufSBkb2VzLiBVc2Uge0BsaW5rY29kZSBmcy5vcGVuRmlsZX0gaWYgeW91IHdhbnQgYSBgRmlsZUhhbmRsZWAuXG4gICAqIEB0eXBlIHsocGF0aDogUGF0aExpa2UsIGZsYWdzOiBpbXBvcnQoJ2ZzJykuT3Blbk1vZGUsIG1vZGU/OiBpbXBvcnQoJ2ZzJykuTW9kZSkgPT4gUHJvbWlzZTxudW1iZXI+fVxuICAgKi9cbiAgb3BlbjogQi5wcm9taXNpZnkob3BlbiksXG4gIG9wZW5GaWxlOiBmc1Byb21pc2VzLm9wZW4sXG4gIHJlYWRkaXI6IGZzUHJvbWlzZXMucmVhZGRpcixcbiAgcmVhZDogQi5wcm9taXNpZnkocmVhZCksXG4gIHJlYWRGaWxlOiBmc1Byb21pc2VzLnJlYWRGaWxlLFxuICByZWFkbGluazogZnNQcm9taXNlcy5yZWFkbGluayxcbiAgcmVhbHBhdGg6IGZzUHJvbWlzZXMucmVhbHBhdGgsXG4gIHJlbmFtZTogZnNQcm9taXNlcy5yZW5hbWUsXG4gIHN0YXQ6IGZzUHJvbWlzZXMuc3RhdCxcbiAgc3ltbGluazogZnNQcm9taXNlcy5zeW1saW5rLFxuICB1bmxpbms6IGZzUHJvbWlzZXMudW5saW5rLFxuICB3cml0ZTogQi5wcm9taXNpZnkod3JpdGUpLFxuICB3cml0ZUZpbGU6IGZzUHJvbWlzZXMud3JpdGVGaWxlLFxuXG4gIC8vIGRlcHJlY2F0ZWQgcHJvcHNcblxuICAvKipcbiAgICogVXNlIGBjb25zdGFudHMuRl9PS2AgaW5zdGVhZC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIEZfT0s6IGNvbnN0YW50cy5GX09LLFxuXG4gIC8qKlxuICAgKiBVc2UgYGNvbnN0YW50cy5SX09LYCBpbnN0ZWFkLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgUl9PSzogY29uc3RhbnRzLlJfT0ssXG5cbiAgLyoqXG4gICAqIFVzZSBgY29uc3RhbnRzLldfT0tgIGluc3RlYWQuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBXX09LOiBjb25zdGFudHMuV19PSyxcblxuICAvKipcbiAgICogVXNlIGBjb25zdGFudHMuWF9PS2AgaW5zdGVhZC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIFhfT0s6IGNvbnN0YW50cy5YX09LLFxufTtcblxuZXhwb3J0IHtmc307XG5leHBvcnQgZGVmYXVsdCBmcztcblxuLyoqXG4gKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBkaXJlY3Rvcnkgd2Fsa2luZ1xuICogQGNhbGxiYWNrIFdhbGtEaXJDYWxsYmFja1xuICogQHBhcmFtIHtzdHJpbmd9IGl0ZW1QYXRoIFRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGZvbGRlclxuICogQHBhcmFtIHtib29sZWFufSBpc0RpcmVjdG9yeSBTaG93cyBpZiBpdCBpcyBhIGRpcmVjdG9yeSBvciBhIGZpbGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybiB0cnVlIGlmIHlvdSB3YW50IHRvIHN0b3Agd2Fsa2luZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnZ2xvYicpfSBnbG9iXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtdicpfSBtdlxuICogQHR5cGVkZWYge2ltcG9ydCgnZnMnKS5QYXRoTGlrZX0gUGF0aExpa2VcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFFBQVEsR0FFVkMsaUJBQUEsQ0FBRUMsU0FBRixDQUFZQyxZQUFaLENBRko7O0FBSUEsTUFBTUMsY0FBYyxHQUFHQyxlQUFBLENBQUVDLE9BQUYsQ0FBVUMsZUFBQSxDQUFPQyxJQUFqQixDQUF2Qjs7QUFFQSxNQUFNQyxFQUFFLEdBQUc7RUFVVCxNQUFNQyxTQUFOLENBQWdCQyxJQUFoQixFQUFzQjtJQUNwQixJQUFJO01BQ0YsTUFBTUMsWUFBQSxDQUFXQyxNQUFYLENBQWtCRixJQUFsQixFQUF3QkcsYUFBQSxDQUFVQyxJQUFsQyxDQUFOO0lBQ0QsQ0FGRCxDQUVFLE1BQU07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
|
|
343
|
+
exports.default = fs;
|
|
344
|
+
/**
|
|
345
|
+
* The callback function which will be called during the directory walking
|
|
346
|
+
* @callback WalkDirCallback
|
|
347
|
+
* @param {string} itemPath The path of the file or folder
|
|
348
|
+
* @param {boolean} isDirectory Shows if it is a directory or a file
|
|
349
|
+
* @return {boolean} return true if you want to stop walking
|
|
350
|
+
*/
|
|
351
|
+
/**
|
|
352
|
+
* @typedef {import('glob')} glob
|
|
353
|
+
* @typedef {import('mv')} mv
|
|
354
|
+
* @typedef {import('fs').PathLike} PathLike
|
|
355
|
+
*/
|
|
356
|
+
/**
|
|
357
|
+
* @template {NodeJS.ArrayBufferView} TBuffer
|
|
358
|
+
* @callback ReadFn
|
|
359
|
+
* @param {number} fd
|
|
360
|
+
* @param {TBuffer|import('node:fs').ReadAsyncOptions<TBuffer>} buffer
|
|
361
|
+
* @param {number} [offset]
|
|
362
|
+
* @param {number} [length]
|
|
363
|
+
* @param {number?} [position]
|
|
364
|
+
* @returns {B<{bytesRead: number, buffer: TBuffer}>}
|
|
365
|
+
*/
|
|
366
|
+
//# sourceMappingURL=fs.js.map
|