UNPKG

@ardatan/relay-compiler

Version:

Fork of `relay-compiler`

278 lines (221 loc) 6.92 kB
/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails oncall+relay * * @format */ // flowlint ambiguous-object-type:error 'use strict'; var _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault'); var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator'); var _createForOfIteratorHelper2 = _interopRequireDefault( require('@babel/runtime/helpers/createForOfIteratorHelper'), ); var _defineProperty2 = _interopRequireDefault(require('@babel/runtime/helpers/defineProperty')); var fs = require('fs'); var invariant = require('invariant'); /** * A filesystem wrapper that buffers file reads and writes until `commit()` is * called. */ var BufferedFilesystem = /*#__PURE__*/ (function () { function BufferedFilesystem() { (0, _defineProperty2['default'])(this, 'buffer', new Map()); (0, _defineProperty2['default'])(this, 'committed', false); } var _proto = BufferedFilesystem.prototype; _proto._assertNotComitted = function _assertNotComitted() { !!this.committed ? process.env.NODE_ENV !== 'production' ? invariant(false, 'BufferedFilesystem: no operations allowed after commit().') : invariant(false) : void 0; }; _proto.commit = /*#__PURE__*/ (function () { var _commit = _asyncToGenerator(function* (sourceControl) { this._assertNotComitted(); this.committed = true; var removed = []; var added = []; var _iterator = (0, _createForOfIteratorHelper2['default'])(this.buffer), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done; ) { var _step$value = _step.value, path = _step$value[0], data = _step$value[1]; if (data == null) { removed.push(path); fs.unlinkSync(path); } else { var fileExisits = fs.existsSync(path); var currentData = fileExisits ? fs.readFileSync(path, 'utf8') : null; if (currentData !== data) { added.push(path); fs.writeFileSync(path, data, 'utf8'); } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (sourceControl) { yield sourceControl.addRemove(added, removed); } }); function commit(_x) { return _commit.apply(this, arguments); } return commit; })(); _proto.hasChanges = function hasChanges() { this._assertNotComitted(); return this.buffer.size > 0; }; _proto.getChangesSummary = function getChangesSummary() { this._assertNotComitted(); var added = []; var updated = []; var removed = []; var _iterator2 = (0, _createForOfIteratorHelper2['default'])(this.buffer), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) { var _step2$value = _step2.value, path = _step2$value[0], data = _step2$value[1]; if (data == null) { removed.push(path); } else { if (!fs.existsSync(path)) { added.push(path); } else { updated.push(path); } } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return [ added.length > 0 ? 'Added:\n'.concat(added.map(formatFilepath).join('')) : '', updated.length > 0 ? 'Updated:\n'.concat(updated.map(formatFilepath).join('')) : '', removed.length > 0 ? 'Removed:\n'.concat(removed.map(formatFilepath).join('')) : '', ] .filter(Boolean) .join('\n'); }; _proto.getAddedRemovedFiles = function getAddedRemovedFiles() { this._assertNotComitted(); var added = []; var removed = []; var _iterator3 = (0, _createForOfIteratorHelper2['default'])(this.buffer), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) { var _step3$value = _step3.value, path = _step3$value[0], data = _step3$value[1]; if (data == null) { removed.push(path); } else { if (!fs.existsSync(path)) { added.push(path); } } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return { added: added, removed: removed, }; }; _proto.existsSync = function existsSync(path) { this._assertNotComitted(); return this.buffer.has(path) ? Boolean(this.buffer.get(path)) : fs.existsSync(path); }; _proto.mkdirSync = function mkdirSync(path) { this._assertNotComitted(); fs.mkdirSync(path); }; _proto.readdirSync = function readdirSync(path) { this._assertNotComitted(); throw new Error('BufferedFilesystem: readdirSync is not implemented.'); }; _proto.readFileSync = function readFileSync(path, encoding) { this._assertNotComitted(); if (this.buffer.has(path)) { var data = this.buffer.get(path); !(data != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'BufferedFilesystem: trying to read deleted file.') : invariant(false) : void 0; return data; } return fs.readFileSync(path, encoding); }; _proto.statSync = function statSync(path) { this._assertNotComitted(); return fs.statSync(path); }; _proto.unlinkSync = function unlinkSync(path) { this._assertNotComitted(); this.buffer.set(path, null); }; _proto.writeFileSync = function writeFileSync(filename, data, encoding) { this._assertNotComitted(); this.buffer.set(filename, data); }; _proto.changedFilesToJSON = function changedFilesToJSON() { this._assertNotComitted(); var changed = []; var removed = []; var _iterator4 = (0, _createForOfIteratorHelper2['default'])(this.buffer), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) { var _step4$value = _step4.value, path = _step4$value[0], data = _step4$value[1]; if (data == null) { removed.push({ path: path, }); } else { changed.push({ path: path, data: data, }); } } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } return { removed: removed, changed: changed, }; }; return BufferedFilesystem; })(); function formatFilepath(filepath) { var startIndex = filepath.length - 80; var prefix = startIndex > 0 ? '\t - '.concat(filepath.substr(0, 8), '...') : '\t - '; return prefix + filepath.substr(startIndex, filepath.length) + '\n'; } module.exports = BufferedFilesystem;