JezK
Edit File: fs.js
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.constants = exports.chmod = exports.access = void 0; exports.copy = copy; exports.copyBulk = copyBulk; exports.exists = void 0; exports.find = find; exports.getFileSizeOnDisk = getFileSizeOnDisk; exports.getFirstSuitableFolder = getFirstSuitableFolder; exports.glob = void 0; exports.hardlinkBulk = hardlinkBulk; exports.hardlinksWork = hardlinksWork; exports.lstat = exports.lockQueue = exports.link = void 0; exports.makeTempDir = makeTempDir; exports.mkdirp = void 0; exports.normalizeOS = normalizeOS; exports.open = void 0; exports.readFile = readFile; exports.readFileAny = readFileAny; exports.readFileBuffer = void 0; exports.readFileRaw = readFileRaw; exports.readFirstAvailableStream = readFirstAvailableStream; exports.readJson = readJson; exports.readJsonAndFile = readJsonAndFile; exports.stat = exports.rename = exports.realpath = exports.readlink = exports.readdir = void 0; exports.symlink = symlink; Object.defineProperty(exports, "unlink", { enumerable: true, get: function get() { return _fsNormalized().unlink; } }); exports.walk = walk; exports.writeFile = void 0; exports.writeFilePreservingEol = writeFilePreservingEol; function _regenerator() { var data = _interopRequireDefault(require("@babel/runtime/regenerator")); _regenerator = function _regenerator() { return data; }; return data; } function _asyncToGenerator2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); _asyncToGenerator2 = function _asyncToGenerator2() { return data; }; return data; } function _fs() { var data = _interopRequireDefault(require("fs")); _fs = function _fs() { return data; }; return data; } function _glob() { var data = _interopRequireDefault(require("glob")); _glob = function _glob() { return data; }; return data; } function _os() { var data = _interopRequireDefault(require("os")); _os = function _os() { return data; }; return data; } function _path2() { var data = _interopRequireDefault(require("path")); _path2 = function _path2() { return data; }; return data; } function _blockingQueue() { var data = _interopRequireDefault(require("./blocking-queue.js")); _blockingQueue = function _blockingQueue() { return data; }; return data; } function promise() { var data = _interopRequireWildcard(require("./promise.js")); promise = function promise() { return data; }; return data; } function _map() { var data = _interopRequireDefault(require("./map.js")); _map = function _map() { return data; }; return data; } function _fsNormalized() { var data = require("./fs-normalized.js"); _fsNormalized = function _fsNormalized() { return data; }; return data; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } var constants = typeof _fs()["default"].constants !== 'undefined' ? _fs()["default"].constants : { R_OK: _fs()["default"].R_OK, W_OK: _fs()["default"].W_OK, X_OK: _fs()["default"].X_OK }; exports.constants = constants; var lockQueue = new (_blockingQueue()["default"])('fs lock'); exports.lockQueue = lockQueue; var readFileBuffer = (0, promise().promisify)(_fs()["default"].readFile); exports.readFileBuffer = readFileBuffer; var open = (0, promise().promisify)(_fs()["default"].open); exports.open = open; var writeFile = (0, promise().promisify)(_fs()["default"].writeFile); exports.writeFile = writeFile; var readlink = (0, promise().promisify)(_fs()["default"].readlink); exports.readlink = readlink; var realpath = (0, promise().promisify)(_fs()["default"].realpath); exports.realpath = realpath; var readdir = (0, promise().promisify)(_fs()["default"].readdir); exports.readdir = readdir; var rename = (0, promise().promisify)(_fs()["default"].rename); exports.rename = rename; var access = (0, promise().promisify)(_fs()["default"].access); exports.access = access; var stat = (0, promise().promisify)(_fs()["default"].stat); exports.stat = stat; var mkdirp = (0, promise().promisify)(require('mkdirp-classic')); exports.mkdirp = mkdirp; var exists = (0, promise().promisify)(_fs()["default"].exists, true); exports.exists = exists; var lstat = (0, promise().promisify)(_fs()["default"].lstat); exports.lstat = lstat; var chmod = (0, promise().promisify)(_fs()["default"].chmod); exports.chmod = chmod; var link = (0, promise().promisify)(_fs()["default"].link); exports.link = link; var glob = (0, promise().promisify)(_glob()["default"]); exports.glob = glob; // fs.copyFile uses the native file copying instructions on the system, performing much better // than any JS-based solution and consumes fewer resources. Repeated testing to fine tune the // concurrency level revealed 128 as the sweet spot on a quad-core, 16 CPU Intel system with SSD. var CONCURRENT_QUEUE_ITEMS = _fs()["default"].copyFile ? 128 : 4; var fsSymlink = (0, promise().promisify)(_fs()["default"].symlink); var invariant = require('invariant'); var stripBOM = require('strip-bom'); var noop = function noop() {}; function buildActionsForCopy(_x, _x2, _x3, _x4) { return _buildActionsForCopy.apply(this, arguments); } function _buildActionsForCopy() { _buildActionsForCopy = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee2(queue, events, possibleExtraneous, reporter) { var artifactFiles, files, _iterator, _step, _loop, actions, items, _iterator2, _step2, file, _iterator3, _step3, loc, build, _build; return _regenerator()["default"].wrap(function _callee2$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: _build = function _build3() { _build = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee(data) { var src, dest, type, onFresh, _onDone, srcStat, srcFiles, destStat, bothSymlinks, bothFolders, bothFiles, srcReallink, destFiles, _iterator4, _step4, _file, _loc, _iterator5, _step5, _file2, linkname, destParts, remaining, _iterator6, _step6, _file3; return _regenerator()["default"].wrap(function _callee$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: src = data.src, dest = data.dest, type = data.type; onFresh = data.onFresh || noop; _onDone = data.onDone || noop; // TODO https://github.com/yarnpkg/yarn/issues/3751 // related to bundled dependencies handling if (files.has(dest.toLowerCase())) { reporter.verbose("The case-insensitive file ".concat(dest, " shouldn't be copied twice in one bulk copy")); } else { files.add(dest.toLowerCase()); } if (!(type === 'symlink')) { _context2.next = 11; break; } _context2.next = 7; return mkdirp(_path2()["default"].dirname(dest)); case 7: onFresh(); actions.symlink.push({ dest: dest, linkname: src }); _onDone(); return _context2.abrupt("return"); case 11: if (!(events.ignoreBasenames.indexOf(_path2()["default"].basename(src)) >= 0)) { _context2.next = 13; break; } return _context2.abrupt("return"); case 13: _context2.next = 15; return lstat(src); case 15: srcStat = _context2.sent; if (!srcStat.isDirectory()) { _context2.next = 20; break; } _context2.next = 19; return readdir(src); case 19: srcFiles = _context2.sent; case 20: _context2.prev = 20; _context2.next = 23; return lstat(dest); case 23: destStat = _context2.sent; _context2.next = 30; break; case 26: _context2.prev = 26; _context2.t0 = _context2["catch"](20); if (!(_context2.t0.code !== 'ENOENT')) { _context2.next = 30; break; } throw _context2.t0; case 30: if (!destStat) { _context2.next = 86; break; } bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); bothFolders = srcStat.isDirectory() && destStat.isDirectory(); bothFiles = srcStat.isFile() && destStat.isFile(); // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving // us modes that aren't valid. investigate this, it's generally safe to proceed. /* if (srcStat.mode !== destStat.mode) { try { await access(dest, srcStat.mode); } catch (err) {} } */ if (!(bothFiles && artifactFiles.has(dest))) { _context2.next = 38; break; } // this file gets changed during build, likely by a custom install script. Don't bother checking it. _onDone(); reporter.verbose(reporter.lang('verboseFileSkipArtifact', src)); return _context2.abrupt("return"); case 38: if (!(bothFiles && srcStat.size === destStat.size && (0, _fsNormalized().fileDatesEqual)(srcStat.mtime, destStat.mtime))) { _context2.next = 42; break; } // we can safely assume this is the same file _onDone(); reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.size, +srcStat.mtime)); return _context2.abrupt("return"); case 42: if (!bothSymlinks) { _context2.next = 54; break; } _context2.next = 45; return readlink(src); case 45: srcReallink = _context2.sent; _context2.t1 = srcReallink; _context2.next = 49; return readlink(dest); case 49: _context2.t2 = _context2.sent; if (!(_context2.t1 === _context2.t2)) { _context2.next = 54; break; } // if both symlinks are the same then we can continue on _onDone(); reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink)); return _context2.abrupt("return"); case 54: if (!bothFolders) { _context2.next = 86; break; } _context2.next = 57; return readdir(dest); case 57: destFiles = _context2.sent; invariant(srcFiles, 'src files not initialised'); _iterator4 = _createForOfIteratorHelper(destFiles); _context2.prev = 60; _iterator4.s(); case 62: if ((_step4 = _iterator4.n()).done) { _context2.next = 78; break; } _file = _step4.value; if (!(srcFiles.indexOf(_file) < 0)) { _context2.next = 76; break; } _loc = _path2()["default"].join(dest, _file); possibleExtraneous.add(_loc); _context2.next = 69; return lstat(_loc); case 69: if (!_context2.sent.isDirectory()) { _context2.next = 76; break; } _context2.t3 = _createForOfIteratorHelper; _context2.next = 73; return readdir(_loc); case 73: _context2.t4 = _context2.sent; _iterator5 = (0, _context2.t3)(_context2.t4); try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { _file2 = _step5.value; possibleExtraneous.add(_path2()["default"].join(_loc, _file2)); } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } case 76: _context2.next = 62; break; case 78: _context2.next = 83; break; case 80: _context2.prev = 80; _context2.t5 = _context2["catch"](60); _iterator4.e(_context2.t5); case 83: _context2.prev = 83; _iterator4.f(); return _context2.finish(83); case 86: if (!(destStat && destStat.isSymbolicLink())) { _context2.next = 90; break; } _context2.next = 89; return (0, _fsNormalized().unlink)(dest); case 89: destStat = null; case 90: if (!srcStat.isSymbolicLink()) { _context2.next = 99; break; } onFresh(); _context2.next = 94; return readlink(src); case 94: linkname = _context2.sent; actions.symlink.push({ dest: dest, linkname: linkname }); _onDone(); _context2.next = 120; break; case 99: if (!srcStat.isDirectory()) { _context2.next = 113; break; } if (destStat) { _context2.next = 104; break; } reporter.verbose(reporter.lang('verboseFileFolder', dest)); _context2.next = 104; return mkdirp(dest); case 104: destParts = dest.split(_path2()["default"].sep); while (destParts.length) { files.add(destParts.join(_path2()["default"].sep).toLowerCase()); destParts.pop(); } // push all files to queue invariant(srcFiles, 'src files not initialised'); remaining = srcFiles.length; if (!remaining) { _onDone(); } _iterator6 = _createForOfIteratorHelper(srcFiles); try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { _file3 = _step6.value; queue.push({ dest: _path2()["default"].join(dest, _file3), onFresh: onFresh, onDone: function onDone() { if (--remaining === 0) { _onDone(); } }, src: _path2()["default"].join(src, _file3) }); } } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } _context2.next = 120; break; case 113: if (!srcStat.isFile()) { _context2.next = 119; break; } onFresh(); actions.file.push({ src: src, dest: dest, atime: srcStat.atime, mtime: srcStat.mtime, mode: srcStat.mode }); _onDone(); _context2.next = 120; break; case 119: throw new Error("unsure how to copy this: ".concat(src)); case 120: case "end": return _context2.stop(); } }, _callee, null, [[20, 26], [60, 80, 83, 86]]); })); return _build.apply(this, arguments); }; build = function _build2(_x32) { return _build.apply(this, arguments); }; artifactFiles = new Set(events.artifactFiles || []); files = new Set(); // initialise events _iterator = _createForOfIteratorHelper(queue); _context3.prev = 5; _loop = /*#__PURE__*/_regenerator()["default"].mark(function _loop() { var item, onDone; return _regenerator()["default"].wrap(function _loop$(_context) { while (1) switch (_context.prev = _context.next) { case 0: item = _step.value; onDone = item.onDone; item.onDone = function () { events.onProgress(item.dest); if (onDone) { onDone(); } }; case 3: case "end": return _context.stop(); } }, _loop); }); _iterator.s(); case 8: if ((_step = _iterator.n()).done) { _context3.next = 12; break; } return _context3.delegateYield(_loop(), "t0", 10); case 10: _context3.next = 8; break; case 12: _context3.next = 17; break; case 14: _context3.prev = 14; _context3.t1 = _context3["catch"](5); _iterator.e(_context3.t1); case 17: _context3.prev = 17; _iterator.f(); return _context3.finish(17); case 20: events.onStart(queue.length); // start building actions actions = { file: [], symlink: [], link: [] }; // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items // at a time due to the requirement to push items onto the queue case 22: if (!queue.length) { _context3.next = 28; break; } items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); _context3.next = 26; return Promise.all(items.map(build)); case 26: _context3.next = 22; break; case 28: // simulate the existence of some files to prevent considering them extraneous _iterator2 = _createForOfIteratorHelper(artifactFiles); try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { file = _step2.value; if (possibleExtraneous.has(file)) { reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file)); possibleExtraneous["delete"](file); } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } _iterator3 = _createForOfIteratorHelper(possibleExtraneous); try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { loc = _step3.value; if (files.has(loc.toLowerCase())) { possibleExtraneous["delete"](loc); } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return _context3.abrupt("return", actions); case 33: case "end": return _context3.stop(); } }, _callee2, null, [[5, 14, 17, 20]]); })); return _buildActionsForCopy.apply(this, arguments); } function buildActionsForHardlink(_x5, _x6, _x7, _x8) { return _buildActionsForHardlink.apply(this, arguments); } function _buildActionsForHardlink() { _buildActionsForHardlink = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee4(queue, events, possibleExtraneous, reporter) { var artifactFiles, files, _iterator7, _step7, _loop2, actions, items, _iterator8, _step8, file, _iterator9, _step9, loc, build, _build4; return _regenerator()["default"].wrap(function _callee4$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: _build4 = function _build6() { _build4 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee3(data) { var src, dest, onFresh, _onDone2, srcStat, srcFiles, destExists, destStat, bothSymlinks, bothFolders, bothFiles, srcReallink, destFiles, _iterator10, _step10, _file4, _loc2, _iterator11, _step11, _file5, linkname, destParts, remaining, _iterator12, _step12, _file6; return _regenerator()["default"].wrap(function _callee3$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: src = data.src, dest = data.dest; onFresh = data.onFresh || noop; _onDone2 = data.onDone || noop; if (!files.has(dest.toLowerCase())) { _context5.next = 6; break; } // Fixes issue https://github.com/yarnpkg/yarn/issues/2734 // When bulk hardlinking we have A -> B structure that we want to hardlink to A1 -> B1, // package-linker passes that modules A1 and B1 need to be hardlinked, // the recursive linking algorithm of A1 ends up scheduling files in B1 to be linked twice which will case // an exception. _onDone2(); return _context5.abrupt("return"); case 6: files.add(dest.toLowerCase()); if (!(events.ignoreBasenames.indexOf(_path2()["default"].basename(src)) >= 0)) { _context5.next = 9; break; } return _context5.abrupt("return"); case 9: _context5.next = 11; return lstat(src); case 11: srcStat = _context5.sent; if (!srcStat.isDirectory()) { _context5.next = 16; break; } _context5.next = 15; return readdir(src); case 15: srcFiles = _context5.sent; case 16: _context5.next = 18; return exists(dest); case 18: destExists = _context5.sent; if (!destExists) { _context5.next = 87; break; } _context5.next = 22; return lstat(dest); case 22: destStat = _context5.sent; bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); bothFolders = srcStat.isDirectory() && destStat.isDirectory(); bothFiles = srcStat.isFile() && destStat.isFile(); if (!(srcStat.mode !== destStat.mode)) { _context5.next = 35; break; } _context5.prev = 27; _context5.next = 30; return access(dest, srcStat.mode); case 30: _context5.next = 35; break; case 32: _context5.prev = 32; _context5.t0 = _context5["catch"](27); // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving // us modes that aren't valid. investigate this, it's generally safe to proceed. reporter.verbose(_context5.t0); case 35: if (!(bothFiles && artifactFiles.has(dest))) { _context5.next = 39; break; } // this file gets changed during build, likely by a custom install script. Don't bother checking it. _onDone2(); reporter.verbose(reporter.lang('verboseFileSkipArtifact', src)); return _context5.abrupt("return"); case 39: if (!(bothFiles && srcStat.ino !== null && srcStat.ino === destStat.ino)) { _context5.next = 43; break; } _onDone2(); reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.ino)); return _context5.abrupt("return"); case 43: if (!bothSymlinks) { _context5.next = 55; break; } _context5.next = 46; return readlink(src); case 46: srcReallink = _context5.sent; _context5.t1 = srcReallink; _context5.next = 50; return readlink(dest); case 50: _context5.t2 = _context5.sent; if (!(_context5.t1 === _context5.t2)) { _context5.next = 55; break; } // if both symlinks are the same then we can continue on _onDone2(); reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink)); return _context5.abrupt("return"); case 55: if (!bothFolders) { _context5.next = 87; break; } _context5.next = 58; return readdir(dest); case 58: destFiles = _context5.sent; invariant(srcFiles, 'src files not initialised'); _iterator10 = _createForOfIteratorHelper(destFiles); _context5.prev = 61; _iterator10.s(); case 63: if ((_step10 = _iterator10.n()).done) { _context5.next = 79; break; } _file4 = _step10.value; if (!(srcFiles.indexOf(_file4) < 0)) { _context5.next = 77; break; } _loc2 = _path2()["default"].join(dest, _file4); possibleExtraneous.add(_loc2); _context5.next = 70; return lstat(_loc2); case 70: if (!_context5.sent.isDirectory()) { _context5.next = 77; break; } _context5.t3 = _createForOfIteratorHelper; _context5.next = 74; return readdir(_loc2); case 74: _context5.t4 = _context5.sent; _iterator11 = (0, _context5.t3)(_context5.t4); try { for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) { _file5 = _step11.value; possibleExtraneous.add(_path2()["default"].join(_loc2, _file5)); } } catch (err) { _iterator11.e(err); } finally { _iterator11.f(); } case 77: _context5.next = 63; break; case 79: _context5.next = 84; break; case 81: _context5.prev = 81; _context5.t5 = _context5["catch"](61); _iterator10.e(_context5.t5); case 84: _context5.prev = 84; _iterator10.f(); return _context5.finish(84); case 87: if (!srcStat.isSymbolicLink()) { _context5.next = 96; break; } onFresh(); _context5.next = 91; return readlink(src); case 91: linkname = _context5.sent; actions.symlink.push({ dest: dest, linkname: linkname }); _onDone2(); _context5.next = 116; break; case 96: if (!srcStat.isDirectory()) { _context5.next = 109; break; } reporter.verbose(reporter.lang('verboseFileFolder', dest)); _context5.next = 100; return mkdirp(dest); case 100: destParts = dest.split(_path2()["default"].sep); while (destParts.length) { files.add(destParts.join(_path2()["default"].sep).toLowerCase()); destParts.pop(); } // push all files to queue invariant(srcFiles, 'src files not initialised'); remaining = srcFiles.length; if (!remaining) { _onDone2(); } _iterator12 = _createForOfIteratorHelper(srcFiles); try { for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) { _file6 = _step12.value; queue.push({ onFresh: onFresh, src: _path2()["default"].join(src, _file6), dest: _path2()["default"].join(dest, _file6), onDone: function onDone() { if (--remaining === 0) { _onDone2(); } } }); } } catch (err) { _iterator12.e(err); } finally { _iterator12.f(); } _context5.next = 116; break; case 109: if (!srcStat.isFile()) { _context5.next = 115; break; } onFresh(); actions.link.push({ src: src, dest: dest, removeDest: destExists }); _onDone2(); _context5.next = 116; break; case 115: throw new Error("unsure how to copy this: ".concat(src)); case 116: case "end": return _context5.stop(); } }, _callee3, null, [[27, 32], [61, 81, 84, 87]]); })); return _build4.apply(this, arguments); }; build = function _build5(_x33) { return _build4.apply(this, arguments); }; artifactFiles = new Set(events.artifactFiles || []); files = new Set(); // initialise events _iterator7 = _createForOfIteratorHelper(queue); _context6.prev = 5; _loop2 = /*#__PURE__*/_regenerator()["default"].mark(function _loop2() { var item, onDone; return _regenerator()["default"].wrap(function _loop2$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: item = _step7.value; onDone = item.onDone || noop; item.onDone = function () { events.onProgress(item.dest); onDone(); }; case 3: case "end": return _context4.stop(); } }, _loop2); }); _iterator7.s(); case 8: if ((_step7 = _iterator7.n()).done) { _context6.next = 12; break; } return _context6.delegateYield(_loop2(), "t0", 10); case 10: _context6.next = 8; break; case 12: _context6.next = 17; break; case 14: _context6.prev = 14; _context6.t1 = _context6["catch"](5); _iterator7.e(_context6.t1); case 17: _context6.prev = 17; _iterator7.f(); return _context6.finish(17); case 20: events.onStart(queue.length); // start building actions actions = { file: [], symlink: [], link: [] }; // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items // at a time due to the requirement to push items onto the queue case 22: if (!queue.length) { _context6.next = 28; break; } items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); _context6.next = 26; return Promise.all(items.map(build)); case 26: _context6.next = 22; break; case 28: // simulate the existence of some files to prevent considering them extraneous _iterator8 = _createForOfIteratorHelper(artifactFiles); try { for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { file = _step8.value; if (possibleExtraneous.has(file)) { reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file)); possibleExtraneous["delete"](file); } } } catch (err) { _iterator8.e(err); } finally { _iterator8.f(); } _iterator9 = _createForOfIteratorHelper(possibleExtraneous); try { for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) { loc = _step9.value; if (files.has(loc.toLowerCase())) { possibleExtraneous["delete"](loc); } } } catch (err) { _iterator9.e(err); } finally { _iterator9.f(); } return _context6.abrupt("return", actions); case 33: case "end": return _context6.stop(); } }, _callee4, null, [[5, 14, 17, 20]]); })); return _buildActionsForHardlink.apply(this, arguments); } function copy(src, dest, reporter) { return copyBulk([{ src: src, dest: dest }], reporter); } function copyBulk(_x9, _x10, _x11) { return _copyBulk.apply(this, arguments); } function _copyBulk() { _copyBulk = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee6(queue, reporter, _events) { var events, actions, fileActions, currentlyWriting, symlinkActions; return _regenerator()["default"].wrap(function _callee6$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: events = { onStart: _events && _events.onStart || noop, onProgress: _events && _events.onProgress || noop, possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), ignoreBasenames: _events && _events.ignoreBasenames || [], artifactFiles: _events && _events.artifactFiles || [] }; _context8.next = 3; return buildActionsForCopy(queue, events, events.possibleExtraneous, reporter); case 3: actions = _context8.sent; events.onStart(actions.file.length + actions.symlink.length + actions.link.length); fileActions = actions.file; currentlyWriting = new Map(); _context8.next = 9; return promise().queue(fileActions, /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee5(data) { var writePromise, copier; return _regenerator()["default"].wrap(function _callee5$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: if (!(writePromise = currentlyWriting.get(data.dest))) { _context7.next = 5; break; } _context7.next = 3; return writePromise; case 3: _context7.next = 0; break; case 5: reporter.verbose(reporter.lang('verboseFileCopy', data.src, data.dest)); copier = (0, _fsNormalized().copyFile)(data, function () { return currentlyWriting["delete"](data.dest); }); currentlyWriting.set(data.dest, copier); events.onProgress(data.dest); return _context7.abrupt("return", copier); case 10: case "end": return _context7.stop(); } }, _callee5); })); return function (_x34) { return _ref.apply(this, arguments); }; }(), CONCURRENT_QUEUE_ITEMS); case 9: // we need to copy symlinks last as they could reference files we were copying symlinkActions = actions.symlink; _context8.next = 12; return promise().queue(symlinkActions, function (data) { var linkname = _path2()["default"].resolve(_path2()["default"].dirname(data.dest), data.linkname); reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname)); return symlink(linkname, data.dest); }); case 12: case "end": return _context8.stop(); } }, _callee6); })); return _copyBulk.apply(this, arguments); } function hardlinkBulk(_x12, _x13, _x14) { return _hardlinkBulk.apply(this, arguments); } function _hardlinkBulk() { _hardlinkBulk = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee8(queue, reporter, _events) { var events, actions, fileActions, symlinkActions; return _regenerator()["default"].wrap(function _callee8$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: events = { onStart: _events && _events.onStart || noop, onProgress: _events && _events.onProgress || noop, possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), artifactFiles: _events && _events.artifactFiles || [], ignoreBasenames: [] }; _context10.next = 3; return buildActionsForHardlink(queue, events, events.possibleExtraneous, reporter); case 3: actions = _context10.sent; events.onStart(actions.file.length + actions.symlink.length + actions.link.length); fileActions = actions.link; _context10.next = 8; return promise().queue(fileActions, /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee7(data) { return _regenerator()["default"].wrap(function _callee7$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: reporter.verbose(reporter.lang('verboseFileLink', data.src, data.dest)); if (!data.removeDest) { _context9.next = 4; break; } _context9.next = 4; return (0, _fsNormalized().unlink)(data.dest); case 4: _context9.next = 6; return link(data.src, data.dest); case 6: case "end": return _context9.stop(); } }, _callee7); })); return function (_x35) { return _ref2.apply(this, arguments); }; }(), CONCURRENT_QUEUE_ITEMS); case 8: // we need to copy symlinks last as they could reference files we were copying symlinkActions = actions.symlink; _context10.next = 11; return promise().queue(symlinkActions, function (data) { var linkname = _path2()["default"].resolve(_path2()["default"].dirname(data.dest), data.linkname); reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname)); return symlink(linkname, data.dest); }); case 11: case "end": return _context10.stop(); } }, _callee8); })); return _hardlinkBulk.apply(this, arguments); } function _readFile(loc, encoding) { return new Promise(function (resolve, reject) { _fs()["default"].readFile(loc, encoding, function (err, content) { if (err) { reject(err); } else { resolve(content); } }); }); } function readFile(loc) { return _readFile(loc, 'utf8').then(normalizeOS); } function readFileRaw(loc) { return _readFile(loc, 'binary'); } function readFileAny(_x15) { return _readFileAny.apply(this, arguments); } function _readFileAny() { _readFileAny = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee9(files) { var _iterator13, _step13, file; return _regenerator()["default"].wrap(function _callee9$(_context11) { while (1) switch (_context11.prev = _context11.next) { case 0: _iterator13 = _createForOfIteratorHelper(files); _context11.prev = 1; _iterator13.s(); case 3: if ((_step13 = _iterator13.n()).done) { _context11.next = 11; break; } file = _step13.value; _context11.next = 7; return exists(file); case 7: if (!_context11.sent) { _context11.next = 9; break; } return _context11.abrupt("return", readFile(file)); case 9: _context11.next = 3; break; case 11: _context11.next = 16; break; case 13: _context11.prev = 13; _context11.t0 = _context11["catch"](1); _iterator13.e(_context11.t0); case 16: _context11.prev = 16; _iterator13.f(); return _context11.finish(16); case 19: return _context11.abrupt("return", null); case 20: case "end": return _context11.stop(); } }, _callee9, null, [[1, 13, 16, 19]]); })); return _readFileAny.apply(this, arguments); } function readJson(_x16) { return _readJson.apply(this, arguments); } function _readJson() { _readJson = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee10(loc) { return _regenerator()["default"].wrap(function _callee10$(_context12) { while (1) switch (_context12.prev = _context12.next) { case 0: _context12.next = 2; return readJsonAndFile(loc); case 2: return _context12.abrupt("return", _context12.sent.object); case 3: case "end": return _context12.stop(); } }, _callee10); })); return _readJson.apply(this, arguments); } function readJsonAndFile(_x17) { return _readJsonAndFile.apply(this, arguments); } function _readJsonAndFile() { _readJsonAndFile = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee11(loc) { var file; return _regenerator()["default"].wrap(function _callee11$(_context13) { while (1) switch (_context13.prev = _context13.next) { case 0: _context13.next = 2; return readFile(loc); case 2: file = _context13.sent; _context13.prev = 3; return _context13.abrupt("return", { object: (0, _map()["default"])(JSON.parse(stripBOM(file))), content: file }); case 7: _context13.prev = 7; _context13.t0 = _context13["catch"](3); _context13.t0.message = "".concat(loc, ": ").concat(_context13.t0.message); throw _context13.t0; case 11: case "end": return _context13.stop(); } }, _callee11, null, [[3, 7]]); })); return _readJsonAndFile.apply(this, arguments); } function find(_x18, _x19) { return _find.apply(this, arguments); } function _find() { _find = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee12(filename, dir) { var parts, loc; return _regenerator()["default"].wrap(function _callee12$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: parts = dir.split(_path2()["default"].sep); case 1: if (!parts.length) { _context14.next = 12; break; } loc = parts.concat(filename).join(_path2()["default"].sep); _context14.next = 5; return exists(loc); case 5: if (!_context14.sent) { _context14.next = 9; break; } return _context14.abrupt("return", loc); case 9: parts.pop(); case 10: _context14.next = 1; break; case 12: return _context14.abrupt("return", false); case 13: case "end": return _context14.stop(); } }, _callee12); })); return _find.apply(this, arguments); } function symlink(_x20, _x21) { return _symlink.apply(this, arguments); } function _symlink() { _symlink = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee13(src, dest) { var stats, resolved; return _regenerator()["default"].wrap(function _callee13$(_context15) { while (1) switch (_context15.prev = _context15.next) { case 0: if (process.platform !== 'win32') { // use relative paths otherwise which will be retained if the directory is moved src = _path2()["default"].relative(_path2()["default"].dirname(dest), src); // When path.relative returns an empty string for the current directory, we should instead use // '.', which is a valid fs.symlink target. src = src || '.'; } _context15.prev = 1; _context15.next = 4; return lstat(dest); case 4: stats = _context15.sent; if (!stats.isSymbolicLink()) { _context15.next = 9; break; } resolved = dest; if (!(resolved === src)) { _context15.next = 9; break; } return _context15.abrupt("return"); case 9: _context15.next = 15; break; case 11: _context15.prev = 11; _context15.t0 = _context15["catch"](1); if (!(_context15.t0.code !== 'ENOENT')) { _context15.next = 15; break; } throw _context15.t0; case 15: _context15.next = 17; return (0, _fsNormalized().unlink)(dest); case 17: if (!(process.platform === 'win32')) { _context15.next = 22; break; } _context15.next = 20; return fsSymlink(src, dest, 'junction'); case 20: _context15.next = 24; break; case 22: _context15.next = 24; return fsSymlink(src, dest); case 24: case "end": return _context15.stop(); } }, _callee13, null, [[1, 11]]); })); return _symlink.apply(this, arguments); } function walk(_x22, _x23) { return _walk.apply(this, arguments); } function _walk() { _walk = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee14(dir, relativeDir) { var ignoreBasenames, files, filenames, _iterator14, _step14, name, relative, loc, _stat, _args16 = arguments; return _regenerator()["default"].wrap(function _callee14$(_context16) { while (1) switch (_context16.prev = _context16.next) { case 0: ignoreBasenames = _args16.length > 2 && _args16[2] !== undefined ? _args16[2] : new Set(); files = []; _context16.next = 4; return readdir(dir); case 4: filenames = _context16.sent; if (ignoreBasenames.size) { filenames = filenames.filter(function (name) { return !ignoreBasenames.has(name); }); } _iterator14 = _createForOfIteratorHelper(filenames); _context16.prev = 7; _iterator14.s(); case 9: if ((_step14 = _iterator14.n()).done) { _context16.next = 25; break; } name = _step14.value; relative = relativeDir ? _path2()["default"].join(relativeDir, name) : name; loc = _path2()["default"].join(dir, name); _context16.next = 15; return lstat(loc); case 15: _stat = _context16.sent; files.push({ relative: relative, basename: name, absolute: loc, mtime: +_stat.mtime }); if (!_stat.isDirectory()) { _context16.next = 23; break; } _context16.t0 = files; _context16.next = 21; return walk(loc, relative, ignoreBasenames); case 21: _context16.t1 = _context16.sent; files = _context16.t0.concat.call(_context16.t0, _context16.t1); case 23: _context16.next = 9; break; case 25: _context16.next = 30; break; case 27: _context16.prev = 27; _context16.t2 = _context16["catch"](7); _iterator14.e(_context16.t2); case 30: _context16.prev = 30; _iterator14.f(); return _context16.finish(30); case 33: return _context16.abrupt("return", files); case 34: case "end": return _context16.stop(); } }, _callee14, null, [[7, 27, 30, 33]]); })); return _walk.apply(this, arguments); } function getFileSizeOnDisk(_x24) { return _getFileSizeOnDisk.apply(this, arguments); } function _getFileSizeOnDisk() { _getFileSizeOnDisk = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee15(loc) { var stat, size, blockSize; return _regenerator()["default"].wrap(function _callee15$(_context17) { while (1) switch (_context17.prev = _context17.next) { case 0: _context17.next = 2; return lstat(loc); case 2: stat = _context17.sent; size = stat.size, blockSize = stat.blksize; return _context17.abrupt("return", Math.ceil(size / blockSize) * blockSize); case 5: case "end": return _context17.stop(); } }, _callee15); })); return _getFileSizeOnDisk.apply(this, arguments); } function normalizeOS(body) { return body.replace(/\r\n/g, '\n'); } var cr = '\r'.charCodeAt(0); var lf = '\n'.charCodeAt(0); function getEolFromFile(_x25) { return _getEolFromFile.apply(this, arguments); } function _getEolFromFile() { _getEolFromFile = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee16(path) { var buffer, i; return _regenerator()["default"].wrap(function _callee16$(_context18) { while (1) switch (_context18.prev = _context18.next) { case 0: _context18.next = 2; return exists(path); case 2: if (_context18.sent) { _context18.next = 4; break; } return _context18.abrupt("return", undefined); case 4: _context18.next = 6; return readFileBuffer(path); case 6: buffer = _context18.sent; i = 0; case 8: if (!(i < buffer.length)) { _context18.next = 16; break; } if (!(buffer[i] === cr)) { _context18.next = 11; break; } return _context18.abrupt("return", '\r\n'); case 11: if (!(buffer[i] === lf)) { _context18.next = 13; break; } return _context18.abrupt("return", '\n'); case 13: ++i; _context18.next = 8; break; case 16: return _context18.abrupt("return", undefined); case 17: case "end": return _context18.stop(); } }, _callee16); })); return _getEolFromFile.apply(this, arguments); } function writeFilePreservingEol(_x26, _x27) { return _writeFilePreservingEol.apply(this, arguments); } function _writeFilePreservingEol() { _writeFilePreservingEol = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee17(path, data) { var eol; return _regenerator()["default"].wrap(function _callee17$(_context19) { while (1) switch (_context19.prev = _context19.next) { case 0: _context19.next = 2; return getEolFromFile(path); case 2: _context19.t0 = _context19.sent; if (_context19.t0) { _context19.next = 5; break; } _context19.t0 = _os()["default"].EOL; case 5: eol = _context19.t0; if (eol !== '\n') { data = data.replace(/\n/g, eol); } _context19.next = 9; return writeFile(path, data); case 9: case "end": return _context19.stop(); } }, _callee17); })); return _writeFilePreservingEol.apply(this, arguments); } function hardlinksWork(_x28) { return _hardlinksWork.apply(this, arguments); } // not a strict polyfill for Node's fs.mkdtemp function _hardlinksWork() { _hardlinksWork = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee18(dir) { var filename, file, fileLink; return _regenerator()["default"].wrap(function _callee18$(_context20) { while (1) switch (_context20.prev = _context20.next) { case 0: filename = 'test-file' + Math.random(); file = _path2()["default"].join(dir, filename); fileLink = _path2()["default"].join(dir, filename + '-link'); _context20.prev = 3; _context20.next = 6; return writeFile(file, 'test'); case 6: _context20.next = 8; return link(file, fileLink); case 8: _context20.next = 13; break; case 10: _context20.prev = 10; _context20.t0 = _context20["catch"](3); return _context20.abrupt("return", false); case 13: _context20.prev = 13; _context20.next = 16; return (0, _fsNormalized().unlink)(file); case 16: _context20.next = 18; return (0, _fsNormalized().unlink)(fileLink); case 18: return _context20.finish(13); case 19: return _context20.abrupt("return", true); case 20: case "end": return _context20.stop(); } }, _callee18, null, [[3, 10, 13, 19]]); })); return _hardlinksWork.apply(this, arguments); } function makeTempDir(_x29) { return _makeTempDir.apply(this, arguments); } function _makeTempDir() { _makeTempDir = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee19(prefix) { var dir; return _regenerator()["default"].wrap(function _callee19$(_context21) { while (1) switch (_context21.prev = _context21.next) { case 0: dir = _path2()["default"].join(_os()["default"].tmpdir(), "yarn-".concat(prefix || '', "-").concat(Date.now(), "-").concat(Math.random())); _context21.next = 3; return (0, _fsNormalized().unlink)(dir); case 3: _context21.next = 5; return mkdirp(dir); case 5: return _context21.abrupt("return", dir); case 6: case "end": return _context21.stop(); } }, _callee19); })); return _makeTempDir.apply(this, arguments); } function readFirstAvailableStream(_x30) { return _readFirstAvailableStream.apply(this, arguments); } function _readFirstAvailableStream() { _readFirstAvailableStream = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee20(paths) { var _iterator15, _step15, _path, fd; return _regenerator()["default"].wrap(function _callee20$(_context22) { while (1) switch (_context22.prev = _context22.next) { case 0: _iterator15 = _createForOfIteratorHelper(paths); _context22.prev = 1; _iterator15.s(); case 3: if ((_step15 = _iterator15.n()).done) { _context22.next = 16; break; } _path = _step15.value; _context22.prev = 5; _context22.next = 8; return open(_path, 'r'); case 8: fd = _context22.sent; return _context22.abrupt("return", _fs()["default"].createReadStream(_path, { fd: fd })); case 12: _context22.prev = 12; _context22.t0 = _context22["catch"](5); case 14: _context22.next = 3; break; case 16: _context22.next = 21; break; case 18: _context22.prev = 18; _context22.t1 = _context22["catch"](1); _iterator15.e(_context22.t1); case 21: _context22.prev = 21; _iterator15.f(); return _context22.finish(21); case 24: return _context22.abrupt("return", null); case 25: case "end": return _context22.stop(); } }, _callee20, null, [[1, 18, 21, 24], [5, 12]]); })); return _readFirstAvailableStream.apply(this, arguments); } function getFirstSuitableFolder(_x31) { return _getFirstSuitableFolder.apply(this, arguments); } function _getFirstSuitableFolder() { _getFirstSuitableFolder = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee21(paths) { var mode, result, _iterator16, _step16, folder, _args23 = arguments; return _regenerator()["default"].wrap(function _callee21$(_context23) { while (1) switch (_context23.prev = _context23.next) { case 0: mode = _args23.length > 1 && _args23[1] !== undefined ? _args23[1] : constants.W_OK | constants.X_OK; result = { skipped: [], folder: null }; _iterator16 = _createForOfIteratorHelper(paths); _context23.prev = 3; _iterator16.s(); case 5: if ((_step16 = _iterator16.n()).done) { _context23.next = 21; break; } folder = _step16.value; _context23.prev = 7; _context23.next = 10; return mkdirp(folder); case 10: _context23.next = 12; return access(folder, mode); case 12: result.folder = folder; return _context23.abrupt("return", result); case 16: _context23.prev = 16; _context23.t0 = _context23["catch"](7); result.skipped.push({ error: _context23.t0, folder: folder }); case 19: _context23.next = 5; break; case 21: _context23.next = 26; break; case 23: _context23.prev = 23; _context23.t1 = _context23["catch"](3); _iterator16.e(_context23.t1); case 26: _context23.prev = 26; _iterator16.f(); return _context23.finish(26); case 29: return _context23.abrupt("return", result); case 30: case "end": return _context23.stop(); } }, _callee21, null, [[3, 23, 26, 29], [7, 16]]); })); return _getFirstSuitableFolder.apply(this, arguments); } //# sourceMappingURL=fs.js.map